面向PHP应用程序的SQL注入行为检测
2018-03-20周颖,方勇,黄诚,刘亮
周 颖,方 勇,黄 诚,刘 亮
(1.四川大学 电子信息学院,成都 610065; 2.四川大学 网络空间安全学院,成都 610207)(*通信作者电子邮箱opcodesec@gmail.com)
0 引言
随着互联网技术的高速发展,Web应用程序在人类生活发展中起到重要的媒介和资产管理作用。然而由于开发人员安全意识不足,全球大部分网站遭受了不同程度的Web攻击。据2016年中国网站安全漏洞形势分析报告[1],SQL(Structured Query Language)注入[2]攻击占据漏洞类型的44.9%,占网站卫士拦截攻击类型的39.8%;而且Web应用一旦被发现SQL注入漏洞,容易形成通用漏洞,威胁范围广泛,影响巨大。所以,为保护互联网信息安全,SQL注入行为检测是至关重要的一个环节。PHP(Hypertext Preprocessor)作为一个优秀的脚本语言,由于其开发周期短、成本低和丰富的扩展资源等优秀特性,在Web技术上已成为主流。据2016年Web漏洞统计[3],87%的漏洞对应的开发语言为PHP,那么,在PHP应用程序中,检测SQL注入行为愈显重要。
对于SQL注入行为检测技术,国内外学者进行了如下研究。Kar等[4]提出基于文档相似性匹配的检测方法,在最常发生SQL注入的位置提取子句,建立恶意子句的哈希库;由于在实际应用中发生SQL注入的位置较多,难以建立起覆盖面较全的恶意子句库。赵宇飞等[5]以网络流量作为数据源,从网络环境中提取恶意请求较正常请求流量中有较大区别的特征检测SQL注入;但该检测方法缺乏SQL注入行为的针对性,容易将其他攻击行为误判为SQL注入行为。由于SQL语句的上下文无关性,恶意语句和正常语句在语义和语法上有较明显的区别,因此,语法分析技术被应用在SQL注入行为的检测中。Priyaa等[6]运用支持向量机(Supported Vector Machine, SVM)分类算法检测SQL注入,通过片段化的SQL语法树,提取语法和语义特征建立多维特征向量,训练SVM分类器。该方法的数据来源为数据库日志,由于数据库日志缺少访问者信息,因此该方法并不适用于攻击溯源。传统的基于Web日志[7]的SQL注入检测技术,将日志中的访问信息作为SQL注入检测凭证时,由于信息的不完整性,无法判断用户输入是否进入数据库层。对于PHP应用程序,污点分析技术被应用于SQL注入行为检测中,分为基于不可信源[8]和可信源[9]进行污点分析,通过污点分析技术,能够定位SQL语句中外部输入点。上述文献在实现异常检测中,只通过检测不可信源中的攻击关键词等单一特征,并使用规则性的检测方法,存在较高误报率。上述文献在进行污点标记时,对每个字符都进行来源标记,这种标记方法为其后分词添加了大量不确定性;过多的污点标记和污点净化,难免对正常的业务逻辑产生影响。通常产生SQL注入的外部输入点有限,若是对所有可信源进行标记将产生大量冗余操作,并使服务器负载较大。
为提高SQL注入行为检测的有效性和准确率,基于PHP应用程序,本文将污点分析和日志分析技术相结合,进行了如下研究工作。
1)本文基于PHP扩展技术[10],重写PHP原生方法,在代码层对SQL语句执行函数进行监听,对不可信源进行属性标记以实现对攻击者可控点的跟踪,不影响变量存取过程。
2)本文基于抽象语法树[11]和SQL语法,将污点标记技术[12]应用于词法分析和语法分析中,实现SQL语句和内部污点的抽象化。
3)本文通过对语法树中的污点节点进行分析,基于词法、语法和语义,提取了SQL注入语句区别于正常语句的多方面特征,并使用机器学习方法,实现了SQL注入行为检测模型。
1 基于污点分析的SQL注入行为检测模型
本文提出了基于污点分析的SQL注入行为检测模型,模型设计如图1所示。
图1 模型设计图
按以下流程进行SQL注入行为检测:
1)信息提取过程。
外部输入进入PHP应用程序,在PHP代码编译时,通过PHP扩展获取包含外部输入的SQL语句、外部变量和攻击者请求头信息,并将上述信息按格式存入日志文件。
2)污点标记过程。
从日志文件中读取SQL语句和外部变量,生成污点标记源,经过污点标记后,生成污点语法树。
3)异常检测模型。
基于污点语法树,提取污点子树和词法两类特征,选择随机森林算法[13]对SQL注入行为和正常行为进行分类训练,得出异常检测模型。对异常检测模型筛选出的SQL注入行为,记录其攻击载荷(payload)和攻击者信息。
1.1 基于PHP扩展的信息提取
通过对图2攻击语句流动分析可知,攻击语句作为HTTP(HyperText Transfer Protocol)请求参数传入服务器,经由服务端代码渲染后,传递给SQL函数,最终在数据库中执行。在PHP应用程序中,可通过扩展技术在代码层获取SQL语句、外部变量和攻击者信息。
图2 攻击语句流动图
对于上述信息,本文通过内核提供的“PG(http_globals)”对攻击者可控点进行请求初始化。定义全局数组存取外部变量和外部变量来源,当攻击者可控全局变量被赋值,将信息依次存入数组中,以数组索引值对该变量进行外部标记。重写PHP基础函数中的字符串类和解码类,当传入参数带有外部标记,将标记转移给返回值,并以标记值作为索引覆盖上述数组中的值。对OPCODE(Operation Code)[14]中函数执行类“DO_FCALL”和“DO_FCALL_BY_NAME”自定义处理函数。在处理函数中监控SQL函数调用,当传入参数带有外部标记,记录该SQL语句。从全局变量“SERVER”中可获取攻击者请求头信息,以IP地址(Internet Protocol Address)、用户代理(User-Agent)、HTTP cookie(Cookie)、当前时间戳(Timestamp)作为攻击者的标识参数,使用MurmurHash算法对以上参数加密,得到识别攻击者的Hash值。
通过“php_log_err”接口,将上述信息存入日志文件,如表1所示。对于日志中的内容,以攻击者Hash作为请求区分点,对日志中记录的信息进行处理。如图3所示,将外部变量中的元素代入SQL语句中进行匹配,对匹配到的内容使用上文中的Hash值进行首尾标记,作为观测点。将带观测点的SQL语句作为污点标记源。
表1 日志保存的信息
图3 污点标记源生成图
1.2 基于抽象语法树的污点标记技术
对污点标记源作语法分析,以主要SQL保留字作为树枝节点,对树枝节点分别描述语法规则[15]。以“SELECT”为例,一条完整的“SELECT”语句将引用“WHERE”“GROUP BY”等其他保留字语法规则,其语法规则如下:
SELECT[ALL|DISTINCT|DISTINCTROW|TOP]
{*|table.*|[table.]col[AS alias1][,[table.]field2[AS alias2][,…]]}
[FROM table_expr[,…][IN external_database] [WHERE condition_expr operator condition_expr]
[GROUP BY group_by_expr]
[HAVING condition_expr operator condition_expr]
[ORDER BY condition_expr [ACS|DESC]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE|LOCK IN SHARE MODE]]
语法树建立过程如下。
1)节点结构定义。在构建语法树前,定义语法树的节点结构,如图4所示,包含节点类型、节点值和污点标记。以节点值作为污点语法树的主节点,相邻右节点为污点标记节点,相邻左节点表示节点类型。
图4 节点结构
2)词法分析阶段。根据SQL语言特性,定义分隔符将SQL语句数组化,针对转义符和其他特殊字符对分隔后的数组进行合并或分割处理。根据观测点的首尾标记,对标记之间的元素设置污点标记值为1。由于包含子句的元素在语法分析阶段将被再次分词,因此,若元素包含子句,保留其观测点首尾标记;否则去掉观测点首尾标记。
3)语法分析阶段。检测节点中的SQL保留字,以保留字作为树枝节点,其后节点作为叶节点,并根据保留字选择处理分支,按相应语法规则基于深度优先原则进行解析。以SELECT处理分支为例,使用伪代码描述算法如下。
算法1 树枝节点子句语法分析。
输入:node
/*树枝节点*/
node_attr
/*树枝节点污点属性*/
tokens
/*叶节点*/
tokens_attr
/*叶节点污点属性*/
输出:sub_tree
/*污点子树*/
BEGIN
初始化:令SELECT表达式expression和表达式属性
expression_attr为空;
switch node do
case node=′SELECT′:
for i=0 to length(tokens) do
if tokens[i]=′,′ then
SELECT表达式分析(expression,expression_a ttr)
置空expression和expression_attr
else
expression=expression+tokens[i]
token_attr=token_attr||node_attr[i]
expression_attr=[node_attr[i-1],token_att r,
node _attr[i+1]]
function SELECT表达式分析:
(sub_tokens,sub_tokens_attr)=lexer(expressio n,
expression_attr)
/*再次进行词法分析*/
sub_tree=parser(sub_tokens,sub_tokens_attr)
/*再次进行语法分析,返回子树节点和污点属性*/
设置sub_tree节点结构
end
output sub_tree
case node=′FROM′:…
case node=′ORDER′:…
…
END
语法分析完成后,生成污点语法树。例如SQL语句“select * from ___”,若下划线处为外部输入点,该SQL语句本意为拼接表名,因此正常语句将输入符合表名格式的单一字符串,例如,“select * from abc”;而异常语句的输入则为带攻击或测试目的的非单一字符串,例如,“select * from abc where 1=2”,该异常语句通过引入“where”关键字与表达式,并根据与正常语句返回结果的异同,测试该处是否存在SQL注入。异常语句和正常语句的污点语法树数组结构分别如图5~6所示。
图5 异常语句污点语法树
图6 正常语句污点语法树
1.3 基于污点语法树的特征提取
SQL注入的目的是改变原有语句的逻辑,以SQL保留字和运算符替换原本只能作为数值传入SQL语句的内容,而上述改变在污点节点中能够得到体现。本文对SQL注入行为在污点语法树中表现出的特征进行分析和提取,将特征分为污点子树特征和词法特征两类。
1.3.1 污点子树特征
SQL注入行为,由于其目的在于数据窃取和远程命令执行,其请求数据会带有SQL保留字、函数和相应运算符等。上述恶意关键字将直接影响语法树结构,并根据污点节点中的“SELECT”等关键字产生一个或多个污点子树。
1)污点子树的提取。
基于深度优先(Depth-First-Search, DFS)算法[16]遍历语法树,从头节点开始,搜索污点标记节点,将最先搜索到的污点节点作为污点子树头节点,语法树中的边表示节点与节点之前的嵌套关系,当边同时连接两个污点节点时,将被连接节点加入相应污点子树。最终生成污点子树集中包含了所有污点子树和节点信息。算法描述如下。
算法2 污点语法树遍历。
输入:taintTree
/*污点语法树*/
输出:subTaintTree
/*污点子树集*/
BEGIN
初始化:存储节点栈stack为空;污点子树集subTaintTree为空;当前节点Vm为空,当前节点父节点Vn为空;
for i=0 to length(taintTree) do
stack.push(taintTree[i])
/*第一层节点入栈*/
end
while stack非空 do
Vm = stack.pop()
/*从栈顶取出当前节点*/
if Vm[1].children非空 then
/*Vm存在子节点*/
Vn=Vm
/*Vm作为下一元素父节点*/
stack.push(Vm[1].children)
if Vm[2]=1 then
/*添加节点至污点子树*/
switch Vn do
case subTaintTree中存在Vn
subTaintTree[Vn].add(Vm[1].key)
/*将Vm添加至其父节点中*/
case subTaintTree中不存在Vn or Vn=null
subTaintTree.add(Vm[1].key)
/*将Vm加入污点子树集*/
end
output subTaintTree
END
2)污点子树基本特征。
通过对正常样本进行污点子树提取后发现,正常语句中的污点节点通常以单节点子树的形式组成污点子树集。而恶意样本中的SQL注入语句,在污点子树集中体现为一个或多个包含子节点的污点子树,因此,异常语句的污点子树集在宽度和深度上较正常语句有明显的区别。所以本文选择污点子树的宽度和深度作为一组基本结构特征。
将算法2得出的污点子树集表示为:subTaintTree={T0,T1,…,Tn}。将污点子树子节点最大层数作为其深度,并计算整个污点子树集的平均深度作为结构特征之一;将污点子树中每层节点数的最大值作为宽度,并计算污点子树集中子树的平均宽度作为结构特征之一:
(1)
(2)
当污点子树深度大于1时,表明头节点带有关键字,并和其后内容产生了嵌套关系,将其称为嵌套子树。当SQL语句中出现了较多外部输入拼接点时,如“insert”型注入,由于其产生注入的位置单一,此时,平均深度和宽度特征的可信度被降低,因此,通过计算污点子树集中的嵌套子树所占比,同作为基本特征,以减小上述情况出现的误差。
3)污点子树语义相似度。
语义相似度能表示词语的相似性,由于污点子树头节点能体现一个嵌套子树的SQL语句类型;而恶意关键字通常出现在头节点,且在SQL语义上与正常值的相似度较低。当SQL语句中存在多个外部输入拼接点,或单个拼接点的外部输入被分为多个子树时,由于正常请求中外部输入值的数值性和赋值规范性,在生成的污点子树集中,每个子树的头节点语义相似度较高;而异常请求生成的污点子树集中,由于某些子树中出现嵌套,其头节点为各类关键字,因此语义相似度较低。基于上述区别,本文对污点子树集中的子树头节点计算语义相似度作为特征。
基于信息量理论,Lin[17]提出了基于树状结构中两个节点所含的信息量的大小计算语义相似度的方法:
(3)
其中:S1、S2表示两个子树头节点,Sp表示S1、S2的最近共同父节点,P表示该节点的子节点个数和树中的所有节点个数比值。本文在计算过程中,S1为污点子树集中第一个单节点,其他子树头节点分别作为S2,与S1计算相似度,取其平均值;当子树集不存在单节点时,S1为第一个子树的头节点;当子树集只有一个污点子树时,将该特征设置为缺省。
1.3.2 词法特征
为降低误报率,本文收集了大量假阳性样本,样本中的内容为无SQL语义的复杂语句。例如“union selected 1”。传统的异常检测方法将其判定为注入行为,但实际上因关键字错误,属于非注入行为。经过污点子树特征提取后发现,部分假阳性样本的污点子树集中也出现了嵌套子树,单从污点子树结构特征进行异常判定存在误报,所以本文对污点语法树中的词法特征进行分析提取。
1)恶意节点泛化。
经过语法分析,污点语法树的节点中已定义了节点类型,将节点类型作为词性标注。通过词性可得出污点子树中为关键字、运算符、SQL函数的节点。从SQL语法规则中提取出985个关键词作为恶意节点内容,如表2所示。将出现表中关键词的节点作为恶意节点并作泛化处理。对于不在表中的特殊字符,如“(”等,保留其原始形式,将其他字符串归一为常量。按照表2和部分特殊字符组成恶意节点表。
2)节点基本特征。
为验证恶意节点中哪些特征对区分SQL注入行为有明显的效果,本文从实验数据中随机抽选了500个正常样本和等量恶意样本进行分析计算。其中正常样本中包含部分假阳性样本。对恶意样本和正常样本中的节点数和恶意节点数进行统计,如图7所示。从图中可看出,恶意样本中节点数普遍高于正常样本,由于假阳性样本的加入,正常样本中也体现出多节点的情况。而正常样本在节点数增加时,恶意节点所占比例并不会随着增加。反而恶意样本中恶意节点所占比普遍保持在0.3至0.6之间。所以本文选择恶意节点所占比和节点总数作为基本特征。
表2 关键词泛化表
图7 节点基本特征比较
3)恶意节点组合概率。
当出现单个恶意节点时,并不能体现语句是否是SQL注入行为,例如“union selected 1”,所以本文对恶意节点组合出现概率进行计算。对泛化后的节点删除内部常量,以父节点和左节点作为前序节点,组合为只有关键词组成的表达式。该表达式满足内部某关键词状态只与前一关键词状态有关。该表达式作为一个序列具有马尔可夫性质。本文采用N-Gram模型[18]建立恶意节点组合的概率模型。利用恶意样本建立一步状态转移矩阵P,Pij表示第n位为j的前提下,第n+1位为i的概率:
Pij=P(Xn+1=i|Xn=j)
(4)
以“^”和“$”作为起始符和结束符。通过一步状态转移矩阵,可以得出序列Xn={^,x0,x1,…,xn,$}满足上述转移矩阵的概率Pn。Pn体现了一个序列中出现恶意节点组合的概率:
(5)
在训练过程中,直接相乘会导致数据下溢,因此对上述结果作对数处理;为避免概率为0导致样本数据稀疏,使用回退算法(Katz Backoff)对数据进行平滑处理。将结果作为恶意节点组合概率特征。
1.4 基于随机森林的异常检测模型
随机森林算法能够快速处理大量数据并实现高准确率的分类效果。由于本文提取的污点子树语义相似度特征存在缺省值,而随机森林算法对缺省值并不敏感。基于上述优点,本文选择随机森林算法建立分类模型。过程如下:
1)从SQL注入攻击工具中提取各类SQL注入的攻击载荷(payload),以其为样本,基于N-Gram模型建立恶意节点组合的概率模型。
2)获得训练样本的污点语法树后,根据恶意节点表,计算节点基本特征;将污点节点序列化,计算恶意节点组合概率。
3)按1.3.1节中方法提取污点子树,计算污点子树基本特征,对于非单一元素子树集,计算其子树语义相似度。
4)数字化特征与其类别如表3所示。利用随机森林算法对正常样本和恶意样本进行分类训练,并使用十字交叉验证对其分类性能进行验证。将得到的随机森林分类模型作为异常检测模型。
表3 基于污点语法树提取的特征
2 实验与分析
2.1 实验步骤与环境
本文采用以下步骤实现基于污点分析的SQL注入行为检测模型:
1)本文使用PHP源码中提供的动态编译扩展的方法,将信息提取部分作为一个可装载的so文件加载在PHP中。
2)本文参照了SQL-parser[19],对词法分析器和语法分析器算法和逻辑进行改进,实现污点标记的语法分析过程,最终生成污点语法树。
3)对于异常检测模型,实验分别选取了5 000个恶意样本和正常样本。其中正常样本中包含了无SQL语义字符串和其他类型攻击样本,如跨站脚本攻击(Cross Site Script Attack, XSS);恶意样本中包含了从Github[20]中搜集的SQL注入攻击载荷(payload),包括5种常见SQL注入攻击语句:布尔型注入、报错型注入、联合查询注入、多语句查询注入和时间延迟注入。此外使用SQL自动攻击工具,针对不同的注入点,生成相匹配的攻击载荷。
为验证方法有效性,本文在一个PHP应用程序中预设了数据操纵语言(Data Manipulation Language, DML)中的四种语句,在每个语句中设置多个外部输入点,分别为查询项、表名、赋值语句等常见注入发生点。测试过程中,本文在该应用程序中每个注入点下模拟攻击者行为,通过工具和手工频繁发送SQL注入行为请求,并对本文模型的检测结果进行统计和准确性计算。实验详细测试环境:操作系统为Linux ubuntu 4.4.0- 75-generic;内存为2 GB;Web服务器版本为Apache 2.4.10;PHP版本为PHP 5.3.10。
2.2 实验结果分析
为验证基于污点分析的SQL注入行为检测模型的准确性,并和现有SQL注入检测技术进行对比,本文对两种方法和所提模型进行对比实验。包括基于关键字的检测方法和基于正则表达式的检测方法。
基于关键字的检测方法:根据表2建立关键字列表,待检测样本中一旦出现关键词则判定为注入行为。基于正则表达式的检测方法:使用开源Web框架中的通用PHP防护代码[21],其中防御SQL注入的功能由正则表达式实现。
本文对1.3节中提出的两类特征进行了评估,分别只采用污点子树结构特征和词法特征与本文模型进行对比实验。采用混淆矩阵的评估方法评估检测结果,评价指标包括精确率(Precision, P)、准确率(Accuracy, ACC)、召回率(Recall, R),及精确率和召回率的调和均值(F1-Measure,F1)。
通过检测结果表4可看出,本文模型相对于基于关键字和正则表达式的检测方法,准确率明显提高;只选取污点子树结构特征和词法特征进行检测时,准确率皆低于本文模型准确率。与文献[6]中提出的SVM检测算法相比,本文模型的准确率提升了1.1个百分点;并且,对于被编码的请求,使用基于流量的第三方SQL注入行为检测工具,例如网站安全狗[22],并未检测出其中的SQL注入行为,但由于本文模型在代码层截获数据,编码后的请求在代码层内被解码,所以能准确地检测出编码请求是否是SQL注入行为。
表4 测试数据检测结果 %
3 结语
本文研究了在PHP应用程序下检测SQL注入行为的方法,提出了基于污点分析的SQL注入行为检测模型,其中主要运用的技术点为:PHP扩展开发、SQL语法分析、污点分析技术和随机森林分类算法。实验结果表明,本文提出的模型在PHP应用程序中检测SQL注入行为有着较高的准确率。
由于本文通过PHP扩展获取信息后基于日志文件进行提取,因此具有一定滞后性;今后的研究方向在于将污点标记过程和异常检测模型融合在PHP扩展中,实现SQL注入行为的实时检测和拦截。
References)
[1] 360安全.2016年中国网站安全漏洞形势分析报告[EB/OL].(2017- 01- 05)[2017- 06- 20]. http://bobao.360.cn/news/detail/3905.html.(360 safe. Analysis report of Chinese Website security vulnerability in 2016 [EB/OL]. (2017- 01- 05)[2017- 06- 20]. http://bobao.360.cn/news/detail/3905.html.)
[2] 王丹,赵文兵,丁治明.Web应用常见注入式安全漏洞检测关键技术综述[J].北京工业大学学报,2016,42(12):1822-1832.(WANG D, ZHAO W B, DING Z M. Review of detection for injection vulnerability of Web applications [J]. Journal of Beijing University of Technology, 2016, 42(12): 1822-1832.)
[3] youyou0635.2016年度Web漏洞统计之Exploit-db[EB/OL].(2017- 01- 23)[2017- 06- 20].http://www.freebuf.com/vuls/125382.html.(youyou0635. Web vulnerability statistics from Exploit-db in 2016 [EB/OL]. (2017- 01- 23)[2017- 06- 20]. http://www.freebuf.com/vuls/125382.html.)
[4] KAR D, PANIGRAHI S, SUNDARARAJAN S. SQLiDDS: SQL injection detection using query transformation and document similarity [C]// Proceedings of the 2015 International Conference on Distributed Computing and Internet Technology. Berlin: Springer, 2015: 377-390.
[5] 赵宇飞,熊刚,贺龙涛,等.面向网络环境的SQL注入行为检测方法[J].通信学报,2016,37(2):88-97.(ZHAO Y F, XIONG G, HE L T, et al. Approach to detection SQL injection behaviors in network environment [J]. Journal on Communications, 2016, 37(2): 88-97.)
[6] PRIYAA B D, DEVI M I. Fragmented query parse tree based SQL injection detection system for Web applications [C]// Proceedings of the 2016 International Conference on Computing Technologies and Intelligent Data Engineering. Piscataway, NJ: IEEE, 2016: 1-5.
[7] 范春荣.基于Web日志的入侵检测系统设计与实现[D].石家庄:河北科技大学,2011:4-36.(FAN C R. Design and implementation of the Web log-based intrusion detection system [D]. Shijiazhuang: Hebei University of Science and Technology, 2011: 4-36.)
[8] NGUYEN-TUONG A, GUARNIERI S, GREENE D, et al. Automatically hardening Web applications using precise tainting [C]// SEC 2005: IFIP International Information Security Conference on Security and Privacy in the Age of Ubiquitous Computing. Berlin: Springer, 2005: 295-307.
[9] 王溢,李舟军,郭涛.防御代码注入式攻击的字面值污染方法[J].计算机研究与发展,2012,49(11):2414-2423.(WANG Y, LI Z J, GUO T. Literal tainting method for preventing code injection attack in Web application [J]. Journal of Computer Research and Development, 2012, 49(11): 2414-2423.)
[10] GOLEMON S. Extending and Embedding PHP [M]. Indianapolis, Indiana: SAMS Publishing, 2006: 269.
[11] WANG Y, WANG D, ZHAO W, et al. Detecting SQL vulnerability attack based on the dynamic and static analysis technology [C]// Proceedings of the 2015 IEEE Computer Software & Applications Conference. Piscataway, NJ: IEEE, 2015: 604-607.
[12] 陆开奎.基于动态污点分析的漏洞攻击检测技术研究与实现[D].成都:电子科技大学,2013:28-35.(LU K K. The research and realization of dynamic taint analysis based security attack detection technology [D]. Chengdu: University of Electronic Science and Technology of China, 2013: 28-35.)
[13] BREIMAN L. Random forest [J]. Machine Learning, 2001, 45(1): 5-32.
[14] The PHP Group. Zend Engine 2 opcode [EB/OL]. (2017- 05- 25)[2017- 08- 26]. http://php.net/manual/zh/internals2.opcodes.php.
[15] 吴江.SQL语言预编译器的构架——基于Linux操作系统[D].北京:北京化工大学,2002:15-37.(WU J. The construction of complier for SQL-basing on Linux operating system [D]. Beijing: Beijing University of Chemical Technology, 2002: 15-37.)
[16] 张炘,廖频,郭波.一种挖掘频繁闭项集的深度优先算法[J].计算机应用,2010,30(3):806-809.(ZHANG X, LIAO P, GUO B. Depth-first search algorithm for mining frequent closed itemsets [J]. Journal of Computer Applications, 2010, 30(3): 806-809.)
[17] LIN D. An information-theoretic definition of similarity [C]// ICML’98: Proceedings of the Fifteenth International Conference on Machine Learning. Madison: Morgan Kaufmann, 1998: 296-304.
[18] ABOU-ASSALEH T, CERCONE N, KEELJ V, et al. N-gram-based detection of new malicious code [C]// Proceedings of the 28th Annual International Computer Software & Applications Conference-Workshops & Fast Abstracts. Washington, DC: IEEE Computer Society, 2004, 2: 41-42.
[19] SWANHART J. greenlion/PHP-SQL-parser [EB/OL]. (2016- 08- 01)[2017- 06- 20]. https://github.com/greenlion/PHP-SQL-Parser.
[20] TRIET P T M. SQL-injection-payloads [EB/OL]. (2017- 08- 20)[2017- 08- 26]. https://github.com/trietptm/SQL-Injection-Payloads/blob/master/LINKS.md.
[21] 360. 360_safe3.php [EB/OL]. (2017- 05- 29) [2017- 08- 26]. https://github.com/luislv/easycms/blob/master/lib/plugins/filecheck/tool/360_safe3.php.
[22] safedog. safedog [EB/OL]. (2017- 04- 26)[2017- 08- 26]. http://www.safedog.cn/website_safedog.html.
ZHOUYing, born in 1993, M. S. candidate. Her research interests include Web security, network attack and defense.
FANGYong, born in 1966, Ph. D., professor. His research interests include information security, network information confrontation.
HUANGCheng, born in 1987, Ph. D. His research interests include information security, network attack and defense.
LIULiang, born in 1982, Ph. D., lecturer. His research interests include network system and information security.