一种二阶SQL注入攻击防御方法

2019-08-10 06:36陈龙严云洋朱全银
电脑知识与技术 2019年17期
关键词:代理服务器数据库

陈龙 严云洋 朱全银

摘要:SQL注入攻击已经成为Web应用程序最大的安全威胁。二阶SQL注入危害性大,注入点隐秘性高,注入过程复杂,不易检测。二阶SQL注入的攻击载荷来自数据库,针对这一特性,提出在Web服务器和数据库服务器之间添加代理服务器,代理服务器通过Lua脚本监控和修改Web服务器和数据库服务器之间的通讯数据,处理危险数据,保障二次调用的数据安全。对代理服务器的监控和数据修改功能进行改写,添加数据安全处理模块,对来自数据库的数据集中的敏感字符查找替换,将处理过的“安全”数据返回Web服务器,以防御二阶注入漏洞。实验证明,该系统能有效地防御二阶SQL注入,部署方便,成本较低。

关键词:二阶SQL注入;攻击载荷;数据库;代理服务器;敏感字符

中图分类号:TK 8        文献标识码:A

文章编号:1009-3044(2019)17-0005-04s

开放科学(资源服务)标识码(OSID):

Abstract: SQL injection attacks have become the biggest security threat for Web applications. Second-order SQL injection has great harm, high privacy of injection points, complicated injection process, and is difficult to detect. The attack load of second-order SQL injection comes from the database. For this feature, a proxy server is added between the Web server and the database server. The proxy server monitors and modifies the communication data between the Web server and the database server through the Lua script. Rewrite the proxy server's monitoring and data modification functions, add a data security processing module, search for and replace sensitive characters in the data set from the database, and return the processed "safe" data to the Web server to prevent second-order injection vulnerabilities. Experiments show that the system can effectively defend against second-order SQL injection, which is convenient to deploy and lower in cost.

Key words: second-order SQL injection; attack payload; database; proxy server; sensitive characters

1 引言

随着互联网的高速发展,基于Internet的Web应用程序和服务变得原来越普及。绝大多数的信息系统和商业应用都使用Web应用程序来提供服务。与此同时,Web应用程序的漏洞出现频率也随之增高。SQL注入是一种利用Web程序数据安全漏洞的代码注入技术。在2017年OWASP(开放式Web应用程序安全项目)发布的Web安全漏洞Top10中,SQL注入漏洞占据首位,可见SQL注入危害性之高[1]。近些年,许多专家和学者在SQL注入技术和防御技术上做了大量研究,但是大多数的研究都是针对一阶SQL注入[2-7],针对二阶注入的研究较少。二阶SQL注入技术是在传统一阶SQL注入技术基础上进行扩展,漏洞形成更加隐蔽,漏洞威胁与一阶SQL注入威胁不相上下。乐德广等[8]提出一种基于二阶分片重组盲目注入的新型攻击模式。 首先通过分片的方式把 SQL盲目注入攻击载荷拆分成多个片段存到数据库中,然后在触发攻击阶段重组这些片段,并实施SQL注入攻击。Chen Ping[9]提出基于指令集的随机二阶注入攻击检测,该方法将Web应用程序中包含的可信SQL关键字随机地动态构建新的SQL指令集,并在DBMS之前添加代理服务器,代理检测接收到的SQL指令是否包含查找攻击行为的标准SQL关键字。但是该方法对于未添加SQL关键字的污染数据,检测效果并不理想。

本文采用添加数据库代理服务器的方式,在数据库服务器与Web服务器之间设置危险数据处理模块,对敏感字符集进行查找替换,保障来自数据库服务器的数据安全,防御二阶SQL注入。

2 SQL注入技术

2.1 一阶SQL注入

一阶SQL注入是指用户提交的数据中带有攻击载荷,程序将该数据拼接到应用程序构造的动态SQL语句中,该语句符合数据库的语法规则,将该SQL语句送入相应的数据库中,数据库执行后形成非“本意”的信息泄露或更改的技术[10]。图1显示了一阶SQL注入的攻击操作流程。

以上语句通过攻击载荷中的“”将条件语的“password”閉合为空,使用“or 1=1;”这个恒成立的逻辑语句进行拼接,并使用“-- +”来注释掉原语句中的“;”形成完整的SQL语句。所以Web服务器将该语句送入数据库中,数据库执行攻击载荷,在没有验证密码的情况下将“admin”用户的所有信息都返回给客户端,从而出现了SQL注入。SQL注入常用的手段有联合查询注入,报错注入,盲目SQL注入,Cookie注入和宽字符注入等。

2.2 二阶SQL注入

二阶注入与一阶注入的不同之处在于攻击载荷的来源不同。一阶注入的攻击载荷来自用户的输入数据,二阶注入的攻击载荷来自数据库中的数据。二阶注入的过程分为2步,第一步,把设计好的攻击载荷通过正常的Web应用功能存入数据库中。第二步,通过合法的应用操作,把先前存入数据库的攻击载荷调用出来,构造存在漏洞的SQL语句再次送入数据库服务器执行,从而形成SQL注入攻击 [11]。二阶注入的根本原因是Web应用过分相信来自数据库的数据。

