SQL注入绕过技术与防御机制研究
2015-12-25宋超臣黄俊强吴琼郭轶
宋超臣, 黄俊强, 吴琼, 郭轶
(黑龙江省电子信息产品监督检验院,黑龙江哈尔滨150090)
0 引言
随着WEB应用技术的迅猛发展以及数据库在Web中的广泛应用,SQL注入已经成为WEB应用的主要攻击手段。根据OWASP TOP 10统计,注入攻击一直位于WEB威胁的榜首位置,而SQL注入攻击是注入攻击的主要方式。SQL是访问数据库所必须采用的标准语言,大多数Web应用都需要与数据库进行交互,以便生成用户需要的数据。SQL注入攻击主要是由于编程人员在开发应用程序的时候,没有对用户输入进行合法性验证或者验证规则存在漏洞,致使恶意攻击者可以使用非法输入窃取系统的敏感资料[1]。在此基础上,恶意攻击者可以通过构造特殊SQL语句执行数据库控制台命令,如果数据库安全配置不严格的话,甚至可以直接执行操作系统命令。
本文针对上述问题,根据SQL语句的执行特点,给出了三种SQL注入分类,然后讨论了通用的数据库SQL注入绕过技术和针对不同数据库的特定SQL注入绕过技术。最后,本文从源代码开发到网络架构设计等不同层面给出了SQL注入的防御技术。
本文第一节给出了SQL注入的分类ꎻ第二节给出了SQL注入的绕过技术ꎻ第三节给出了SQL注入的防御机制ꎻ第四节总结本文并指出下一步的工作。
1 SQL注入分类
当用户输入的SQL查询语句的内容或字符串转义字符没有正确地经过应用程序过滤时,就可能存在SQL注入漏洞,它将导致数据库执行非法的SQL语句,SQL注入漏洞通常在应用程序的査询接口设计不适当时发生[2]。通常Web程序中拼接完成的SQL语句如下:
通常情况下,该语句通过用户输入的author值查询作者的各种书籍,如果用户正常输入作者名称,则该语句能够正常工作,然而如果恶意人员构造以下字符串:
那么上述SQL语句则变成:
由于该语句符合SQL语句规范,则计算机程序会正确执行该语句。因为where语句中的条件为永真条件,那么该语句执行结果为所有作者的书籍列表。当用户通过构造特定的语句,就能够完成窃取数据库信息的任务,甚至执行操作系统命令或对数据库数据进行修改。
根据输入语句参数的不同,SQL注入可以分为数字型注入和字符型注入。数字型注入和字符型注入只是在注入过程中需要对单引号进行区分,实际上并无本质区别。根据返回注入结果的不同,可以分为显示注入、显错注入、盲注和二阶注入四种方法。
(1)SQL显示注入
Web应用程序直接将查询结果显示到输出页面的显示位,直接泄露数据信息。
(2)SQL显错注入
通过构造的错误SQL命令将目标信息在数据库错误信息中显示出来,从而达到窃取数据的目的。
(3)SQL盲注
SQL盲注也称为延时注入,就是根据SQL查询语句的真假,利用时间函数推迟输出或正常输出。如果Web应用程序对数据库错误信息进行过滤,不进行错误信息显示,那么,就需要利用时间函数或其他特定手段来对数据库的返回结果进行判断。在MSSQL中,使用WAITFOR DELAY函数进行延时,当查询结果为假时立即返回查询页面,当查询结果为真时延迟一定时间返回查询页面,从而对数据信息进行判断。同理,在Oracle和MySQL 5.0以上版本使用sleep()函数来实现上述功能。对于不支持延时函数的数据库,可以使用耗时操作来实现延时注入,例如BENCHMARK()函数。
(4)二阶注入
二级注入攻击是指不直接执行SQL语句命令,而是向数据库中存储恶意字符,当应用程序调用该恶意字符时,对系统进行危害。二阶注入攻击,不会直接窃取到用户数据,只有当特定条件时,威胁才会被触发,这就需要攻击者清楚数据处理流程才能利用该漏洞[3]。例如,在一个Web论坛中,存在uid为用户编号和prd为用户权限两个参数,其中uid为用户注册时输入,prd为系统分配。那么,用户在注册用户信息时uid输入为1 and rd=1--,用户在登陆系统时,执行SQL语句where id=uid and rd=prd,则实际语句将变为where id=1 and rd=1—and rd=prd,则成功绕过系统验证获取到管理员权限。
2 SQL注入检测及绕过技术
SQL注入绕过技术通常也作为SQL注入检测技术,两者之间是密不可分的。SQL注入绕过技术属于模糊测试的一种方法,只有对目标WEB应用撑血有足够了解,才能够应用模糊测试技术实现SQL注入漏洞的检测。只有了解Web应用程序中采用的防御机制,才能绕过目标系统的过滤机制实施攻击。
(1)关键字编码
针对SQL注入攻击,程序员通常采用黑名单的方式对一些关键字进行过滤,已达到防御SQL注入的目的。常见的SQL关键字有:“and”、“union”、“count”、“mid”、“insert”、“contact”、“group_concat”等。针对这种防御技术,通常可以采用UNICODE编码或ASCII编码,实现绕过。例如,可以对空格进行编码,unicode下使用%3D 代替“ =”号,同样 Select char(66,67,68)等价于Select‘BCD’。同样,在一些特殊数据库中,还存在一些特定字符的绕过技术。例如,在MySQL数据库中,使用/∗∗/代替空格字符,%26%26和and等同,||和or等同。
(2)混合编码
由于WEB应用程序区分大小写字母,而在SQL语句执行的过程时不区分大小写字母,利用这个特性,可以使用fuzzing技术生成随机大小写关键字,从而绕过黑名单达到非法攻击的目的。例如and关键字等价于And、aNd、And等等。
(3)拆分绕过
部分关键字过滤技术采取一次去除机制,例如用户输入id=1 and 1=1,应用程序对关键字and进行一次过滤,结果变为id=11=1,从而造成SQL注入语句失败,但如果用户输入id=1 anandd 1=1,同样应用程序对and进行一次过滤,输出结果变为id=1 and 1=1,从而可以正确执行SQL注入攻击。
可以通过以上技术绕过SQL的防御技术,实施SQL注入攻击。根据以上规则,通过模糊测试系统,生成测试用例,实现SQL注入漏洞的检测。
3 SQL注入防御机制
针对前文提到的绕过技术,可以在代码层面和网络架构层面两方面来防御SQL注入攻击。在代码层面主要使用参数化查询、黑白名单过滤、字符编码等方法。在网络架构层面,主要使用Web应用防火墙、数据库防火墙等设备,并在操作系统和数据库系统层面进行安全配置。
(1)参数化查询
通常SQL查询语句直接被当做字符串送到数据库中执行,这样容易产生SQL注入漏洞。为对这一缺点进行改进,现在编程语句和数据库借口都允许程序员使用参数来创建SQL查询语句,代替直接使用用户输入,使用它来代替动态查询[4]。参数化查询先指定查询结构,为用户输入的每个数据预留占位符,再指定每个占位符的内容,这样做可有效防止SQL注入[3]。但是,编写参数化查询比构造简单的SQL动态查询语句要花费更多的时间和精力,许多程序员往往仅注意由用户直接提交的输入,致使二阶SQL注入攻击很容易被忽略。这种方式可能会向数据库传递不安全的参数,如果数据库函数调用实在存储过程中使用动态SQL语句,那还是会产生SQL注入漏洞。
(2)黑白名单过滤
黑白名单过滤主要就是对用户输入进行验证,以确定其是否遵循数据输入规则,通常可以使用参数类型验证、正则表达式或业务逻辑等验证[5]。白名单验证就是只接受己知的不存在威胁的用户输入,涉及到在接受输入之前先验证输入是否满足期望的类型,长度或大小,数值范围以及其他格式标准[6]。虽然白名单可以有效地降低SQL注入威胁,但由于在复杂SQL查询中,白名单不能够对所以不必要关键字或规则进行过滤,导致正常查询不能成功进行,所以其应用受到一定的限制。黑名单是指对用户输入进行检测,一旦发现名单中的关键字或规则,则拒绝该查询。该方法效率较高,但由于黑名单不能够覆盖所有不合规格字符串,所以仍然存在一定的风险。
(3)编码输出
由于黑白名单过滤机制具有一定的局限性,那么当数据在不同模块间进行传输时,为了进一步防止SQL注入攻击,应对传递的数据内容进行编码,尤其是未经过严格验证的数据或第三方数据。对传输的数据进行编码,可以消除特定字符带来影响,使其成为正常SQL语句,从而消除SQL注入攻击。但这种方法在应用过程中,必须对所有关键字进行编码,一旦某个值没有编码,则应用程序仍然容易受到SQL注入攻击。
(4)合理权限配置
对数据库应用程序不同账户间使用不同权限,仅赋予该账户完成必须工作所需要的权限。例如,一个查询程序不需要执行、插入、更新等操作,查询仓库数量的账户不应具有查看管理员表的权限。通过必要的账户权限配置和数据库安全配置,可以极大的减少SQL注入带来的各种风险。
(5)WEB应用防火墙
目前,WEB应用防火墙已经到得到广泛的应用,WEB客户端提交至服务器端时,先经过WEB应用防火墙进行检测。如含有特殊字符则将参数提交给具体的页面处理,发现SQL注入参数后,便将请求丢弃。通过这种方法可以有效地防止SQL注入攻击,对于开发完成网站即使存在SQL注入漏洞,也可以使用WEB应用防火墙进行防护。
通常采用一种技术很难在根本上避免SQL注入攻击,这就要求各系统运维单位要在网络架构、服务器安全配置、软件检测等多方面进行防护。首先,在新WEB系统正式运行前,通过专业扫描工具,对软件安全漏洞进行检测,从根本上尽量减少SQL注入攻击。其次,对操作系统和数据库进行合理的权限配置,减轻SQL注入攻击带来的危害,提高网络攻击难度。最后,通过部署必要的安全设备,对提交至WEB服务器的数据进行检查,消除SQL注入攻击。只有通过全方位的防护才能从根本上保障WEB安全。
4 结语
针对目前危害WEB安全的第一要素SQL注入攻击,本文给出了其分类方法,并对SQL注入绕过技术进行分析,对每种绕过方法举出构造规则,通过该规则可以使用fuzzing技术对SQL注入漏洞进行检测。最后,针对SQL注入绕过技术,从网络层面和代码层面给出了SQL注入的防御机制。
在未来工作中,需要针对WEB页面的特殊编码规则研究SQL注入绕过及检测技术,并根据相关规则构造SQL注入检测分析与防御系统。
[1] 王溢,李舟军,郭涛.防御代码注入式攻击的字面值污染方法[J].计算机研究与发展,2012,49(11):2414-2423.
[2] 周淡.SQL注入检测方法的研究与实现[D].西安:西北大学,2011.
[3] 练坤梅,许静,田伟.SQL注入漏洞多等级检测方法研究[J].计算机科学与探索,2011,5(05):474-480.
[4] 冯谷,高鹏.新型SQL注入技术研究与分析[J].计算机科学,2012, 11(39):415-423.
[5] 周敬利,王晓锋,余胜生等.一种新的反SQL注入策略的研究与实现[J].计算机科学,2006, 11(33):64-68.
[6] 陈小兵,张汉煌,骆力明.SQL注入攻击及其防范检测技术研究[J].计算机工程与应用,2007,43(11):150-152.