曹鹏飞 潘绪超 王凡 潘晓峰 包婷婷
摘 要: 目前SQL注入攻击已成为Web安全领域中最为常见的攻击方式,SQL注入攻击可以泄露用户信息,获取系统权限和篡改网页信息等。文章设计了基于语义分析的SQL注入行为检测方案,能够对攻击行为从语义的角度进行检测。该方案包括数据预处理,抽象语法树,语义分析等功能模块,针对漏洞相关语言的编译器,通过对攻击者输入的内容串进行语法语义检查来判断该请求的恶意程度,理解攻击者意图,能实现对SQL注入攻击的精准识别。
关键词: SQL注入; Web攻击; 语法分析; 语义分析
中图分类号:TP399 文献标志码:A 文章编号:1006-8228(2019)11-18-05
Abstract: At present, SQL injection attack has become the most common attack mode in the field of Web security. SQL injection attack can reveal user information, obtain system privileges and tamper with Webpage information. This paper designs a SQL injection behavior detection scheme based on semantic analysis, which can detect attack behavior from the semantic point of view. The function modules of the scheme include data preprocessing, abstract grammar tree and semantic analysis etc. For the compiler of vulnerability-related languages, the malicious degree of the request can be judged by checking the grammatical semantics of the attacker's input content strings, and the attacker's intention can be understood. It can realize the accurate identification of SQL injection attacks.
Key words: SQL injection; Web attack; syntax analysis; semantic analysis
0 引言
随着互联网迅速发展,Web应用程序在各个领域都广泛应用,但Web应用程序的构造也越来越复杂,随之带来的攻击问题也越发严重,SQL注入攻击已经成为首要威胁[1]。传统的SQL注入检测方法是基于规则或特定的检测模式,需要先分析特定注入产生的原因,再制定相应的检测规则。随着大数据技术的普及应用以及词法、语义方法的日渐成熟,基于上下文逻辑实现攻击检测,能够降低误报率、提升精准率、提高检测效率[2]。
本文针对传统规则检测模式的不足提出了从语义分析的角度来进行SQL注入行为检测,从词法、语法的结合深层贯穿逻辑的查找,在传统的正则匹配的基础上,提高了检测准确度。能在不知晓网站结构的情况下,仅通过分析用户的输入就可以检测出可能的SQL注入行为并进行预警。
1 基于语义分析的SQL注入行为检测方案设计
本文以Web引擎扩展为载体,通过对关键信息进行语法分析,得到代码的关键元素为节点和相关依赖关系,并通过语法分析模块实现语义理解从而完成SQL注入行为检测,在分析过程中提出抽象语法树的建立,通过语义分析得出SQL注入危险状态值,准确定位SQL注入行为的恶意发生行为点,筛除噪音[3]。如图1所示,系统结构包括预处理模块和语义分析模块。
预处理模块:将用户输入信息进行关键字的提取,通过词法分析与语法分析结合,生成抽象语法树。根据正常语句返回结果的异同,测试该处是否存在SQL注入行为。
语义分析模块:检测是否存在SQL注入行为,依靠传统的正则匹配的方法,存在漏检情况。本模块结合Adaboost算法与FP-growth算法形成完整的语义分析模型,从上下文的逻辑商增强检测的准确性。
1.1 预处理模块
预处理模块利用了词法分析和语法分析对接收的待检测文件进行初步的分析,主要流程如图2。
预处理主要在Web环境下解析(Parser),构建由词法分析器和语法分析器组合的预处理模块。如用户输入一串带有SQL注入攻击的语句,将用户输入的关键信息放入预处理器中。词法分析器首先进行字符集合分析,生成属性关键字(Tokens)格式化传入语法分析器中進行抽象语法树的节点整合,最终输出抽象语法树。对具有SQL注入的信息进行定位。
1.2 语法分析模块
SQL注入攻击利用SQL语法中保留字、运算符作为输入内容,通过预处理对Web环境下的SQL注入输入进行分析定位,并使用抽象语法树的构建,让后续的机器能够在全文上下逻辑中整体理解输入内容。语法分析模块主要在结合算法解决SQL注入的检测的不够全面以及之前的依靠正则匹配不断加规则的检测技术。
利用AdaBoost算法分析当前迭代最优弱危险分析器[4],计算最优弱分析器的权重,并根据错误率更新分析样本权重,然后不断重复以上步骤,直到达到能够终止条件为止。终止条件是强分析器的错误率低于最低错误率阈值或者达到最大危险分析迭代次数。计算公式如下:
采用FP-Growth算法[5][6],进行关联分析,实现通过上下逻辑的分析,检测出是否存在SQL注入攻击行为。此算法有两个运算阶段,第一阶段使用循环扫描信息查找满足最小支持度地关联项集,第二阶段则运用连续低阶的关联项集,从而确认高阶关联项集的支持度,并且筛选出其中最小支持度的关联项集,最终达到所有关联项集都被挖掘出,并且得出关联规则。
2 系统实现
2.1 系统总体实现
SQL注入检测框架结构,如图3所示。
该系统主要布置在客户端及服务器端之间,由数据收集模块、预处理模块,以及语义分析模块组成。其中,数据收集模块利用抓包工具采集用户输入,预处理模块分析关键信息并输出抽象语法树,发现是否存在SQL注入语句。语义分析模块主要运用语义分析方法进一步上下的逻辑解析。
SQL注入行为实施主要通过HTTP协议中的内容向服务器发送带有SQL注入命令的请求来完成注入攻击。对于HTTP协议来说,主要有3种方式向服务网端提交数据:以GET方式在URL链接的参数中提交;以POST方式在HTTP协议的数据体中提交;以COOKIE方式提交。本设计主要针对是URL和HTTP协议数据体中的数据。
2.2 预处理模块实现
将Web应用程序中输入信息放置预处理模块,处理过程分为词法分析和语法分析。词法分析模块选取当前Web解释器使用的Parser分析器,提取解释器的标准定义规则文件。语法分析程序Bison根据标准定义语法规则还原语法中的程序逻辑,构建完整的抽象语法树AST。预处理模块包括flex词法分析和Bison语法分析。
系统调用start()函数启动词法分析,逐个扫描每一个词法单元,调用new()函数建立新的叶子节点,通过return返回。词法单元在抽象语法树中是终结点(叶子节点)。第三个参数是data,是词法单元行编号。词法分析需要对每个终节点建立叶子节点,来给语法分析过程调用。
start(){
start.a=new("IF",0,data);return IF;
start.a=new("ELSE",0,data); return ELSE;
start.a=new("WHILE",0,data); return WHILE;
start.a=new("PLUS",0,data); return PLUS;
start.a=new("MINUS",0,data); return MINUS;}
通过对照SQL词法与语法分析转换表,代码实现AST节点的类型分类:
typedef {
TYPE_NONE = 0
, TYPE_KEYWORD = (int)'k'
, TYPE_UNION = (int)'U'
, TYPE_GROUP = (int)'B'
, TYPE_EXPRESSION = (int)'E'
, TYPE_SQLTYPE = (int)'t'
, TYPE_FUNCTION = (int)'f'
, TYPE_BAREWORD = (int)'n'
, TYPE_NUMBER = (int)'1'
, TYPE_VARIABLE = (int)'v'
, TYPE_STRING = (int)'s'
, TYPE_OPERATOR = (int)'o'
, TYPE_LOGIC_OPERATOR = (int)'&'
, TYPE_COMMENT = (int)'c'
} sqli_token_types;
上述生成Token完成了抽象语法树中的节点分类,主要包括SQLObject、SQLExpr、SQLStatement三种类型。抽象树通过自底向上的方式建立,先将词法单元建立对应的叶子节点,由词法单元叶子节点产生新的父节点,进行规约,直到起始单元,完成整颗语法树的建立。
抽象语法树[7]的建立需要对节点进行打印,SQLUtils()函数将SQLExpr或者SQLStatement類型打印为String类型,便于后续的语义分析模型进行自定义遍历处理。
SQLUtils() {
static String toSQLString(SQLObject sqlObj, String dbType);
static String toSQLString(List
2.3 语义分析模块实现
语义分析模块结合AdaBoost算法和FP-Growth算法的基础上实现基于上下逻辑的快速,全面的SQL注入攻击检测。AdaBoost算法以其进行SQL注入样本迭代分析的方法,实现降低漏检率,提高精确度。算法的实现,要先建立数据集并转换为后续需要的方式,然后结合加权原则寻找最佳单层决策树。
Find(dataMatrix,dimen,threshVal,threshIneq){
retArray=ones((shape(dataMatrix)[0],1))
if threshIneq=='lt':
retArray[dataMatrix[:,dimen]<=threshVal]=-1.0
else:
retArray[dataMatrix[:,dimen]>threshVal]=-1.0
def buildStump(dtArry,Labels,D):
dataMatrix=mat(dtArry);
labelMat=mat(Labels).T;
m,n=shape(dataMatrix);numSteps=10.0;
bestStump={};
bestClasEst=mat(zeros((m,1)))
minError=inf
}
代码中Find()函数完成了建立单层决策树,并进行样本分类,计算出错误率。错误率的计算是对应在相对权重上的,最后进行累加得到分析器的错误率。
Create(self, nameValue, numOccur, parentNode)
函数Create()使用数据集以及最小支持度作为参数来构建FP树。
函数Outlet()对用户输入的SQL语句进行上下逻辑的遍历,寻找出关联集,并进行排序更新树,最终输出存在的SQL注入攻击的行为检测结果。
Outlet(){
freqItemSet = set(SQLSample.keys())
updateFPtree(orderedItem,retTree,SQLSample,count)
return retTree, SQLSample;
}
3 实验
3.1 实验环境
本文环境在LAMP架构下的Web应用进行安全防护测试,具体环境如下:
操作系统:Ubuntu 16.04 LTS;
Web服务器:Apache、PHP语言;
数据库:MySQL;
解释器:JavaScript Parser。
本文使用开源Python库Libinjection作为预处理、词法和语法分析模块实现平台,关键字为检测对象,对该系统的性能进行测试,指标包括漏报率和误报率,时间作为主要的相应时间。
3.2 实验方法
本文测试的样本数据来源于Github上SQL注入攻击样本,选取共计2000条,其中删除部分生僻以及类似的SQL注入攻击语句,挑选1500条作为最终测试样本,在实验过程中,使用抓包WireShark工具来收集网站页面返回的实际信息。
3.3 实验结果
经过测试,威胁等级判断结果如1表所示:
实验结果表明,该模型可以很好的定位SQL注入危险级别,同时有着低漏报率,高速率的特点。分析威胁等级后,使用同样1500个测试样本进行语义分析的检测与其他正则匹配检测的数据对比,结果如表2。
通过语义分析模型和正则匹配模型对相同的1500个SQL注入样本进行检测对比发现,语义分析模型对于Web程序下的SQL注入行为检测较为稳定,能保持几乎全部检测,但是正则匹配模型对于时间盲注型,Get型具有较差的检测效果,整体检测不稳定,尤其对于需要不断更新匹配库的注入类型,不能保证第一时间的检测预警,而语义分析在这方面做地更好。
如图4所示,语义分析在检测的速度上远远高于传统正则匹配。一定程度上提升了系统检测性能,降低了检测时间的消耗。在检测效果上,语义分析可以将漏检率降到最低,更全面的保证了对于SQL注入行为的精确检测。
如图5所示,基于语义分析的检测方法可以有效的提高Web应用程序中的SQL注入攻击行为的检测率,降低漏洞率,同时提升了检测的效率。此模型在一定的版本中已相对稳定。实验表明,该系统在关键字的检测中,有较快的检测效率和较高的检测率,整体情况能够满足在线防御的需求。
4 结束语
近年来,随着大数据、人工智能、区块链等技术的发展,与科技加速融合,新业务、新技术的大量涌现,导致Web安全问题越来越多。一旦发生安全风险,不仅会威胁到用户的利益,也会给企业本身带来巨大的损失。
本文设计并实现了基于语义分析模型的Web应用程序中SQL注入行为的检测。最后实验结果表明,通过Payload进行一系列词法、语法、语义的分析,能有效的缩短检测时间和提高检测率,降低漏检率。
参考文献(References):
[1] 吴斌,刘循.SQL注入攻击及漏洞检测防范技术[J].网络安全技术与应用,2017(1):76-78
[2] 王苗苗,钱步仁,许莹莹等.基于通用規则的SQL注入攻击检测与防御系统的研究[J].电子设计工程,2017.25(5):24-28
[3] 周颖,方勇,黄诚等.面向PHP应用程序的SQL注入行为检测[J].计算机应用,2018.38(1):201-206
[4] Zhu J,Zou H,Rosset S,et al.Multi-class AdaBoost[J].Statistics & Its Interface,2006.2(3):349-360
[5] Shang X,Sattler K U,Geist I.SQL Based Frequent Pattern Mining with FP-Growth[M].Applications of Declarative Programming and Knowledge Management. 2005.
[6] Sonewar P A,Thosar S D.Detection of SQL injection and XSS attacks in three tier web applications[C].International Conference on Computing Communication Control & Automation. 2017.
[7] Mcwhirter P R,Kifayat K,Shi Q,et al.SQL Injection Attack classification through the feature extraction of SQL query strings using a Gap-Weighted String Subsequence Kernel[J]. Journal of Information Security & Applications,2018.40:199-216