首页 谈Sql注入式攻击的典型手法和检测防范措施

谈Sql注入式攻击的典型手法和检测防范措施

举报
开通vip

谈Sql注入式攻击的典型手法和检测防范措施 谈 Sql 注入式攻击的典型手法和检测防范措施 陈运栋α   摘 要 本文通过对目前最流行的网站入侵方式- - - Sql 注入式攻击的常用攻击方法做了逐一的分析, 并针对每种 攻击方法提出了检测和防范的措施, 文章内还包括详尽的网 站源代码分析, 改进算法的源代码, 以及攻击, 检测工具的截 屏说明。 关键词 Sql 注入 脚本攻击 网站安全 数据库安全  代码安全性 Sql 注入 (Sql In ject ion) 攻击是目前网上最流行最热门的 黑客脚本攻击方法之一, 那什么是 Sql 注入式攻击呢? ...

谈Sql注入式攻击的典型手法和检测防范措施
谈 Sql 注入式攻击的典型手法和检测防范措施 陈运栋α   摘 要 本文通过对目前最流行的网站入侵方式- - - Sql 注入式攻击的常用攻击方法做了逐一的分析, 并针对每种 攻击方法提出了检测和防范的措施, 文章内还包括详尽的网 站源代码分析, 改进算法的源代码, 以及攻击, 检测工具的截 屏说明。 关键词 Sql 注入 脚本攻击 网站安全 数据库安全  代码安全性 Sql 注入 (Sql In ject ion) 攻击是目前网上最流行最热门的 黑客脚本攻击方法之一, 那什么是 Sql 注入式攻击呢? 它是指 黑客利用一些W eb 应用程序 (论坛, 留言本, 文章发布系统) 中某些疏于防范的用户可以提交或修改的数据的页面, 精心 构造 Sql 语句, 把特殊的 SQL 指令语句插入到系统实际 SQL 语句中并执行它, 以获取用户密码等敏感信息, 以及获取主机 控制权限的攻击方法。 一、常见的 SQL 注入式攻击过程 1. 绕过网站的身份认证 一个登陆界面, 需要输入用户名和密码, 然后 Po st 到另 一个页面, 进行身份认证, 此时进行身份认证的代码如下: u sernam e= R equest. fo rm ("usernam e") passw o rd= R equest. fo rm ("passw o rd") sql= " select 3 from adm in w here usernam e= ’" & use2 nam e & ’ and passw o rd= ’" & passw o rd & "’" rs. open sql, conn, 0, 3 if no t rs. eof then session (" login" ) = true R esponse. redirect ("nex t. asp " ) end if 从上面的代码中可以看出, 程序在得到用户的数据之后, 没有进行任何的过滤和处理, 直接用来构成 SQL 语句, 其危 险性是最高的, 攻击者只要根据 SQL 语句的编写规则就可以 跳过身份认证, 方法如下: 攻击者只需在用户名和密码的输入框中都输入" ’o r ’1’= ’1"的内容, 那么攻击者就可以不经过不任何认证而直接进入 nex t. asp 页面, 并拥有和正常登陆用户一样的全部特权. 原因 是什么呢? 我们比较一下正常用户登陆和攻击者登陆时的两 句 SQL 语句: (1)正常用户 (用户名为 grace, 密码为 1111) : sql= " select 3 from adm in w here usernam e = ’grace’ and passw o rd= ’1111’ (2)攻击者 (用户名和密码都为"’ o r ’1’= ’1") : sql= " select 3 from adm in w here usernam e= ’’o r ’1’= ’1’and passw o rd= ’’ o r ’1’= ’1’ 可以看到由 and 连接的两个条件都被一个永远成立的 ’1’= ’1’ 所代替, 执行的结果为真, 因此服务器也会认为条件 成立, 于是把 login 标志设为 t rue, 让攻击者以合法身份登陆 进入 nex t. asp 页面。 解决的办法: 其实解决的办法很简单, 有两种解决的办法, 通用的办法 是对用户提交的数据先进行过滤, 把单引号和双引号全部过 滤掉, 再进行 SQL 语句的构造, 这样就大大降低了攻击者成 功的概率, 具体代码如下: u sernam e = R ep lace (R equest. fo rm ( " usernam e ") , " ’" , "") passw o rd = R ep lace (R equest. fo rm ( " passw o rd ") , " ’" , "") sql= " select 3 from adm in w here usernam e= ’" & use2 nam e & ’ and passw o rd= ’" & passw o rd & "’" rs. open sql, conn, 0, 3 if no t rs. eof then session (" login" ) = true R esponse. redirect ("nex t. asp " ) end if 第二种办法是把一句 SQL 查询分为两句写, 先通过用户 名判断数据库中是否存在该用户, 如果不存在, 直接退回登陆 界面, 如果存在, 再进行密码的校验工作, 具体代码如下: u sernam e= R equest. fo rm ("usernam e") passw o rd= R equest. fo rm ("passw o rd") sql= " select 3 from adm in w here usernam e= ’" & use2 nam e & "’" rs. open sql, conn, 0, 3 if rs. eof then ·31· M icrocom puter Appl ica tion s Vol. 20, No. 9, 2004      研究与设计      微型电脑应用     2004 年第 20 卷第 9 期 α 陈运栋 上海交通大学信息安全学院 工程硕士 上海 200030   R esponse. redirect (" login. asp " ) E lse if R s ("passw o rd") = passw o rd then R esponse. redirect ("nex t. asp " ) end if end if 2. 对数据库系统进行读取、插入、修改等操作 如一个商品查询页面 findp roduct. asp ? id= 1, 程序设计 者原本设计意图是显示 id 为 1 的商品信息, 而攻击者利用程 序中没有对 id 的内容进行检查之机, 插入自己的代码。 从 findp roduct. asp 中摘录两句最关键的语句: sql= " select 3 from p roduct w here p roductid= ’" & re2 quest (" id" ) & "’" rs. open sql, conn, 0, 3 可以看到, id 没有进行任何的处理, 直接构成 SQL 语句 并执行, 而攻击者在知道该系统的数据库中 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 及表中字段名 称的情况下 (目前网上免费的论坛系统或是商业网站代码非 常多) , 利用 SQL 语句特性 (分号是将两句 SQL 语句分开的 符号) , 直接向数据库中添加记录: findp roduct. asp ? id= 1; In sert in to "adm in" (’u sernam e’, ’passw o rd’, ’type’) values (’hacker’, ’pass123456’, ’ 管理员 ’) , 然后攻击者就可以直接用刚才建立的帐户进行登陆了。通 过这样的方法, 攻击者还可以对系统做任何的事情, 包括增加ö修改ö删除记录。 解决的办法也很简单, 只要对 id 的值先对象"; "等危险 字符进行类型识别 (比如为数值类型) , 并做过滤和验证后, 再 构造 SQL 语句即可, 具体的过滤函数请见后面通用的检测方 法。 3. 执行系统命令 如果W eb 主机使用M SSQL 数据库系统, 而 list. asp 中 存在注入点, 那么攻击者就可以用到 xp _ cm dshell 这个扩展 存储过程, xp _ cm dshell 是一个非常有用的扩展存储过程, 用 于执行系统命令, 比如 dir, net 等, 攻击者可以根据程序的不 同, 提交不同的语句: h t tp: ööwww. XXX. com ölist. asp ? id= 1; ? exec? m aster. dbo. xp _ cm dshell? ’dir’ h t tp: ööwww. XXX. com ölist. asp ? id= 1; ? exec?m aster. . xp _ cm dshell? ’dir’ 或者可以插入下面的语句 net u ser hacker öadd net localgroup adm in istra to rs hacker öadd 来向W eb 主机系统中加入一个非法的管理员帐号, 不过 这样的做法必须同时满足几个条件, 首先A SP 使用的 SQL SERV ER 帐号必须是管理员, 其次请求的提交变量在整个 SQL 语句的最后, 否则构造出来的 SQL 语句在语法上是错误 的, 也就不可能执行成功。 二、对 Sql 注入式攻击的检测 最好的办法不是亡羊补牢, 而是未雨绸缪, 因此在网站完 成之后, 对于不同的情况应该采取不同的措施。 1. 网站代码全部重新开发的情况 对于关键的页面, 应由其它人以攻击者的角度试图入侵, 或者仔细阅读源代码, 查看在变量的过程和数据完整性的保 护方面是否到位, 这时提供一个我自己编写的检测外来变量 是否包含"危险字符"的函数供大家参考, 代码如下: ‘检测危险字符的函数 ‘输入参数是 T estString, 即需要检测的内容 ‘另一个输入参数是 IsN um ber, 表明是否数值型 ‘输出参数, 如果返回" true" , 则说明包含有危险字符, 如 果 返 回 " false " , 则 表 明 正 常 Function D angerousChar (T estSstring) If In str (T estString, " , " ) o r In str (T estString, " ’" ) o r In2 str ( T estString, "% ") o r In str ( T estString, "; " ) o r In str ( T estString, ch r ( 33) ) o r In str ( T estString, " ") o r In str (T estString, " 3 " ) o r In str (T estString, "ö" ) o r In str (T est2 String, "”) o r In str (T estString, " - ") o r In str (T estString, " + ") then D angerousChar= " true" Ex it funct ion End if If IsN um ber= 1 then If IsN um beric (T estString) = False then D angerousChar= "T rue" Ex it Function End if End if D angerousChar= "False" End Function 2. 直接下载网上的免费论坛或商业网站的情况 应在向外界开放使用前, 对数据库名、关键的表名、字段 名一定要重新改名, 并对管理用网页改名, 可以在适当程度上 降低攻击者成功执行 SQL 代码的可能性。 3. 对整个网站中的关键代码进行一次是否存在 Sql 注入 式攻击可能的检测, 我们可以使用专用的 Sql in ject ion 漏洞扫 描器 sqlacs. exe, 它能扫描网站页面中存在有 Sql 注入攻击 点, 还能自动识别程序员设定的陷阱, 使用时非常方便快捷, 下载的网址是: h t tp: ööwww. qiker. com ösoftö1972. h tm , 使用 过程如图 1。 ·41· M icrocom puter Appl ica tion s Vol. 20, No. 9, 2004      研究与设计      微型电脑应用     2004 年第 20 卷第 9 期 三、通用的防止 Sql 注入式攻击的方法 (1) 对于动态构造 SQL 查询的场合, 可以使用下面的技 术: 第一: 替换单引号, 即把所有单独出现的单引号改成两个 单引号, 防止攻击者修改 SQL 命令的含义。再来看前面的例 子, " SEL ECT 3 from adm in W H ER E usernam e = o r 1= 1 AND passw o rd = o r 1= 1"显然会得到与"SEL ECT 3 from U sers W H ER E login = ’’ o r ’1’= ’1’ AND passw o rd = ’’ o r ’1’= ’1’"不同的结果。 图 1 Sql in ject ion 漏洞扫描器 (SqlA cs)的使用界面 第二: 删除用户输入内容中的所有连字符, 防止攻击者构 造出类如"SEL ECT 3 from U sersW H ER E login = m as - - AND passw o rd = "之类的查询, 因为这类查询的后半部分 已经被注释掉, 不再有效, 攻击者只要知道一个合法的用户登 录名称, 根本不需要知道用户的密码就可以顺利获得访问权 限。 第三: 对于用来执行查询的数据库帐户, 限制其权限。用 不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了 不同帐户可执行的操作, 因而也就防止了原本用于执行 SE2 L ECT 命令的地方却被用于执行 IN SER T、U PDA T E 或 D EL ET E 命令。 (2)用存储过程来执行所有的查询。SQL 参数的传递方 式将防止攻击者利用单引号和连字符实施攻击。此外, 它还使 得数据库权限可以限制到只允许特定的存储过程执行, 所有 的用户输入必须遵从被调用的存储过程的安全上下文, 这样 就很难再发生注入式攻击了。 (3)限制表单或查询字符串输入的长度。如果用户的登录 名字最多只有 10 个字符, 那么不要认可表单中输入的 10 个 以上的字符, 这将大大增加攻击者在 SQL 命令中插入有害代 码的难度。 (4)检查用户输入的合法性, 确信输入的内容只包含合法 的数据。数据检查应当在客户端和服务器端都执行- - 之所 以要执行服务器端验证, 是为了弥补客户端验证机制脆弱的 安全性。 在客户端, 攻击者完全有可能获得网页的源代码, 修改验 证合法性的脚本 (或者直接删除脚本) , 然后将非法内容通过 修改后的表单提交给服务器。因此, 要保证验证操作确实已经 执行, 唯一的办法就是在服务器端也执行验证。你可以使用许 多内建的验证对象, 例如R egu larExp ressionV alidato r, 它们能 够自动生成验证用的客户端脚本, 当然你也可以插入服务器 端的方法调用。如果找不到现成的验证对象, 你可以通过 CustomV alidato r 自己创建一个。 (5) 将用户登录名称、密码等数据加密保存。加密用户输 入的数据, 然后再将它与数据库中保存的数据比较, 这相当于 对用户输入的数据进行了"消毒"处理, 用户输入的数据不再 对数据库有任何特殊的意义, 从而也就防止了攻击者注入 SQL 命令。System. W eb. Secu rity. Fo rm sA uthen ticat ion 类有 一个 H ashPassw o rdFo rSto ring InConfigF ile, 非常适合于对输 入数据进行消毒处理。 (6)检查提取数据的查询所返回的记录数量。如果程序只 要求返回一个记录, 但实际返回的记录却超过一行, 那就当作 出错处理。 限于篇幅, 以上就 SQL 注入式攻击的典型使用类型, 检 测和防范方法做了一个简要的介绍, 如果想更加详尽地了解 如何保障W eb 主机的安全性方面的问题, 请看我的论文< < 中小企业商务网站的安全性分析及安全性优化措施> > 。 参考文献 [ 1 ] Sim son Garfinkel, Gene Spaffo rd, < < W eb 安全与电子 商务 (第二版) (影印版) > > , 清华大学出版社, 2002 年 11 月 [ 2 ] 张炯明, < < 安全电子商务实用技术> > , 清华大学出版 社, 2002 年 4 月 [3 ] [美 ]微软公司著 詹文军、王新程译, < < A SP. N ET 安全 应用程序开发> > , 清华大学出版社, 2003 年 8 月 [ 4 ] RU SS BA S IU RA 等著 王晓娜 黄开枝译, < < A SP. N ET 安全性高级编程> > , 清华大学出版社, 2003 年 4 月 [ 5 ] 风清扬, < < 黑客防线> > 总第 37、38 期中的< < 脚本 攻击防范策略安全篇 (上)、(下) > > , < < 黑客防线> > 出版社, 2004 年 2 月 (收稿日期: 2004 年 3 月 10 日) ·51· M icrocom puter Appl ica tion s Vol. 20, No. 9, 2004      研究与设计      微型电脑应用     2004 年第 20 卷第 9 期
本文档为【谈Sql注入式攻击的典型手法和检测防范措施】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_071351
暂无简介~
格式:pdf
大小:276KB
软件:PDF阅读器
页数:4
分类:互联网
上传时间:2010-01-01
浏览量:36