APP下载

基于Simhash的SQL注入漏洞检测技术研究

2014-04-29池水明阚歆炜张旻

计算机时代 2014年3期

池水明 阚歆炜 张旻

摘 要: 针对传统SQL注入漏洞检测方法准确率和效率无法达到很好平衡的问题,提出了一种基于Simhash文本相似性检测的SQL注入漏洞检测技术。使用特征值来进行网页间的比较,提高了检测的精度与效率,据此设计并实现了一个SQL注入漏洞检测原型系统。实验结果表明,该系统在检测SQL注入漏洞时兼具了准确性与高效性。

关键词: Simhash; SQL注入; Web漏洞检测; 文本相似性

中图分类号:TP309 文献标志码:A 文章编号:1006-8228(2014)03-03-03

0 引言

在当今社会中,随着网络规模的快速扩大和网络技术的飞速发展,网络已成为了人类获得信息与服务的主流载体。越来越多的企事业单位及政府部门通过网络给人们带来快捷高效的服务。然而,由于计算机网络的脆弱性,也随之出现了大量的网络漏洞,其中SQL注入漏洞是一种危害性非常大的漏洞,对该漏洞进行攻击可能会破坏网络应用的正常运行,泄露数据库中的机密信息,甚至引发社会的混乱。

如何对动态网页中存在的SQL注入漏洞进行检测和防御一直是网络安全领域关注的重点问题。针对目前已知的检测方法准确率与效率难以两全的情况,本文提出了一种基于Simhash文本相似性检测的判定技术,设计并实现了相应的SQL注入漏洞检测原型系统。

1 SQL注入漏洞检测技术及现有网页比较方法

目前的黑盒检测技术主要通过对服务器返回页面的比较来检测网页中的SQL注入漏洞。该方法的原理是通过构造两个输入并发送给服务器,这两个输入如果被服务器组装成SQL语句交给数据库执行则会得到不同的查询结果,从而返回不同的网页,如果将返回的两个网页的内容进行比较,发现存在差异,就可以确认该输入项存在SQL注入漏洞。

因此,如何快速并准确地比较出返回网页间的差异程度就成为了非常关键的问题,该比较方法也决定了整个漏洞检测技术的准确率与效率,因此研究出一个高效的网页比较方法是十分有必要的。目前,在检测SQL注入漏洞中所使用的比较服务器所返回网页间差异的方法主要有以下三种。

⑴ 根据返回的HTTP状态码和网页内容长度进行比较

这种方法是最快和最方便的,无需对返回的内容进行处理即可得到比较结果。但是其比较的准确率相当低,由于完全不关注返回网页的内容,因此在很多情况下当网页内容完全不相同而只是长度接近也会被误判为相似。

⑵ 根据返回页面中是否存在关键字进行比较[1]

这种方法速度也很快,而且比较方式十分简单,只要检查返回的网页内容中是否含有关键字即可。不过如何来选择关键字是一个很大的问题,如果只采用有限的固定关键字,对于不同网站中的漏洞会有不同的比较效果,而只靠程序计算,又难以根据网页内容即时确定关键字,并且选取不同的关键字也许会有不同的比较结果,导致结果的不确定性。

⑶ 根据网页结构进行比较[2]

这种方法的实现是比较复杂的,首先需要将返回的网页内容根据文档结构及元素的嵌套关系建立网页模型,然后再进行模型之间的比较。该方法对网页间结构的变化比较敏感,适用性较强。不过由于需要进行网页内容规范化预处理、建立模型、模型的相似性比较等操作步骤多,会消耗大量的时间来进行计算,因此效率并不高。

2 基于Simhash文本相似性检测的网页快速比较技术

由于以上的网页比较方法在判断结果的准确性和比较的效率上未能达到一个合理的平衡,针对这个问题,本文提出了一种基于Simhash文本相似性检测的网页快速比较技术。