二阶注入多发生在频繁调用数据库数据的模块,例如用户资料的修改模块。当管理员已经注册“admin”为其用户名,并配上高强度的密码。普通用户拥有注册和修改密码的功能。注册用户名为 “'admin';-- '”,密码为:123,注册的代码为:

因为数据库中“--”为注释符号,后面的语句不会执行,所以修改密码的用户变成了“admin”,即数据库管理员用户的密码被修改。形成该漏洞的关键原因是过分相信来自数据库的数据,在没有做出任何防御措施的情况下,利用数据动态构建SQL语句,并提交数据库服务器执行,导致漏洞产生。

图2为二阶SQL注入的流程。步骤1、2、3为存储阶段,用户将攻击载荷通过客户端提交,经服务器动态构成SQL语句,交由数据库执行存储。调用阶段,步骤 5、6、7、8、9,通过用户正常请求,将攻击载荷从数据库中取出存入内存,以便于调用。步骤10利用攻击载荷动态构造SQL语句,并在步骤11将SQL语句送入数据库中执行,形成漏洞。

3 新型二阶防御技术

二阶SQL注入的原因是程序默认来自数据库的数据是安全的,从而直接调用数据构造SQL语句,导致漏洞形成。本文提出的新型二阶防御技术,是在攻击载荷已经存入数据库的基础上,在数据库调出攻击载荷和服务器使用攻击载荷之间添加数据检验模块,对数据中出现的敏感字符[12]进行安全处理。安全处理功能通过代理服务器实现,安全处理方式参考PHP的mysql_escape_string()函数,对敏感符号添加“\”进行转义。

3.1 敏感字符

常见的SQL敏感字符有单引号、破折号、反斜杠、星号等。若要达到完备的SQL注入攻击效果,敏感字符集应该包括能够改变SQL语句的语法和语义的字符。通过对大量一阶SQL注入攻击的实例分析,排除ASCII字符,可以得到33个字符,再加上SQL 语句接收的换行符、回车符、制表符3个空白符,构成了容量为36的铭感字符集。如表1所示。

3.2 代理服务器

MySQL数据库简单、高效且可靠,最重要的应用之一是构造数据库集群系统,MySQL数据库已逐渐成为Web应用开发的首选数据库系统。在出现漏洞的应用程序中,PHP参与开发的程序占据较高的比率,所以选择PHP作为程序开发语言更具有代表性。本文使用Mysql+PHP的模式,选择Mysql Proxy作为代理服务器。Mysql代理服务器处于Web服务器和Mysql数据库服务器之间,使用Lua脚本对Web服务器和数据库服务器之间的通信数据进行监控。当Mysql代理服务器工作时,首先扮演服务器的角色,接收来自Web服务器的指令,并根据配置分析和处理客户端指令中的SQL语句,然后作为客户端服务器,把SQL语句发送至服务器进行处理。其次,在数据库服务器向Web服务器传送数据集时,先将数据集传送至Mysql代理服务器,经过设定的分析处理之后,再将数据集传送给Web服务器,从而响应用户请求。

Mysql代理服务器的核心功能由connect_+ server()、read_query()和read_query_result()三个函数组成。如图3,connect_server()函数在客户端发起链接请求时,为客户端提供选择数据库服务器的功能,并实现负载均衡。链接认证结束后,使用read_query()函数,将来自客户端的SQL语句发送至数据库服务器。数据库服务器处理并形成数据集,将数据集发送至Mysql代理服务器,这时候read_query_result()接收数据集,可以对数据集中的数据进行修改,并将修改后的数据集发送给web服务器。数据验证模块的敏感字符处理功能通过修改read_query_result()函数实现。

3.3防御过程

Mysql代理服务器的read_query_result()函数,接收来自数据库服务器响应的数据集,若该数据集中存在攻击载荷,就会导致二阶注入的产生,所以对来自数据库的数据集进行过滤处理是防止二阶SQL注入的根本方法。Mysql代理服务器作为链接数据库服务器和Web服务器的桥梁,在使用前需要进行端口调节,首先使用proxy-address参数为Web服务器提供连接端口,其次使用proxy–backend –address参数来连接数据库服务器端口,最后利用proxy-lua-scrip参数确定敏感字符处理模块的脚本。处理模块的具体流程如图4。

首先,使用read_query()接收到来自Web服务器的SELECT请求之后,将该请求添加编号后加入queries请求队列中,并将该请求的性质定义为resultset_is_ needed = true,该属性将允许用户对响应的数据集进行修改。由队列依次向数据库服务器递送SQL请求,数据库服务器完成处理后,返回响应数据集至Mysql代理服务器,read_query_result()函数依次对数据集进行抓取,通过设定的编号对数据集进行筛选,找到对应SQL语句的响应数据集。响应数据集无法直接修改,新建响应数据集,分解原数据集,对原数据集resultset 属性中数据列表RAW的數据进行逐一检测,使用Lua语言的string.find()和string.gsub()方法,对表1所示的敏感字符集进行搜索和替换。对出现的敏感字符,添加“\”进行字符转义,使用转换后的数据列表替换原先的数据列表。保持数据集其他属性不变的情况下,将新的数据集添加入响应队列中,返回给Web服务器。Web服务器再次使用攻击载荷时,因为敏感字符已经被转义,无法构造预设的攻击语句,故攻击失效。

