SQL注入攻击与防御技术白皮书
关键词:SQL注入,SQL语句,特征识别
摘 要:SQL注入攻击是一种比较常见的针对数据库的漏洞攻击方式。本文对该攻击的原理和方式,结合示例进行了说明,并介绍了H3C安全产品对于此类漏洞的防御措施及策略。
缩略语:
缩略语 | 英文全名 | 中文解释 |
SQL | Structured Query Language | 结构化查询语言 |
IPS | Intrusion Prevention System | 入侵防护系统 |
URL | Uniform Resource Locator | 统一资源定位符 |
目 录
结构化查询语言SQL是用来和关系数据库进行交互的文本语言。它允许用户对数据进行有效的管理,包含了对数据的查询、操作、定义和控制等几个方面,例如向数据库写入、插入数据,从数据库读取数据等。
关系数据库广泛应用于网站中,用户一般通过动态网页和数据库间接进行交互。
常见的动态网页一般都通过形如“http://domain-name/page.asp?arg=value”等带有参数的URL来访问。动态网页可以是asp、php、jsp或perl等类型。一个动态网页中可以有一个或多个参数,参数类型也可能是整型或字符串型等。
安全性考虑不周的网站应用程序(动态网页)使得攻击者能够构造并提交恶意URL,将特殊构造的SQL语句插入到提交的参数中,在和关系数据库进行交互时获得私密信息,或者直接篡改Web数据,这就是所谓的SQL注入攻击。
SQL注入攻击的主要方式是构造巧妙的SQL语句,和网页提交的内容结合起来进行注入攻击。比较常用的技巧有使用注释符号、恒等式(如1=1)、使用union语句进行联合查询、使用insert或update语句插入或修改数据等。此外还可以利用一些内置函数辅助攻击,如使用phpinfo函数显示基本信息,char函数规避单引号等。下面结合具体例子介绍几种简单的构造方法。
在关系数据库中,数据通常是以表的方式存储。假设存在一个名为user的表格,包含有id、username、pwd和level四个列,分别表示了用户ID、用户名、密码和权限等级。表1中列举了几种简单的构造方法,其中出现的“$username”和“$password”等字符串为变量名称。
语句 | 说明 |
正常语句:SELECT * FROM user WHERE username = '$username' AND pwd = '$password' 注入语句:SELECT * FROM user WHERE username = 'tom'/*' AND pwd = '' | 这条语句后面的内容“AND pwd = ''”因为前面出现的“/*”而被数据库当作是注释的内容直接忽略掉(MySQL中采用/*作为注释),这样攻击者就可以不提交密码的内容而直接登录 |
正常语句:SELECT * FROM user WHERE username = '$username' AND pwd = '$password' 注入语句:SELECT * FROM user WHERE username = 'tom' AND pwd = '' or '1=1' | 这条语句利用了1=1这个恒等式作为逻辑判断,使得即使后面的pwd判断为假,该语句依然能够得到正确的执行,攻击者不使用密码而成功登录 |
正常语句:UPDATE user SET pwd = '$password' WHERE username = '$username' 注入语句:UPDATE user SET pwd = 'abcd',level='3' WHERE username = 'tom' | 这条语句利用pwd后面的单引号以及后续的WHERE语句,不仅修改了密码,还通过修改level为3成为高权限用户 |
正常语句:SELECT * FROM user WHERE username = '$username' 注入语句:SELECT * FROM user WHERE username = 'tom' AND LEFT(pwd,1)='l' | 这条语句利用内置函数来判断字符串中某个位置的字符,如果成功则显示出用户ID。这样反复的尝试下去,便会得到真正的密码 |
正常语句:SELECT * FROM user WHERE username = '$username' AND pwd = '$password' 注入语句:SELECT * FROM user WHERE username = 'tom' into outfile 'd:/http root/file001.txt'/*' AND pwd = '' | 这条语句到相关路径下去寻找文件,其中的内容就是tom这个用户的相关信息 |
正常语句:INSERT INTO user VALUES('$id', '$username', '$password', '1') 注入语句:INSERT INTO user VALUES('10', 'tom', 'password','3')/*', '1') | 这条语句新插入了一个ID为10的用户tom,并将其权限直接设定为最高的3,这种攻击方式可以用来通过漏洞注册高权限用户 |
以上给出的攻击方式是构造SQL语句技巧中较为简单和常见的方式,这里给出一个实际网络中的例子,形象的说明SQL注入攻击的发生及其危害。
图1所示的是某开源校友录网站的界面。正常情况下,如果在下拉框中选择某个年份,页面会显示出该年份毕业生的相关信息,此时Web页面的地址栏中的URL为:
http://domain-name/Analysis/Project/index.php?act=view&year=2005
实际上,在对年份进行处理的代码没有对用户提交的数据进行有效过滤,导致存在一个SQL注入攻击漏洞。攻击者通过构造特殊的SQL语句提交给Web,会使得Web页面显示来自于内部数据库中的相关内容。这里模拟攻击者的做法,在Web的地址栏中提交一个混合了SQL语句的URL。代码在执行该语句时对提交的变量内容未作合适的判断,导致SQL注入攻击得以成功。
假设提交的语句如下:
http://domain-name/Analysis/Project/index.php?act=view&year=2005'%20union%20select%201,1,1,alumniUserName,1,alumniPassword,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20alumni_users%20where%20ID='1
表2对该URL做了详细的解释。
表2 URL内容说明
内容 | 说明 |
http://127.0.0.1/Analysis/Project/index.php?act=view&year=2005 | 正常情况下的URL 其中的“year=2005”的部分在代码中是作为SQL语句查询条件而执行的。形如“select * from table where year=2005” |
union | 攻击者添加的内容 使得添加的整个部分都正常执行,而不会在server数据库中产生错误 |
select%201,1,1,alumniUserName,1,alumniPassword,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20alumni_users%20where%20ID='1 | 攻击者添加的内容 在alumni_users表中提取出密码信息并显示 |
%20 | 空格 |
正常情况下返回的页面会显示毕业生的用户名以及相关信息,而这里将密码作为select语句的选择列,会在返回页面中显示出用户的密码。
提交攻击语句后,页面返回的内容如图2所示。
可以看到,页面除了返回用户的用户名及电子邮箱地址,还返回了经过加密的密码信息。
实际上,通过将注入攻击中的“1”修改为表中相应的列名称,Web页面还会返回表中其他列的内容,这会使得更多的私人信息得以外泄。
从前述的简介可以看出,只要是带有参数的动态网页,且此网页访问了数据库,就有可能存在SQL注入攻击,因此SQL注入攻击潜在的发生概率相对于其他Web攻击要高很多,危害面也更广。其主要危害包括:获取系统控制权、未经授权状况下操作数据库的数据、恶意篡改网页内容、私自添加系统帐号或数据库使用者帐号等。
目前基于数据库的网络应用越来越多。与此同时,用于搜索SQL注入点的软件在网络上随处可见,攻击者只需要具备少量的专业知识就可以利用这些软件寻找目标进行攻击。攻击目标和攻击者的增加使得SQL注入攻击在近几年出现扩大的趋势。
H3C通过对SQL注入攻击分析,发现这类攻击主要采用如下几种方式:
l 通过一些常用的SQL注入语句,对网站进行SQL注入攻击。
l 根据Web后台数据库本身的特点,对网站进行SQL注入攻击。
l 使用SQL注入扫描工具,对网站进行SQL注入攻击。
根据上述特点,H3C开发出了一套完整的SQL注入攻击防御框架,能够及时发现各种已经暴露的和潜在的SQL注入攻击。H3C IPS设备对于SQL注入攻击的总体防御框架如图3所示。
图3 SQL注入攻击防御框架
H3C IPS设备采用基于特征识别的方式识别并阻断各种攻击。设备有一个完整的特征库,并可定期对特征库进行升级。当网络流量进入设备后,设备会检测流量与当前特征库的攻击特征是否匹配。如果匹配,则阻断网络流量并上报日志;否则,网络流量可以顺利通过。
根据SQL注入攻击的特点,H3C IPS特征库可以从如下几个方面对SQL注入攻击特征进行识别:
攻击者在进行SQL注入攻击时,都会在URL中携带一些异常字段,如“and 1=1”。通过识别这些异常字段,检验网站是否存在SQL注入漏洞、获取数据库信息等。
目前,网站中主要使用的数据库有:MS-SQL、Access、MySQL、Oracle。每个数据库都有一些系统表,记录整个数据库信息。此外,一些数据库还有一些额外的功能可以导致SQL注入攻击。如:MS-SQL数据库可以执行系统命令;MySQL数据库可以将整个数据库信息导出到一个文件中;Oracle数据库可以将数据库信息反射到任意监听端口。
通过对上述数据库的深入分析,根据各个数据库自身的特点,提取了URL中出现的异常字段,确保攻击者无法通过数据库自身携带的特性进行SQL注入攻击。
在实际的攻击中,攻击者通常使用SQL注入扫描工具对网站进行自动化扫描,探测网站是否存在可以利用的SQL注入漏洞。H3C通过对知名的SQL注入扫描工具进行分析,研究出了这些工具的行为和方法,阻断其对网站的扫描探测。
由于网站的开发人员对一些输入参数没有进行严格检测,在实际环境中,存在的漏洞也非常多。一些大的知名漏洞发布网站发布了大量的SQL注入漏洞。通过分析、总结这些漏洞,确保攻击者无法通过已经公布的SQL注入漏洞进行攻击。
H3C IPS设备的SQL注入攻击防御框架有如下几个优点:
H3C针对SQL语言自身的特点,考虑到已知各种攻击的基本原理和形态,结合不同数据库的类型及SQL注入扫描工具,在各个不同漏洞模型之上开发出了通用的、层次化的SQL注入攻击检测模型,并融合到特征库中。这些模型抽象出SQL注入攻击的一般形态,对主流的攻击能够准确识别,构成了一个完整的SQL注入检测模型,使得模型通用化。
H3C通过模拟真实的网络环境,进行了大量的攻防测试,并整理、验证了近几年公布的SQL注入漏洞攻击,使用H3C IPS设备可以识别并且阻断所有这些已公布的攻击。
在实际攻击中,攻击者为了逃避防攻击设备的检测,经常对SQL注入攻击进行变形,如采用URL编码技术、修改参数等。H3C根据SQL注入漏洞发生的原理、攻击方式和攻击目标,对SQL注入攻击特征进行了扩展。即使攻击者修改注入参数、格式、语句等内容,相同漏洞原理下各种变形的攻击同样能够被有效阻断。这使得设备的防御范围扩大,防御的灵活性也显著增强,极大的减少了漏报情况的出现。
随着SQL注入攻击出现的频率日益增高,其危害有逐步扩展的趋势。这就对IPS设备在防御的深度和广度上提出了更高的要求,不仅要能够防御已有的SQL注入攻击,更要有效的阻止最新出现的、未公布的攻击。
目前,H3C已经建立起一套完整的攻防试验环境,可以及时发现潜在的SQL注入漏洞。同时,H3C还在继续跟踪最新的SQL注入攻击技术和工具,及时更新SQL注入攻击的特征库,第一时间发布最新的SQL注入应对措施,确保用户的网络不受到SQL注入攻击。
稳定有效的特征库为SQL注入攻击的防御提供了强有力的支撑。在实际的部署中,H3C IPS设备对网络流量进行分析和识别。如果流量中存在的特征能够匹配到SQL注入攻击的防御策略,则相关流量被阻断,根据不同的特征类型和严重级别上报日志,以便网络管理员能够了解准确的攻击信息。如果流量没有匹配到攻击模型,则允许流量通过,不会妨碍正常的网络业务,在准确防御的同时保证了设备的高效运行。
H3C IPS设备SQL注入防御的典型组网如图4所示。
图4 SQL注入防御典型组网图
一般情况下,受到攻击的网站都分为前台应用程序和后台数据库两个部分,前者用来和用户以及数据库进行交互,后者用来存储数据。SQL注入攻击一般就是利用前台应用程序内的漏洞,直接和后台数据库交互以获取信息。因此,IPS设备需要部署在网站内部网络的出口,即前台应用程序之外,以确保数据库信息的安全。
Copyright ©2009 杭州华三通信技术有限公司 版权所有,保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
本文档中的信息可能变动,恕不另行通知。