SimHash是一种目前公认效果较好的近似文本检测算法,它是一种对高维数据进行概率降维的方法,能够将高维的向量映射为位数较小且固定的指纹,被广泛用于搜索引擎中的网页去重部分。传统的Hash函数能够将一样的文本生成一样的Hash函数,但是通过Simhash算法,内容差不多相同的文本所得到的特征值也比较相近。因此可以使用Simhash算法来计算出一个网页内容的特征值,然后通过比较两个网页的特征值的相近程度来判断它们是否相似。使用该方法来比较服务器返回页面的主要流程包括:首先提取服务器返回页面的HTML文档并进行分词处理,然后使用SimHash算法计算出被分词后的文档的特征值,最后对网页间的特征值进行比较,以判断网页是否相同。

2.1 HTML文档分词处理

HTML是一种用于描述网页文档结构的超文本标记语言,它通过标记符号来标记要显示在网页中各个部分的内容,每对符号表示不同的意义,用来将网页分成不同的逻辑结构。由于SimHash算法计算特征值的单位是字符串中的一个个词,因此要计算出服务器返回的HTML文档的特征值,就需要对该文档根据HTML格式和分隔符来进行分词操作,将一整段字符串拆分为以词为单位的序列。

2.2 SimHash算法计算特征值

在得到一个经过分词的HTML文档后,就可以使用SimHash算法来计算该文档的特征值了。该算法首先计算文档中每一个词的哈希值并将它们关联到一个多维向量上,再将这个向量降维为一个固定位数的二进制值来作为特征值代表该文档。对于一个被分词后的字符串数组A,使用Simhash算法来计算它的精度为f的特征值的伪代码如下:

1: m←length[A]

2: for i←1 to f

3: do V[i]←S[i]←0

4: for i←1 to m

5: do 使用哈希算法计算出A[i]的一个大小为f的二进制哈希值数组b

6: for j←1 to f

7: do if b[j]=1

8: then V[j]+1

9: else V[j]-1

10: for i←1 to f

11: do if V[i]>0

12: then S[i]←1

13: else S[i]←0

14: return 由S数组转换而成的二进制码

其中,f的大小决定了该算法计算出的特征值的精确度,且f越大,计算特征值S的速度越慢。

2.3 特征值比较

只要计算出两个HTML文档各自的特征值,就可以通过计算它们的海明距离,即两个二进制值间不相同的位数,来得到两个HTML文档之间的差异程度。该比较方式的优点是计算速度极快,因此该比较方法所消耗的时间主要是在计算特征值时所消耗的,且返回的是一个数字,可以选取不同的阈值来限制所要求网页间的相似程度。

3 基于Simhash文本相似性检测的SQL注入漏洞检测原型系统

为了验证本比较技术用于SQL注入漏洞检测时的有效性,设计并实现了一个基于Simhash文本相似性检测的SQL注入漏洞检测原型系统,并在漏洞检测方法上有所改进。

3.1 SQL注入漏洞检测方法的改进

为了提高系统识别SQL注入漏洞的准确率,对检测SQL注入漏洞的方法进行了一些改进。本方法的主要流程是:先对需要检测的网页发出一次正常的请求,返回的页面内容记为a,然后对需要检测的输入项属性的属性值进行构造,产生两个请求,其中,第一个请求中的参数如被数据库直接运行,将会返回与正常页面几乎完全相同的页面,该请求返回的页面内容记为b,第二个请求中的参数如被数据库直接运行,则不会返回需要的结果或是返回错误信息,该请求返回的页面内容记为c。对于单个输入项,服务器端可能有如下几种情况:

⑴ 如数据库直接使用该属性值进行查询,则a与b相似且a与c不同;

⑵ 如插入的测试值被过滤删除,则a、b、c均相似;

⑶ 如插入的测试值被识别并返回错误页面,则b与c相似,a与b及a与c均不同。

因此,当使用Simhash算法对a、b、c三者进行比较后,如发现a与b相似且a与c不同,即可判断该属性的属性值被数据库直接执行了,也就检测出了SQL注入漏洞。

3.2 原型系统模块化设计

本文设计的基于Simhash文本相似性检测的SQL注入漏洞检测原型系统如图1所示,其中五个主要模块的功能如下。