4 测试结果与分析

使用本文提出的二阶SQL注入防御方法对Sqli-labs、schoolmate CMS 存在二阶注入漏洞的平台和应用程序,进行二阶SQL注入防御,测试防御方法的有效性。Sqli-labs是一款专业的SQL注入练习平台,模拟真实环境下的各种SQL注入漏洞。以Sqli-labs平台为例,选择该平台下的二阶SQL注入漏洞进行防御测试。

部署配置Mysql代理服务器插件,注册新用户,用户名为“admin;#”,密码为123,注册信息进入数据库服务器,数据库对 “\” 进行过滤后将攻击载荷“admin;#”存入数据库表user中。登录该用户,进入修改密码功能模块,提交需要修改的密码。修改密码模块经历两个步骤,第一步,核对该用户信息,并将用户信息存入内存。该步骤使用SELECT 语句查询信息时,经过Mysql代理服务器处理,发现响应数据中的攻击载荷“admin;#”,经过处理变为“admin\\;\#” 返回给Web服务器并存入内存。第二步,服务器端使用 $username= $_SESSION [“userame”]; 从内存中接收用户名,动态构造SQL语句:Update users set password = ‘111 where username = ‘admin\\;\# and password = 123; 该语句经数据库处理后,执行结果为修改用户“admin;#” 的密码信息。未发生二阶SQL注入现象。

同样的部署配置对应用程序schoolmate CMS的二阶注入漏洞进行了防御,有效阻止漏洞。针对两个平台的漏洞形成做出以下总结。

(1) 针对来自用户输入并存入数据库的数据,应设置严格的字符和格式过滤,从存储角度阻止攻击载荷进入数据库。

(2) 对于动态构造SQL语句所需的各项参数,应做好数据过滤,降低输入数据的直接使用所造成的SQL注入风险。

(3) 正确使用文中提出的二阶注入防御方法,对来自数据库的数据做好过滤,防止二阶SQL注入漏洞。

5 结束语

随着Web应用程序的普及,作为Web应用程序最主要的应用漏洞,SQL注入漏洞逐漸受到大家的重视,对于漏洞的防御也逐渐健全。本文中提出的二阶注入防御技术,通过实验证明可以起到防御效果,但是模型本身也存在不足和需要改进的地方,因为敏感数据集数量较大,所以搜寻时间较长,随之页面应答时间较长。提高防御模块准确性和查询效率,是接下来研究和学习的目标。

参考文献:

[1] http : / /www.owasp.org/index.php/Category: OWASP_ Top Ten _Project.

[2] Clarke J, Fowler K, Oftedal E, et al. SQL Injection Attacks and Defense[M]. Elsevier LTD, Oxford, 2009.

[3] 王苗苗, 钱步仁, 许莹莹, 等. 基于通用规则的SQL注入攻击检测与防御系统的研究[J]. 电子设计工程, 2017, 25(5): 24-28.

[4] Briand L C, Briand L C, Briand L C, et al. SOFIA: an automated security oracle for black-box testing of SQL-injection vulnerabilities[C]// Ieee/acm International Conference on Automated Software Engineering. ACM, 2016:167-177.

[5] 张燕. 数据挖掘提取查询树特征的SQL注入攻击检测[J]. 电子技术应用, 2016, 42(3):90-94.

[6] 周严. 基于污点分析的静态漏洞检测可扩展框架[D]. 南京大学, 2017.

[7] 董敏. 基于动态污点分析的SQL注入攻击检测问题的研究[D]. 北京工业大学, 2014.

[8] 乐德广, 李鑫, 龚声蓉, 等. 新型二阶SQL注入技术研究[J]. 通信学报, 2015, 36(s1):85-93.

[9] C. Ping, "A second-order SQL injection detection method," 2017 IEEE 2nd Informtion Technology, Networking, Electronic and Automation Control Conference (ITNEC), Chengdu, 2017: 1792-1796.

[10] PINZONA C I, PAZB J F D, HERRERO ?, et al. id MAS-SQL: intrusion detection based on MAS to detect and block SQL injection through data mining[J]. Information Sciences, 2013,231(5):15-31.

[11] DAHSE J, HOLZ T. Static detection of second-order vulnerabilities in Web applications[A]. Proceedings of the 23rd USENIX Conference on Security Symposium (USENIX)[C]. 2014:989-1003.

[12] 张慧琳, 丁羽, 张利华, 等. 基于敏感字符的SQL注入攻击防御方法[J]. 计算机研究与发展, 2016, 53(10):2262-2276.

【通联编辑:代影】

猜你喜欢
代理服务器数据库
地铁信号系统中代理服务器的设计与实现
IP地址隐藏器
基于排队论的列调SIP代理服务器性能分析
CDN架构下流媒体代理缓存策略的研究
一种容侵系统的设计