文献标识码: A
DOI:10.16157/j.issn.0258-7998.2016.03.026
中文引用格式: 张燕. 数据挖掘提取查询树特征的SQL注入攻击检测[J].电子技术应用,2016,42(3):90-94.
英文引用格式: Zhang Yan. Query tree feature extraction based on data mining for detecting SQL injection attack[J].Application of Electronic Technique,2016,42(3):90-94.
0 引言
目前,越来越多的Web 应用都采取了应用程序+数据库的交互式结构,应用程序根据输入动态构建结构化查询语言(Structured Query Language,SQL)语句,在数据库中进行相应的操作,并将结果返回给用户。数据库中存储着用户的很多敏感信息,正是由于数据库中信息的重要性,导致了这种交互式应用频繁地遭到攻击[1]。其中,SQL注入攻击(SQL-Injection Attacks,SQLIA)会从数据库中盗取敏感信息或擅自添加数据库中的账户,以获取操作数据库的权限[2]。因此,对SQL注入漏洞检测方法的研究已成为提高网站安全防护能力的热点问题。
目前,有学者通过数据挖掘(Data Mining,DM)的方法从SQL数据库日志中提取一些特征作为攻击检测的依据。但是,数据库日志中的查询采用复杂的树结构表示,如何将其转换成可作为分类器的输入特征是一个难题[3]。文献[4]将树结构转化为树向量,以每个子树发生的次数作为树向量中的特征表示。然而,这些算法十分复杂,随着子树的变化,需要对其进行修改。为此,文献[5]提出了一种基于多维度序列的方法,可以对树结构进行调整。但是,由于输入树结构不同,多维度序列中的连续维度并不相同,这需要利用特殊方式对多维度序列进行相似度测量。对于特征的提取,文献[6]从查询树中仅提取SQL语法特征作为分类依据,但这会增加假阳性概率。文献[7]分析了SQL语句中的隐含意义,提取了语法和语义特征,并采用字符串长度模型来检查有限可替代集合中是否存在常数,从而形成数值特征。文献[8]则采用字符串分布模型来转换查询树特征。但这些方法仅利用一种统计模型,在查询树结构多样性的情况下,所提取的特征表征能力有限。
本文基于数据挖掘技术,提出一种用于SQL注入攻击检测的查询树特征提取和转换技术。利用Web数据库日志中记录的查询树(查询树是SQL语句的一种内部表示)在数据库级别上正确检测出SQLIA。为了将恶意查询树与正常查询树区分开来,本文从查询树中提取出语义和语法特征,并利用多维序列和统计模型将其转换成n维数值特征向量,最终利用多项式核函数支持向量机(Support Vector Machine,SVM)进行分类。以ROC曲线下的面积(AUC)为性能指标进行实验,结果表明本文提出的特征提取和转换方法获得了较高的AUC值,具有优异的SQLIA检测性能。
1 提出的SQLIA检测方法
本文利用基于数据挖掘的二值分类方法来检测SQL语句是否正常。其中,提取SQL数据库日志中的语义和语法特征,并转换成多维特征向量,然后利用多项式核函数支持向量机(SVM)构建一个SQLIA检测框架,来求解二值分类问题。
提出的SQLIA检测框架分为四个阶段:数据收集阶段、数据预处理阶段、SVM训练阶段和检测阶段。本文SQLIA检测框架如图1所示。
数据收集阶段中,从数据库系统中收集正常和恶意SQL语句信息,并将每个SQL用查询树表示。然后,将每个查询树写入到数据库日志中,创建一个树形数据结构。
数据预处理阶段中,将查询树转化为n维特征向量。特征提取器模块从查询树中提取语法和语义特征,并与特征转换器相结合生成多维度序列。向量生成器模块与每个多维度序列的数值元素相连接生成了n维特征向量,即将每个查询树转换为向量表示的特征,用于后续的相似性测量和模式识别。
训练阶段中,利用基于向量表示的特征来对SVM进行训练,用于后续检测阶段。在训练阶段中,通过向量表示的查询树特征作为训练数据来构建一个SVM分类模型。
检测阶段中,利用训练好的SVM分类模型对新查询树的向量表示特征进行处理,以确定这些新查询树为正常或恶意查询,从而检测SQLIA。
但是,由于原始查询树结构十分复杂,因此转换后的向量也不是线性可分的。对于非线性可分问题,本文采用非线性核函数来代替数据间的点乘积,在原始维度空间上可以完成所有相似性的计算。本文在SVM中采用的核函数为多项式核函数,其表达式为[9]:K(χu,χv)=(χu·χv+1)h。
2 查询树特征提取及转换
为了利用SVM对查询树的特征进行学习和检测,需要将复杂的查询树结构转化为n维数值特征向量。查询树的树结构中含有SQL语句的语法和语义信息。语法信息是对SQL语句进行解析的输出信息,其表示了树的骨架。通过查询系统目录可以获得语句信息,语句信息中含有SQL语句引用的目标。本文首先利用提取的语法和语义特征生成一个多维序列作为中间表示,然后将多维序列转化为n维特征向量。
2.1 定义
设定查询树Γ由一个节点集合和一个边集合构成。设定根(Γ)表示树根节点,路径(n1,nd)表示节点n1到节点nd的路径,节点n的父节点定义为父母(n),节点n的子节点集合定义为子(n)。将没有子节点的节点称为叶子节点,内部节点是指具有子节点的节点,将根节点和一个内部节点间的路径称为内部路径。需要注意,根节点和任何节点之间存在唯一的路径。在一个有标签的树中,标签值与树中的每个节点相关联。
序列S是目标的有序列表,用S={φ1,φ2,…,φk}表示。有序目标的个数称为序列的长度,用|S|表示。具有有限长度n的序列称为n元组。多维序列是一个有序序列的集合,用R={S1,S2,…,Sw}表示,其中Si表示一个序列。多维度序列含有两种类型的维度:连续维度和空间维度。连续维度的长度为序列的个数,空间维度的长度为|Si|中的最大长度m,1≤i≤w。换句话说,可将R称为w×m多维度序列。
2.2 特征提取
本文在数据库系统中处理日志文件中记录的查询树,树Γ的特征提取结果为一个多维度序列R。首先,确定生成多维度序列中每个序列的基。为此,利用深度优先遍历算法(DFS)对整个查询树的内部路径进行遍历,生成了标准序列P={p1,p2,…,pk},其中pi为路径(根(Γ),ni),即从根(Γ)到第i个内部节点ni的内部路径。在多维度序列中序列维度的长度设置为标准序列的长度,即|P|=k。
为了生成多维度序列,本文提取叶子节点的值,这些叶子节点与查询树的每个pi相关联。对于路径的截止节点n,若子(n)是叶子节点,则提取这个子(n)的值。此外,若提取的特征值类型为字符串,那么将字符串值转化为数值。
特征提取过程为每个内部路径pi生成了一个序列Si={φi1,φi2,…,φil},其中l表示子(ni)的个数,φij表示数值大小,1≤i≤k且1≤j≤l。多维度序列是一个连续的序列,即R={S1,S2,…,Sk}。
由于一般所采用的SQL语句仅由全部SQL语法的一小部分构成,如图2所示,因此多维度序列R可能是稀疏序列。但是,本文提出的方法使得R具有语法特征和语义特征,因此减少了R中的目标个数。通过本文提出的方法,根据内部路径可以生成R的序列,序列的阶和每个序列的长度隐含了查询树的语法特征。因此,R的目标仅明确表示了查询树的语义特征。图3描述了图2中部分查询树的多维度序列Rb的例子,其中序列维度的长度为4。
2.3 特征转换
本文根据查询树的不同类型,采用3种统计方法将从查询树中提取字符串特征转换成数值特征:
(1)在恒定列大小的情况下,转换方法将字符串长度模型和直方图模型相结合。直方图模型能够确定是否字符串的值位于直方图边界内,并且计算出指示器,指示器利用布尔值B表示,其中B∈{true=1,false=-1}。利用字符串长度和指示器值乘积的值替换字符串的值。
(2)在函数参数恒定的情况下,转换方法将字符串长度模型和字符分布模型相结合。字符分布模型可以确定字符串的每个字符是否为先前观察的字符集合中的元素,并计算出指示器,指示器用布尔值B表示。利用字符串长度和指示器值的乘积替换字符串的值。
(3)在节点类型确定的情况下,将字符串的值作为名义上的特征。利用枚举法的离散数值替代字符串的值。
在图2中,利用和表示列的恒定值,利用fc表示恒定的函数参数值,用ot表示操作的类型名。对于,本文假设常量大小为8,使其包含在相应的直方图列的边界中。然后,将转换成数值大小8。对于,本文假设常量的大小为23,这个常量的值不在直方图的边界内部。然后,将转化为数值-23。对于fc,如果常量的大小为4,并且所有的4个字符都是观察字符集合中的元素,那么将fc转化为数值大小4。如果ot=′AND′并且ot∈{′AND′,′OR′,′NOT′},那么将ot转化为枚举数1。
经过特征转化过程之后,图4给出了图3中多维度序列转换的结果。对于、和fc,将一个字符串的值映射为一个数值的值。通过采用联合模型,一个数值对应于字符串值的多个特性,因此减少了多维度序列中的目标个数。
2.4 构建n维特征向量
在生成所有查询树日志的多维度序列之后,本文将每个多维度序列转换为n维数值特征向量。利用RR={R1,R2,…,Rz}表示多维度序列的集合,其中Rx={Sx1,Sx2,…,Sxk};z表示查询树的个数,k表示内部路径的个数,并且1≤x≤z。利用VX={vx1,vx2,…,vxn}表示特征向量,其中n表示分量的个数,vxw表示向量的分量,其中1≤w≤n。
最后,根据填充后的多维序列RX生成特征向量,即将RX转化为其中向量的长度为|VX|保持了序列的阶,RX中有意义目标的位置并不用填充值′NaN′进行表示。因此,VX也表示了相应查询树的语法特征和分量顺序。VX的分量明确表明了查询树的语义特征。对于图5中的例子,最后构建的n维特征向量为VX=(1,8,-23,0,0,0,4,7)。
3 实验及分析
3.1 实验环境及数据
构建一个实验环境对本文提方法进行验证。实验平台为一台具备2.4 GHz的Intel Core i5、4 GB内存和Windows7系统的PC。利用Java库和WEKA 3.7.9库执行本文SQLIA检测方法。
为了进行综合型实验,本文利用一个简单的电影推荐系统。网络应用使用PHP语言开发,其能够与PostgreSQL数据库进行存取操作。利用MovieLens数据构建一个包含大量用户信息的电影推荐系统的数据库。本文生成了两种类型的数据库:正常查询数据库和恶意查询数据库。利用Java库和Apache HTTPC客户端库构建正常查询生成器。采用了SQLMAP构建恶意查询生成器,包含6种SQLIA:内联查询攻击、联合查询攻击、堆叠查询攻击、基于错误、基于时间和基于布尔类型的盲注攻击。
实验中,模拟了SQL存储过程中的注入攻击,根据SQL存储语句的前缀信息将收集到的查询分成3个组,组1中包含“SELECT”语句,组2中包含“INSERT”语句,组3中包含“UPDATE”语句。表1中显示了每个组中正常和恶意查询操作的数量。
3.2 性能指标
为了评估分类器的性能,通常会采用受试者工作特征(ROC)曲线,其是以假阳性率(FPR)为横轴、以真阳性率(TPR)为纵轴形成的二维空间。然而,ROC曲线间常存在交叉, 单纯的“优于”或“支配”关系通常并不存在,自然无法相互比较,因此代之以用标量型的ROC曲线下的面积(Area Under ROC Curve,AUC)[10]来实现分类算法间的性能比较。本文以AUC值来评估SQLIA的检测性能,其中,0.5对应随机猜测性能,1对应最优性能。AUC值越高,表明分类器对该类样本的识别准确率越高。
3.3 性能比较
为了验证本文方法中特征提取和特征转换技术的优异性能,将其与其他几个文献中的特征提取方法进行比较:(1)文献[6]中只使用语法特征的方法,(2)文献[7]中基于字符串长度模型来转换特征的方法,(3)文献[8]基于字符串分布模型转换特征的方法。实验中,为了公平性,分类器都采用多项式核函数的SVM,其中SVM核函数中的阶数值设置为从1~10变化。
图6给出了组1中SELECT语句的SQLIA检测精度实验结果。对于SELECT语句,采用语法特征的方法在阶数为7~8的情况下,AUC为0.963。由于语法结果根据用户输入数据的变化而变化,因此该方法禁用SELECT语句的常量值来获得较好的性能。基于字符串长度模型的方法获取了优异的性能,其中在阶数为6~9的情况下,AUC为0.992。基于字符串分布模型的方法也获取了比较优异的性能,在阶数为3~7的情况下,其AUC达到了0.99。但是,这些方法的性能都低于本文方法,本文方法在阶数为3~8时,获取的AUC都达到了0.994以上。这是因为,本文采用了语义特征和语法特征,提高了对于各种SQL语句的SQLIA检测的正确率。
图7给出了组2中INSERT语句的SQLIA检测精度实验结果,采用语法特征的方法获得了较差的实验性能,在阶数为1的最优情况下,其AUC为0.744。基于字符串长度模型的方法在阶数为9时,获取的AUC最高为0.986。基于字符串分布模型的方法获取了比较优异的性能,其在阶数为1和7的情况下,获取的AUC都达到了0.98。但是,这个性能也略微低于本文方法,本文方法在阶数为6~9的情况下获取的AUC都达到了0.99。
图8给出了组3中UPDATE语句的SQLIA检测精度实验结果,基于语法特征的方法获得了较差的性能,在阶数为1的情况下,其AUC为0.97。基于字符串长度模型的方法也获取了较差的性能,即使在阶数为1的最优情况下,其获取的AUC为0.804。基于字符串分布模型的方法在阶数为5~9时,获得的AUC达到了0.97。这个性能也低于本文方法,本文方法在阶数为8~10的情况下获取的AUC达到了0.99。
表2统计了各种方法在3组数据集上的平均AUC值。可以看出,本文方法获得了0.963的AUC值,比语法特征、字符串长度模型和字符串分布模型分别提高了 36.6%、18.1%和1.4%。
4 结语
本文提出了一种基于数据挖掘的SQLIA检测方案,从SQL查询树中提取语义和语法特征,将其转换成n维数值特征向量,并将其作为多核SVM分类器的输入,从而对SQLIA进行检测。构建仿真实验,以AUC值作为性能指标。结果表明,与现有方法相比,对于UPDATE语句、SELECT语句以及INSERT语句,本文方案都有效提高了SQLIA的正确检测率。
在本文的研究中,由于查询树具有可变性,所以找到标准的内部路径是本文的难点。在以后研究中,将会研究一种搜寻方法,使其能够轻易找到各种数据库系统中查询树的内部路径。
参考文献
[1] 孙义,胡雨霁,黄皓.基于序列比对的SQL注入攻击检测方法[J].计算机应用研究,2010,27(9):3525-3528.
[2] 刘毅,刘益和.基于jQuery的SQL注入攻击防范实现[J].计算机技术与发展,2011,21(2):177-180.
[3] SADEGHIAN A,ZAMANI M,MANAF A A.A taxonomy of SQL injection detection and prevention techniques[C].2013 International Conference on Informatics and Creative Multimedia.IEEE Computer Society,2013:53-56.
[4] WANG Y,LI Z.SQL injection detection via program tracing and machine learning[J].Lecture Notes in Computer Science,2012,76(4):264-274.
[5] LIN Z,WANG H,MCCLEAN S.A multidimensional sequence approach to measuring tree similarity[J].IEEE Transactions on Knowledge & Data Engineering,2010,24(2):197-208.
[6] NATARAJAN K,SUBRAMANI S.Generation of sql-injection free secure algorithm to detect and prevent sql-injection attacks[J].Procedia Technology,2012,4(4):790-796.
[7] SONODA M,MATSUDA T,KOIZUMI D,et al.On automatic detection of SQL injection attacks by the feature extraction of the single character[C].Proceedings of the 4th International Conference on Security of Information and Networks.ACM,2011:81-86.
[8] ELSHAZLY K,FOUAD Y,SALEH M,et al.A survey of SQL injection attack detection and prevention[J].Journal of Computer & Communications,2014:36(7):150-162.
[9] 张瑞,杨晓,谭秀林.基于盖根鲍尔多项式的SVM核函数[J].山西大学学报:自然科学版,2013,36(1):30-33.
[10] 吴少华,程书宝,胡勇.基于SVM的Web攻击检测技术[J].计算机科学,2015,42(6):362-364.