⑴ 测试网址生成模块

该模块能够根据待检测的网页信息来生成测试网址,由于数据库中的数据分为数字型与字符型,因此需要根据不同的属性类型来选择合适的测试代码添加到测试网址或是附加信息中去,保证数据库运行这些语句时产生应有的效果。

⑵ HTML文档获取模块

该模块根据上个模块所生成的测试网址来获取需要进行比较的目标网页的HTML文档,包括正常网页的HTML文档和附加了测试代码后返回的HTML文档。在实现时,本系统使用了HttpClient来作为连接服务器的工具,通过GET和POST方法来获取目标页面的HTML文档内容[3]。

⑶ HTML文档分词模块

该模块主要是对获得的HTML文档进行分词处理,通过使用正则表达式来匹配使用“<”与“>”符号来作为边界的标签,而标签以外的文本内容则根据文本分割符予以分割成词。

⑷ 特征值计算模块

该模块使用Simhash算法来对分词处理后的HTML文档进行计算,产生一个固定位数的二进制特征值,该特征值包含了整个文档的相关信息。

⑸ 漏洞判断模块

该模块通过计算两个HTML文档特征值的海明距离来得到这两个页面间的差异程度。然后根据三个测试页面间的比较结果来判断出该页面是否存在SQL注入漏洞。

[SQL注入漏洞检测原型系统][待检测网页信息][测试网址生成模块] [测试网址][HTML文档获取模块] [HTML文档分词模块][HTML文档][特征值计算模块] [特征值][漏洞判断模块] [判断结果] [标签序列]

4 实验及结果分析

4.1 Simhash算法的有效性验证

为了验证通过Simhash算法来计算HTML文档特征值的效率及准确度,我们进行了一个实验,将计算大量HTML文档的特征值并记录所消耗的时间及特征值比较结果,该实验的测试环境为:

⑴ CPU为Intel Pentium、2.6 GHz;

⑵ 内存为1 GB;

⑶ 操作系统为Windows XP SP3;

⑷ 使用Java实现算法及检测程序。

该实验结果表明:使用Simhash算法计算一个HTML文档的特征值,包括分词处理所消耗的时间在内,所消耗的时间与HTML文档中包含的词数呈线性关系,平均下来约为每10毫秒250词,一般的网页文档中的词数不超过1000个,因此计算一个网页的特征值一般不会超过40毫秒,效率非常高。

对网页间特征值的比较中,可以发现,当特征值的位数为64时,特征值间海明距离小于3的网页几乎完全相同,海明距离大于5的网页之间则有着较大的区别,显然使用Simhash算法来检测网页间的相似程度是可行的。

4.2 检测系统的有效性验证

为了验证基于Simhash文本相似性检测的SQL注入漏洞检测系统的优越性,我们使用该系统对大量网页进行了检测,并对检测结果的正确性进行手工验证。结果发现,该系统能够快速有效地找出网页中潜在的SQL注入漏洞,且误报率低于5%。总体而言,本文的比较算法在准确率和效率上都有较好的表现,能够有效地解决其他SQL注入漏洞检测工具在这两者上无法兼顾的问题。

5 结束语

SQL注入漏洞检测对于网络应用的安全有着很高的价值,准确的检测结果能够使应用的漏洞被快速有效地清除。本文将基于Simhash文本相似性检测的网页快速比较技术应用于SQL注入漏洞的检测过程中,同时提高了检测的效率与和检测结果的正确率。但检测系统在对拥有简易防注入措施的网络应用的检测中有可能判断错误,产生误报,在一定的程度上影响了检测结果的正确率。因此还需要再强化系统对不同情况中存在的SQL注入漏洞的检测能力,优化系统的功能。

参考文献:

[1] CLARKE J,黄晓磊,李化译.SQL注入攻击与防御[M].清华大学出版

社,2010.

[2] 张晨,汪永益,王雄等.基于网页DOM树比对的SQL注入漏洞检测[J].

计算机工程,2012.18:111-115

[3] 姜丽华.防范SQL注入的应用分析[J].煤炭技术,2011.12:220-221