基于SQL语法树的SQL注入过滤方法研究
2016-12-12韩宸望林晖黄川
韩宸望,林晖,黄川
(1. 福建师范大学数学与计算机科学学院,福建 福州 350117;2. 福建师范大学福建省网络安全与密码技术重点实验室,福建 福州 350117)
基于SQL语法树的SQL注入过滤方法研究
韩宸望1,2,林晖1,2,黄川1,2
(1. 福建师范大学数学与计算机科学学院,福建 福州 350117;2. 福建师范大学福建省网络安全与密码技术重点实验室,福建 福州 350117)
Web应用的发展,使其涉及的领域也越来越广。随之而来的安全问题也越来越严重,尤其是 SQL注入攻击,给Web应用安全带来了巨大的挑战。针对SQL注入攻击,将基于SQL语法树比较的安全策略引入用户输入过滤的设计中,提出了一种新的SQL注入过滤方法。实验结果表明,该方法能够有效地防止SQL注入攻击,并有较高的拦截率和较低的误报率。
SQL注入攻击;Web安全;SQL语法树;用户输入过滤
1 引言
随着互联网技术的快速发展,Web技术在许多领域都得到了广泛的应用,且已成为世界经济发展中的关键技术之一[1]。然而,随着Web 技术在各个领域的普及和发展,也面临着越来越多的安全威胁。并且,Web安全已经成为网络安全最主要的来源之一,因此,对Web安全的研究也就成为网络安全领域的一个重点和热点[2]。
目前,影响Web安全的因素众多,其中,SQL注入是最高危的漏洞之一。在2008年~2010年,SQL注入攻击连续3年在开放式Web应用程序安
全项目(OWASP,Open Web Application Security Project)年度十大攻击行为中排名第一。在2011年~2015年,SQL注入攻击连续5年排入OWASP年度十大攻击行为。
基于上述分析,本文有机地融合了用户输入过滤措施和SQL语法树结构比较方法,提出了一种基于SQL语法树的SQL注入过滤方法。实验结果表明,该方法可以有效地防止攻击者绕过防注检测,提高了对SQL注入攻击的拦截;此外,在有效拦截SQL注入攻击的同时,该方法还降低了过滤用户输入数据的误报率。
2 SQL注入攻击与防注检绕过技术
2.1 SQL注入攻击定义
SQL注入攻击是一种由攻击者通过影响应用程序向后台数据库传递的 SQL查询而引发的攻击。文献[3]中将 SQL 注入攻击定义为:攻击者在应用程序的查询语句中插入恶意指令来获取数据,即攻击者利用现有应用程序,将包含恶意代码的数据传递给数据库,从而修改SQL自身的语法和功能,导致了恶意的SQL语句被SQL解释器执行而产生攻击。
2.2 SQL注入攻击攻击原理
SQL注入攻击是一种通过操纵Web 输入来修改后台 SQL语句以利用代码进行攻击的技术[4]。SQL 注入攻击种类很多,不同种类的攻击方式虽然有所区别,但是原理相同:即把通过在Web输入中包含恶意代码,使Web应用程序将恶意代码拼接到动态SQL语句中,从而获取信息。
下面通过一个万能账号的案例来说明 SQL注入攻击。例如,一个登录页面,用户输入正确的账号和密码后,Web程序会查询数据库,如果存在此用户并且密码正确,将成功登录;如果用户不存在或密码不正确,则会提示账号或密码错误。其中,该数据库为MySQL数据库,Users表中有3列,分别为:user name、password、type这种场景中,该登录页面的动态SQL语句为
select * from users where username='"+user name +"' and password='"+ password +"'"
攻击者将使用账号“'or 1=1 --”登录,密码为“123456”。此时,SQL语句变为
select * from users where user name ='1'or '1'='1'--and password ='123456'
其中,'1'='1'为永真,“--”为注释符,注释符后面的SQL语句不执行。
经上述分析,Web应用程序执行的SQL语句恒成立,因此,攻击者能够在不知道账号和密码的情况下登录系统。
2.3 防注检绕过技术
Web 应用通常会使用部署在应用代码中或以WAF、IDS 形式存在的输入过滤器来防御SQL注入攻击[5]。下面用以上文案例中的环境来介绍大小写、SQL注释、编码和动态查询等防注入检测绕过技术。
1) 大小写技术
因为数据库使用不区分大小写的方式处理SQL关键字,因此,大小写技术通过变换攻击字符串中字符的大小写来绕过防注检测。例如,如果下列输入被阻止:'UNION SELECT 1, password,3 FROM users--。可以通过下列方法来绕过防注入检测:'UnIoN SelEcT 1, password,3 fRom users --。
2) SQL注释技术
使用内联注释来创建 SQL代码段能够绕过多种输入防注入检测,尤其是简单的模式匹配防注入检测。攻击者可以在过滤了空白符的情况下使用内联注释来分隔每个关键字。如
'/**//**/UNION/**//**/SELECT/**//**/1,pass word,3/**//**/FROM /**//**/account/**/--
在较早的MySQL版本中,甚至可以在SQL关键字内部使用内联注释,而绕过防注入检测。如
'/**//**/UN/**/I/**/ON/**//**/S/**/EL/**/E/* */CT/**//**/1,password,3/**//**/FR/**/O/**/M/**/ /**/users/**/--
3) 编码技术
攻击者可以通过编码来避免恶意代码中的关键字被黑名单匹配到,从而绕过防注入检测。编码技术有非常多种,如URL 编码、UTF-8、十六进制编码。其中,攻击中最为常用的编码技术为URL编码。假设过滤器能够阻止空白符和内联注释符/*,但无法阻止用了URL编码的内联注释的SQL攻击。在这种情况下,可以用以下语句来绕
过防注入检测
'%2f%2a*/UNION%2f%2a*/SELECT%2f%2a */password%2f%2a*/FROM%2f%2a*/users%--
4) 动态查询技术
由于许多数据库都允许动态执行SQL查询,导致攻击者可以使用动态查询来绕过防注入检测。不同的数据库中动态查询执行的实现会有所不同。例如,不同数据库使用不同的语法来拼接字符串。假设SQL关键字SELECT被过滤了,可以用以下方式构造它。
Oracle:'SEL' || 'ECT'
SQL Server:'SEL' + 'ECT'
MySQL:'SEL''ECT'
也可以使用CHAR函数(Oracle中为CHR函数)来构造SELECT
CHAR(83)+CHAR(69)+CHAR(76)+CHAR(6 9)+CHAR(67)+CHAR(84)
3 相关工作
近年来,国内外对SQL注入的研究取得了不少成果。在一定程度上防止了SQL注入攻击。这些成果大致分为以下几类。
1) 用户输入过滤
用户输入过滤方法通过对用户提交的数据采用关键字匹配,基于正则表达式的规则匹配等方法进行过滤。用户输入过滤能够有效防御已知的SQL注入攻击,但无法对未知的SQL注入攻击进行有效的防御。传统的用户输入过滤方案有关键字过滤和基于正则表达式的特征规则过滤。
Ivan Ristc 开发的开源项目ModSecurity[6]和Roesch M 开发的入侵检测软件Snort[7],这2个项目都是通过制定攻击的特征规则集过滤用户输入,从而防御SQL注入攻击。
关键字过滤通过过滤SELECT、OR、AND等关键字防御SQL注入,但是对SQL注入的拦截率有限和较高的误报率。基于正则表达式的特征规则过滤相对于关键字过滤有效地提高了率,降低了误报率,能够有效防御SQL注入。
2) 基于机器学习的SQL注入检测
基于机器学习的 SQL注入检测技术利用机器学习算法学习所有可能的SQL注入攻击,但是该方法的效果十分依赖于机器学习算法的精确度和学习样本的准确度。Kim等[8]提出了一种基于数据挖掘和机器学习的SQL注入攻击检测方法。该方法提取了数据库日志中内部查询树的特征向量,之后通过SVM算法对这些特征向量进行分类,从而达到防御SQL注入攻击的目的。
3) 语法结构比较
语法结构比较的方法能够高效地防御 SQL注入攻击,但是它的覆盖率很难达到 100%,并且这种方法可能需要修改源码。石聪聪等[9]提出了一种基于SQL语法树特征匹配的方法,该方法在后台中维持一个由正常 SQL语句提取的特征知识库。当Web应用程序生成动态SQL语句时和后台的知识库进行匹配。若匹配成功,则为合法SQL语句;若匹配不成功,根据基于风险值的动态特征过滤算法来进行识别。通过分析可知,该方法在知识库中的语法树特征数量较大时,会存在使匹配效率降低的问题。
4) 参数化查询和存储化过程[10,11]
参数化查询是在代码层对 SQL注入攻击进行防御[12]。现今的大部分编程语言都能通过参数化查询语句访问数据库。参数化查询语句让数据库访问API可以使用占位符或绑定变量来向SQL查询提供参数。使用参数化查询能够避免或解决很多应用中常见SQL注入问题。
正确地配置存储过程的访问权限能够有效地防止或减轻SQL注入攻击产生的影响,提高系统的安全性[13]。并且大部分数据库现在都能够支持存储过程,允许通过存储过程对数据库进行访问。
5) 敏感信息加密
对数据库中的账号密码、客户信息、交易信息等敏感数据进行加密,能够尽量地降低受到SQL注入攻击后的危害。杨玉龙等[14]提出了一种新的防止SQL注入的方案,结合同态加密技术,对用户的输入进行同态加密,使攻击者输入的特殊字符或拼接的SQL语句失去其本身的意义,该方案的使用有效地防止了SQL注入攻击。
6) 网络测量
SQL注入在请求长度、连接数以及特征串等方面相较于正常用户请求的流量有较大区别。据此,赵宇飞等[15]首次从网络流量分析的角度检测 SQL
注入行为,提出了LFF(length-frequency- feature)检测方法,通过连接频率检测、长度检测和特征串检测,能够较准确地发现网络中的SQL攻击行为。
4 基于SQL语法树的SQL注入过滤方法
4.1 概述
对于正常的用户输入数据,根据数字型和字符型,将用户输入的数据代入SQL语句“select a from b where c=?”(其中?为占位符)。其生成的SQL语句的特征都是相同的,如该SQL语法树的节点总数是一样的。以用户输入admin为例,其SQL语法树的结构如图1所示。
图1 正常的SQL语法树
而对于SQL注入攻击输入,将攻击输入数据代入相同的 SQL语句中将会报错或改变原有的SQL语句的语法结构,如增加某个节点、语法树结构变化等。以用户输入admin’ or ‘1’=’1为例,其SQL语法树的结构如图2所示。
图2 注入攻击的SQL语法树
因此,如果某个输入数据带入SQL语句“select a from b where c=?”(?为占位符)后,该SQL语句的语法结构特征(SQL语法树节点总数)与预期的不符,则说明该用户输入可能为SQL注入攻击。
基于上述分析,本文结合了用户输入过滤措施和SQL语法树结构比较措施的特点,提出了一种基于SQL语法树的SQL注入过滤方法。该方法的设计思路为:将SQL注入过滤分为转码阶段和SQL语法树比较阶段这2个部分。其中,转码阶段检测用户输入的数据,将用户输入中字符的大小写、编码、注释符进行转换,以防止攻击者绕过检测。SQL语法树比较阶段通过将用户输入数据分别以数字型和字符型带入“select a from b where c=?”(?为占位符)中,分别对两条生成后的SQL语句进行语法解析生成语法树。若2棵SQL语法树的特征(SQL语法的节点总数)跟期望中的特征一样,则该用户输入是合法的。若两棵SQL语法树其中一颗SQL语法树的特征与期望中的不一致,则判断该用户输入为SQL注入攻击。
4.2 SQL注入攻击检测过程
本文提出的基于SQL语法树的SQL注入过滤方法的详细流程如图3所示。
该方法的具体工作过程描述如下。
1) 首先,将用户输入中字符的大小写、编码、注释符进行转换。消除SQL语句前后的空白,将其中的连续空白字符(包括空格、TAB和回车换行)替换成单个空格。之后将SQL语句全变成小写形式(或大写形式),并转化各种编码,以此防止攻击者绕过检测。
2) 在不知道用户输入的该参数是字符型还是数字型的情况下。先假设用户输入的该参数为字符型,用输入的数据X代入SQL语句“select a from b where c=?”(?为占位符),得到SQL语句“select a from b where c=X”。
3) 对SQL语句“select a from b where c=X”进行SQL解析得到SQL语法树。若解析失败,则直接结束,并将该输入判定为SQL注入;若解析成功继续步骤4)。
4) 将步骤3)生成的SQL语法树的特征(SQL语法的节点总数)与期望中的特征进行匹配。若一样,继续步骤5);若不一样直接结束,并将该输入判定为SQL注入攻击。
5) 判断用户输入的数据中第一个空格前的数
据是不是数字。若是数字,继续步骤6);若不是数字,直接结束,并将该输入判定为正常输入。
图3 过滤流程
6) 假设用户输入的该参数为数字型,将用输入的数据X代入SQL语句“select a from b where c=?”(?为占位符),得到SQL语句“select a from b where c=X”。
7) 对SQL语句“select a from b where c=X”进行SQL解析得到SQL语法树。若解析失败,则直接结束,并将该输入判定为正常输入;若解析成功,继续步骤8)。
8) 将步骤7)生成的SQL语法树的特征(SQL语法的节点总数)与期望中的特征进行匹配。若一样,则将该输入判定为正常输入;若不一样,则将该输入判定为SQL注入攻击。
4.3 模块介绍
本文所提方法的设计模块如图4所示。
图4 系统模块
1) 数据提取模块:负责提取用户输入的数据。
2) 转码模块:负责将用户输入数据中字符的大小写、编码、注释符进行转换。
3) 判断模块:负责将解析的 SQL语法树的特征值(节点总数)与期望的特征进行比对,根据结果判断用户输入的能不能构成 SQL注入攻击。在与SQL解析模块进行第一交互后,根据用户输入数据中的第一个空格前的数据是不是数字,判断是否与SQL解析模块进行第二次交互。
4) SQL解析模块:负责将SQL语句解析为SQL语法树,包括词法分析和语法分析。词法分析负责根据SQL的词法,对SQL语句进行分解,生成一个个独立的单词。语法分析负责在词法分析的基础上,根据SQL语法来判断该SQL语法是否符合语法逻辑,并构造出SQL语法树。
5) 日志:负责接收其他模块的错误信息,并记录日志。
6) 配置文件:负责接收管理员的指令,控制是基于SQL语法树过滤模块的开关,即是否对用户输入进行过滤。
5 实验与分析
本文采用的测试案例(Web应用程序)为小型的J2EE招聘系统,该系统包含登录、查看简历等功能,且代码中存在SQL注入漏洞。服务器为Tomcat,后台数据库为MySQL。测试数据为SQL注入攻击输入100条(由SQLMAP生成),正常输入200条。其中,200条的正常输入中100条包含关键字的正常输入。为了便于测试该方法对攻击的拦截率和误报率,本文对基于SQL语法树的过滤方法、基于关键字过滤的方法和基于正则表达式的过滤方法(含30条过滤规则)进行了比较。测试结果如图5、图6和表1所示。
图5 SQL注入拦截率
图6 用户输入误报率
表1 SQL注入拦截率和误报率
图5和图6表明本文提出的基于SQL语法树的过滤方法对SQL注入攻击有较好的防御效果和较低的误报率。该方法相比基于关键字过滤的方法和基
于正则表达式的过滤方法能够有效地提高拦截率。
为了测试基于 SQL语法树的过滤方法对Web应用程序性能的影响,本文分别对Web应用程序未加载过滤模块和Web应用程序加载过滤模块这2种情况分别进行测试,测试结果如图7~图9和表2所示。
图7 正常输入测试时间
图9 SQL注入攻击测试时间
表2 系统响应时间
图7表明,对于不含攻击关键字的正常访问,加载了过滤模块的Web应用程序相对于未加载过滤模块的Web应用程序响应时间有略微的延迟,但是基本没有受到影响。图8表明,对含有攻击关键字的正常访问而言,过滤模块对开头为数字的输入数据的响应时间相对较慢,对开头为非数字的输入数据响应时间较快,致使加载了过滤模块的Web应用程序响应时间较慢。图9表明,对于SQL注入攻击而言,未加载过滤模块时,SQL注入可能改变了后台数据库运行的SQL语句,从而导致响应时间有了明显增加;加载了过滤模块之后,由于过滤模块中对复杂的SQL语句的解析时间较长,所以响应时间增加。因此,对于SQL注入攻击,未加载过滤模块和加载了过滤模块的系统响应时间都有所延迟,导致两者的系统响应时间较为接近。加载了过滤模块的Web应用程序相对未加载过滤模块的Web应用程序的响应延迟在可接受的范围内,对用户体验的影响不大。
6 结束语
SQL注入攻击是 Web应用面临的一个巨大安全挑战。本文针对SQL注入攻击,结合了用户输入过滤措施和SQL语法树结构比较措施,提出了一种基于SQL语法树的过滤方法。实验分析表明,该方法相较传统的基于关键字过滤的方法和基于正则表达式的过滤方法能够有效地提高拦截率并降低误报率。
[1] 郑成兴. 网络入侵防范的理论与实践[M]. 北京: 机械工业出版社, 2006. ZHENG C X. Network intrusion prevention theory and practice[M]. Beijing: China Machine Press,2006.
[2] 高鹏, 严望佳. 构建安全的 Web站点[M]. 北京: 清华大学出版社, 1999. GAO P, YAN W J. Build a secure Web site[M]. Beijing:Tsinghua University Press,1999.
[3] ANLEY, Chris. Advanced SQL injection in SQL server applica-
tions[R]. An NGSSoftware Insight Security Research (NISR) Publication, 2002.
[4] CLARKE J. SQL Injection Attacks and Defense[M]. Amsterdam: Elsevier, 2009.
[5] 李鑫, 张维纬, 隋子畅, 等. 新型SQL注入及其防御技术研究与分析[J]. 信息网络安全,2016,2:66-73. LI X, ZHANG W W, SUI Z C, et al. Research and analysis on the novel SQL injection and defense technique[J]. Netinfo Security, 2016,2:66-73.
[6] BECHER M. Web application firewalls[D]. Akademikerverlag: Universiti Teknologi MARA, 2012.
[7] ROESCH M. Snort: lightweight intrusion detection for networks[C]//The 13th Conference on Systems Administration (LISA-99), Usenix Association. 1999:229-238.
[8] MI-YEON K, DONG H L. Data-mining based SQL injection attack detection using internal query trees[J]. Expert Systems with Applications, 2014(41): 5416-5430.
[9] 石聪聪, 张涛, 余勇, 等. 一种新的SQL注入防护方法的研究与实现[J]. 计算机科学, 2012,(S1):60-64. SHI C C, ZHANG T, YU Y,LIN W M. New approach for SQL-injection detection[J].Computer Science,2012,(S1):60-64.
[10] 成晓利. Web 应用程序SQL 注入攻击漏洞测试系统的研究与实现[D]. 成都: 西南交通大学,2013. CHENG X L. Research and implementation of Web application SQL injection vulnerability detection system[D]. Chengdu: Southwest Jiaotong University, 2013.
[11] 褚龙现. ASP.NET 应用中SQL注入攻击的分析与防范[J]. 计算机与现代化, 2014,(3):151-153,160. CHU L X. Analysis and defense of SQL injection attacks in ASP.NET application[J].Computer and Modernization, 2014,(3): 151-153,160.
[12] WEI K, MUTHUPRASANNA M, KOTHARI S. Preventing SQL injection attacks in stored procedures[C]//IEEE Conference on Piscataway, Software Engineering. 2006: 191-198.
[13] 黄龙军. 存储过程技术在网络考试系统SQL 注入攻击防御上的应用[J]. 计算机系统应用, 2013,22(1):103-106. HUANG L J. Application of stored procedures to defense against SQL injection attacks in online examination system[J].Computer Systems & Applications,2013,22(1):103-106.
[14] 杨玉龙, 彭长根, 周洲. 基于同态加密的防止 SQL注入攻击解决方案[J].信息网络安全, 2014,(1):30-33. YANG Y L,PENG C G,ZHOU Z.A solution of preventing SQL injection attacks based on homomorphic encryption[J]. Netinfo Security, 2014,(1):30-33.
[15] 赵宇飞, 熊刚, 贺龙涛, 等. 面向网络环境的SQL注入行为检测方法[J]. 通信学报, 2016,02:88-97. ZHAO Y F, XIONG G, HE L T, et al. Approach to detecting SQL injection behaviors in network environment[J]. Journal on Communications, 2016,02:88-97.
韩宸望(1993-),男,福建漳州人,福建师范大学硕士生,主要研究方向为信息安全。
林晖(1977-),男,福建福州人,博士,福建师范大学副教授、硕士生导师,主要研究方向为物联网、云计算、信任管理、无线通信网络、网络与信息安全。
黄川(1979-),男,福建福州人,博士,福建师范大学讲师,主要研究方向为计算机网络技术、无线网络技术。
Research on the SQL injection filtering based on SQL syntax tree
HAN Chen-wang1,2, LIN Hui1,2, HUANG Chuan1,2
(1. School of Mathematics and Computer Science, Fujian Normal University, Fuzhou 350117, China;
2. Fujian Provincial Key Laboratory of Network Security and Cryptology, Fujian Normal University, Fuzhou 350117, China)
The development of Web application make its areas become more and more widely. Followed by a security problem is becoming more and more serious, especially for the SQL injection attacks, which bring a huge challenge to the Web application security. A new SQL injection filtering method was proposed to detect SQL injection attack by introducing a security strategy based on SQL syntax tree to the design of the user input filtering. The experimental results show that the method can effectively prevent SQL injection attacks, and has higher recognition rate and lower rate of false positives.
SQL injection attack, Web security, SQL syntax tree, user input filtering
TP309
A
10.11959/j.issn.2096-109x.2016.00113
2016-08-17;
2016-10-14。通信作者:林晖,linhui@fjnu.edu.cn
国家自然科学基金资助项目(No.61363068, No.61472083);福建省引导基金资助项目(No.2016Y0031);福州市科技局基金资助项目(No.2015-G-54, No.2015-G-84)
Foundation Items: The National Natural Science Foundation of China (No.61363068, No.61472083), Pilot Project of Fujian Province (No.2016Y0031), Project of Fuzhou Municipal Science and Technology Bureau (No.2015-G-54, No.2015-G-84)