一种XSS漏洞检测方法的设计与实现

2016-08-05 07:58左丹丹付利华
计算机应用与软件 2016年7期
关键词:表单测试用例脚本

左丹丹 王 丹 付利华

(北京工业大学计算机学院 北京 100124)



一种XSS漏洞检测方法的设计与实现

左丹丹王 丹付利华

(北京工业大学计算机学院北京 100124)

摘要跨站脚本(XSS)漏洞是近年来较为流行的一种漏洞,随着Ajax技术的广泛应用,其危害性及快速的传播能力也越来越强。现有的漏洞检测技术没有充分对该类漏洞的漏洞注入点进行研究,使用的漏洞检测技术也没有充分考虑测试请求后响应的页面,导致漏洞检测率相对较低。针对现有漏洞检测技术的不足之处,加强对隐含页面的DOM结构分析,提出基于DOM状态改变的方式查找漏洞注入点的方法。在此基础上提出基于页面交互点相关的漏洞检测方法,设计并实现了漏洞检测原型系统。实验证明,该原型系统能够找到更多的漏洞注入点,能有效地提高漏洞检测率。

关键词跨站脚本漏洞漏洞注入点隐含页面漏洞检测

0引言

Web应用程序的漏洞已经成为互联网最严重的安全隐患之一。SANS研究所最新的数据显示高达60%互联网攻击都来自于Web应用程序[1]。常见的漏洞攻击包括跨站脚本漏洞、SQL注入漏洞、跨路请求伪造攻击,而跨站脚本漏洞是其中最突出的一种。在2013年OWASP公布的Web漏洞榜单中,跨站脚本漏洞(XSS)位居第三名[2]。

增强Web应用系统漏洞检测能力、减少漏报的关键问题之一是如何充分地对漏洞注入点进行分析、识别和提取。然而,由于JavaScript语言的动态特性[3],隐含页面内容的大量存在[4],导致漏洞注入点并不能充分地被查找到用来进行漏洞的检测。现有的XSS漏洞检测针对漏洞注入点的查找主要关注的是当前检测的静态页面,关注的对象一般都是表单输入和超链接[5-8],并没有考虑那些隐含页面可能存在的漏洞注入点。此外,现有的漏洞测试技术一般都是通过分析服务器响应后的页面进行漏洞检测的判断[9],实际上这种方法是有待改进的。因为对于存在存储型跨站脚本漏洞的网页来说,该方法的测试用例对应的输出结果不一定显示在服务器响应后的跳转页面或当前测试请求注入的页面,也有可能在整个Web应用的其他相关页面,因此存在漏报。

本文提出基于DOM状态改变[10]的方式进行漏洞注入点的查找方法。这种查找漏洞注入点的方法的特点是不仅考虑当前指定URL的静态页面,还考虑了其对应的隐含页面。 同时,本文提出基于页面交互点相关的漏洞检测方法,充分分析了测试请求注入Web应用后相关的页面。该方法对于存储型跨站脚本漏洞检测比较明显。

本文的主要贡献如下:

(1) 提出了基于DOM状态改变的方式进行XSS漏洞注入点的查找方法,能够查找到更多的隐含页面的漏洞注入点。

(2) 提出了基于页面交互点相关的方法进行漏洞的检测,该方法主要是针对存储型跨站脚本漏洞,能够减少漏洞漏报率。

(3) 基于上述理论设计并实现了XSS漏洞检测工具的原型系统,并对原型系统做了真实的实验评估,效果良好。

1相关工作

一般将XSS漏洞分为三类:包括反射性跨站脚本漏洞、存储型跨站脚本漏洞、基于DOM的跨站脚本漏洞。

(1) 反射型跨站脚本漏洞(Reflected XSS),也称作非持久性跨站脚本漏洞。这种类型的跨站脚本漏洞最常见的形式是攻击者通过特定手法,诱使用户去访问包含恶意代码的URL。当受害者浏览这些超链接时,恶意代码就会在受害者的浏览器上执行。

(2) 存储型跨站脚本漏洞(Stored XSS),是指通过提交恶意数据到存储器,当包含这些恶意数据的网页被用户浏览到时,用户便会受到漏洞攻击。Stored XSS一般出现在网站的留言、评论、博客日志等交互处。

(3) 基于DOM型的跨站脚本漏洞(DOM based XSS),一般称之为本地跨站脚本的攻击,是指客户端的脚本程序可以通过DOM(Document Object Model)动态地检查和修改页面内容。浏览器用户可以操纵DOM中的对象,比如URL、Location、refer等。如果用户在客户端输入的数据包含了恶意脚本,而这些数据没有经过有效的输入验证机制,就可能会产生基于DOM的XSS漏洞。

在Web 2.0环境下的漏洞注入点的查找方面,文献[5-8]认为漏洞的注入点为表单和含有参数的URL。文献[11-13]漏洞注入点提取的思路主要是通过基于URL的广度爬虫算法获取相关页面,并通过正则表达式提出相关注入点。 文献[6,7]认为造成漏洞的值空间(相当于本文中的漏洞注入点)不仅包括表单输入数据、URL类数据,还包括客户端与服务器交互过程中交换的数据信息。与以上文献相比,本文提出的基于DOM状态改变的方式查找漏洞注入点的方法不仅考虑了待测页面的漏洞注入点,还考虑了其隐含页面的漏洞注入点。

在相关的漏洞测试方法研究方面,文献[11,13]使用的漏洞测试模块主要是通过构造数据包发送到服务器,然后分析返回的代码从而判定Web的安全性。文献[12]为了减少不必要的漏洞测试请求,使用了探子请求技术。与上述文献相比,本文提出了基于页面交互点相关的漏洞检测方法,充分分析了测试请求注入Web应用后相关的页面,能够有效检测漏洞,尤其是针对Stored XSS漏洞。

2漏洞注入点的查找与漏洞检测

为了更好地表述本文所提出的方法,本文给出如下几个定义。

定义1隐含页面——通过触发页面标签绑定的事件进入的URL并没有改变的页面。需要注意本文所指的隐含页面不包括通过超链接所指向的其他页面,也就是说当进入隐含页面时,页面的URL并没有改变。

定义2特征字符串——一个漏洞测试用例所对应的能表现存在漏洞的字符串。例如,该测试用例的特征字符串是页面弹框弹出的XSS字符串。

定义3漏洞特征——经过测试用例请求后响应的页面有弹框输出或者出现测试用例对应的特征字符串。例如,测试用例出现的漏洞特征是页面出现弹框且特征字符串为XSS。

定义4页面交互点相关的页面——当前页面通过标签、按钮等交互点能够跳转到的任何其他页面,包括隐含页面、和当前页面URL不同的页面。

为了提高漏洞检测率,减少漏洞漏报,本文主要从提高漏洞注入点查找数目和改进漏洞检测技术这两个方面来进行研究。本文针对XSS漏洞检测,主要分为以下两个方面:(1)漏洞注入点查找,主要完成待测页面的漏洞注入点的查找,包括待测URL的静态页面和隐含页面两个方面。漏洞注入点主要包括表单输入和含有参数的超链接。(2)漏洞检测,主要是针对已经查找的漏洞注入点,使用基于页面交互点相关的漏洞检测方法进行漏洞的检测。图1为本文的系统架构。

图1 系统架构图

2.1漏洞注入点查找

本文主要从静态页面和隐含页面这两个方面来进行漏洞注入点的查找。

在针对静态页面的漏洞注入点的查找方面,漏洞注入点的查找原理是通过获取当前页面的DOM结构,然后通过标签属性获取页面的相关漏洞注入点。具体来说,漏洞注入点的提取主要分为两个部分。

(1) 表单输入类漏洞注入点提取。表单输入主要是通过表单的input属性获取的。通过页面的DOM结构,根据input标签,如果input的type属性为text、textarea等,就认为是表单输入,并使用一个Vector容器保存起来。

需要注意的是,当页面嵌入iframe标签时,需要考虑获取ifame的相关的DOM结构,并获取其相关的漏洞注入点,这样可以保证找到更多的漏洞注入点。

在隐含页面的漏洞注入点查找方面,主要是通过加强对隐含页面的DOM结构的分析处理。不过关键问题是需要进入不同DOM结构的隐含页面,再使用静态页面的漏洞注入点查找思路在隐含页面查找漏洞注入点。所以本文提出了基于DOM状态改变的方式进行漏洞注入点的查找方法,通过模拟DOM状态的改变进入不同的隐含页面进行漏洞注入点的查找。

模拟DOM状态的改变进入隐含页面的具体方法是先定义页面的交互点(本文初步认为页面的交互点包括:a标签、div标签、span标签、button按钮等),然后模拟页面交互点绑定的事件从而达到新的DOM结构。需要注意的是,页面标签绑定的事件可能包括鼠标单击、双击以及拖拽等事件,本文目前仅模拟鼠标单击事件。如果新的DOM结构的URL没有改变但是DOM结构改变了,则认为该页面是隐含页面,并在该页面进行漏洞注入点的查找;否则需要回到初始页面模拟下一个交互点绑定的事件。具体的基于DOM状态改变的方式查找隐含页面的算法如下:

输入:待测页面的URL

输出:隐含页面的DOM结构

1.访问当前URL;

2.获取页面所有的交互点存入队列ClickList;

3.获取页面的DOM结构为initDom;

晋元庄路口南北方向允许车辆掉头,这对南北直行车辆行驶造成严重影响,不但会降低车速,还会降低交叉口的通行能力.

4.如果ClickList队列为空,结束,否则执行步骤5;

5.从ClickList队里取出一个交互点出队列,模拟事件;

6.获取当前DOM结构的currentURL;

7.比较currentURL和URL是否相同,如果相同执行步骤8,否则执行步骤10;

8.获取当前的DOMcurrentDom;

9. 比较initDom和currentDOM是否相同,如果相同执行步骤10,否则执行步骤11;

10.回到初始页面,执行步骤4;

11.currentDom就是寻找的隐含页面DOM结构,保存,执行步骤4。

2.2漏洞检测

为了提高漏洞检测率,本文主要采用基于页面交互点相关的漏洞检测方法进行漏洞检测。

常见的检测方法是通过将测试用例注入漏洞注入点,然后分析响应后的页面进行漏洞检测的判断。这种测试思路是不完善的,理由是注入测试用例后,测试用例的特征字符串不一定出现在服务器响应后的跳转页面中或测试用例注入的页面,也可能出现在Web应用的其他页面。本文将分析页面范围扩大至当前测试请求注入的页面,测试请求响应后的页面以及跳转页面的交互点相关的页面,这样可以提高漏洞检测率。

图2是基于页面交互点相关的漏洞检测方法的流程。

图2 基于页面交互点相关的漏洞检测方法

具体的方法步骤如下:

(1) 将漏洞注入点查找模块输出的漏洞注入点进行参数化并保存在队列中。

针对含有参数的超链接,将含参数的超链接进行分割处理,分割成为域名和参数,并定义一个URL实体类保存。

class URL{

long id;

String domain;

//保存URL域名

String[] params;

//保存对应的参数名称

}

针对表单输入,定义一个Input实体类保存。

class Input{

long id;

String type;

//表单输入类型

String value;

//表单输入对应的名称

}

(2) 从队列中取出待测漏洞注入点。注意的是使用测试用例作为URL类注入点的params属性所对应的值,表单输入类的value属性所对应的值。

(3) 使用一个3~8位的普通字符串(字母和数字随机组合)作为测试用例进行测试请求。

(4) 查看测试用例注入页面是否有该普通字符串。

(5) 查看服务器响应后的跳转页面是否存在该普通字符串。

(6) 查看跳转页面的交互点相关的页面是否存在该普通字符串。在跳转页面提取该页面相关的交互点,这个页面交互点包括超链接、按钮以及其他任何导致当前页面跳转到其他页面的交互点。模拟页面交互点绑定的事件,进入该页面交互点的相关页面,查看是否有该普通字符串。

(7) 如果(4)-(6)三个步骤均未发现该普通字符串,则认为该漏洞注入点无漏洞,没有必要进行后续的测试请求,继续测试下一个漏洞注入点。否则,转(9)。

(8) 认为该漏洞注入点存在漏洞注入的可能,分别使用测试用例数据包的测试用例进行漏洞的检测。本文选择的测试用例数据包是由国外著名安全工程师Rsnake总结的XSS cheat sheet。该XSS cheat sheet几乎涵盖了目前所有可能触发XSS的测试用例。

(9) 如果使用测试用例数据包的测试用例进行测试后,测试用例注入页面、服务器响应后的跳转页面、跳转页面的交互点相关的页面均未出现测试用例对应的漏洞特征,认为该漏洞注入点不存在漏洞,继续下一个漏洞注入点的测试;否则,认为该漏洞注入点存在漏洞。

3实验分析

为了验证本文提出的方法的有效性,本文进行了原型系统的实现。开发过程中使用的是64位Win 7操作系统,集成环境为Java+Eclipse,该原型系统是基于Ajax爬虫系统CrawlJax进行二次开发实现的,漏洞检测过程中使用了Selenium安全测试框架模拟浏览器的事件操作。

为了检测本文提出的方法以及实现的原型系统的有效性,本文针对真实的互联网网站进行了漏洞检测,并与其他的漏洞检测软件做了对比。其中,网站一是个人博客网站,具有个人博客管理功能,未使用Ajax技术开发。网站二、网站三均是使用Ajax技术开发的网站,分别是某搜索网站和某微博网站。

下面给出一个实例。如图3是测试网站一的个人博客的添加文章页面。这里我们向文章内容对应的文本框注入测试用例,文章标题对应的内容为ss。

图3 测试网站页面

图4是用户添加文章成功后跳转的页面,发现页面并没有弹框输出。

图4 测试用例注入后调整的页面

然而当我们点击文章标题ss查看时(这里是一个超链接,也就是页面的交互点),就会发现如图5所示的漏洞弹框出现。

图5 漏洞检测结果

通过上述过程可以发现测试网站页面存在XSS漏洞,实际上该漏洞是一个Stored XSS漏洞。如果通过查看服务器响应后的页面进行漏洞检测的判断, 并不能发现上面例子的漏洞。我们需要在跳转后的页面模拟交互点的操作,查看页面交互点相关的页面,从而发现漏洞。

本文具体的XSS漏洞检测结果如表1-表3所示。其中,URL代表含参数的站内链接,表单代表表单输入,漏洞指的是检测XSS漏洞的数目。

表1 网站一的XSS漏洞检测结果

表2 网站二的XSS漏洞检测结果

表3 网站三的XSS漏洞检测结果

实验检测过程中发现本方法在网站一中未发现隐含页面,漏洞的发现是采用基于页面交互点相关的漏洞检测方法。本方法在网站二的隐含页面发现一个URL类注入点,且存在漏洞。本方法在网站三的隐含页面发现一个URL类注入点、一个表单类注入点,检测表明该URL类注入点不存在漏洞,表单类注入点存在漏洞。通过上述发现可以总结出:本方法能够在隐含页面查找到漏洞注入点,且利用这些漏洞注入点能够发现漏洞。针对相同的漏洞注入点,本文所采用的漏洞检测方法能够检测到其他方法不可以检测到的Stored XSS漏洞。

通过实验数据,将本文设计的原型系统与其他工具相比较可以得出以下几点:(1)XSS-Me是针对单个页面的测试,且仅支持当前静态页面的表单类注入点的查找。本方法考虑了隐含页面的漏洞注入的查找。(2)Wapiti主要考虑的漏洞注入点包括:脚本和表单输入,并没有考虑含有参数的超链接,而含有参数的超链接也是造成跨站脚本漏洞的原因之一,这样会造成漏洞漏报。(3)Paros3.2.11主要是通过代理服务器的方式拦截或修改客户端和服务器之间传送的数据信息(包括cookie信息和表单信息)发现漏洞。但是该工具使用的测试用例数据包较少,造成对漏洞注入点分析不足,产生漏洞。(4)本方法目前也仅支持网站的单个页面的漏洞的检测,不支持框架式网站。

实验证明本文提出的基于DOM状态改变的方式进行漏洞注入点的查找方法能够在隐含页面查找到漏洞注入点,并且针对这些漏洞注入点进行测试用例请求,能够检测到漏洞。此外,通过基于页面交互点相关的漏洞检测技术对这些漏洞注入点进行检测,由于充分考虑了服务器响应的页面,提高了存储型XSS漏洞检测个数。

4结语

针对现有的Web应用程序中的隐含页面的大量存在造成的漏洞注入点比较隐蔽以及漏洞检测率低的问题,本文提出了基于DOM状态改变的方式进行漏洞注入点的查找方法以及基于页面交互点相关的漏洞检测方法,并在实际应用中取得了很好的效果。在后续实验中,为了进一步提高漏洞检测效率,本文将考虑基于漏洞攻击位置的不同,使用不同的测试用例进行漏洞检测。本方法目前发现存在以下问题:表单输入达到新的DOM状态,必须是要有意义的输入,否则无法达到某些新的状态;对于含有账号输入的Web应用爬虫效果不是很好,一般总

会重定向到首页;漏洞注入点是否可以进一步去重,提高漏洞检测效率。为了进一步提高实验的效果,后续工作将从以上三个方面来考虑。

参考文献

[1] Scholte T,Balzarotti D,Kirda E.Have things changed now? An empirical study on input validation vulnerabilities in web applications[J].Computers & Security,2012,31(3):344-356.

[2] Williams J,Wichers D.OWASP Top 10-2013 rcl-the ten most critical web application security risks[J].The open wep application security project,2013.

[3] Wei S,Ryder B G.Practical blended taint analysis for JavaScript[C]//Proceedings of the 2013 International Symposium on Software Testing and Analysis.ACM,2013:336-346.

[4] Behfarshad Z,Mesbah A.Hidden-web induced by client-side scripting:An empirical study[M]//Web Engineering.Springer Berlin Heidelberg,2013:52-67.

[5] Duchene F,Rawat S,Richier J L,et al.LigRE:Reverse-engineering of control and data flow models for black-box XSS detection[C]//Reverse Engineering (WCRE),2013 20th Working Conference on.IEEE,2013:252-261.

[6] Saxena P,Akhawe D,Hanna S,et al.A symbolic execution framework for javascript[C]//Security and Privacy (SP),2010 IEEE Symposium on.IEEE,2010:513-528.

[7] Saxena P,Hanna S,Poosankam P,et al.FLAX:Systematic Discovery of Client-side Validation Vulnerabilities in Rich Web Applications[C]//NDSS.2010.

[8] Chufeng Z,Qingxian W.Systematical Vulnerability Detection in Browser Validation Mechanism[C]//Computational Intelligence and Security (CIS),2011 Seventh International Conference on.IEEE,2011:831-836.

[9] Antunes N,Vieira M.Enhancing penetration testing with attack signatures and interface monitoring for the detection of injection vulnerabilities in web services[C]//Services Computing (SCC),2011 IEEE International Conference on.IEEE,2011:104-111.

[10] Mesbah A,van Deursen A,Lenselink S.Crawling Ajax-based web applications through dynamic analysis of user interface state changes[J].ACM Transactions on the Web (TWEB),2012,6(1):3.

[11] 陈建青,张玉清.Web 跨站脚本漏洞检测工具的设计与实现[J].计算机工程,2010,36(6):152-154.

[12] 王强,蔡皖东,姚烨.基于渗透测试的跨站脚本漏洞检测方法研究[J].计算机技术与发展,2013,23(3):147-151.

[13] 沈寿忠,张玉清.基于爬虫的 XSS 漏洞检测工具设计与实现[J].计算机工程,2009,35(21):151-154.

收稿日期:2015-03-04。国家自然科学基金项目(61202074)。左丹丹,硕士生,主研领域:Web安全。王丹,教授。付利华,讲师。

中图分类号TP391

文献标识码A

DOI:10.3969/j.issn.1000-386x.2016.07.063

DESIGNING AND APPLICATION OF AN XSS VULNERABILITY DETECTION METHOD

Zuo DandanWang DanFu Lihua

(SchoolofComputerScience,BeijingUniversityofTechnology,Beijing100124,China)

AbstractCross-site scripting (XSS) vulnerability is the one more popular in recent years,along with the wide use of Ajax technology,its harmfulness and rapid dissemination capability are getting increasingly serious.Existing vulnerability detection techniques do not sufficiently focus on studying the vulnerability injection points of XSS vulnerability,and the vulnerability detection techniques used do not fully consider the response pages after requesting the tests as well,which leads to the relatively low vulnerability detection rate.For the shortcomings mentioned above,we enhanced the analysis of DOM structure of the hidden webpage,and proposed the method to search vulnerability injection points based on the way of DOM status changing.According to that we also proposed a new vulnerability detection method which is based on the correlation of webpage interaction points,and designed and implemented the vulnerability detection prototype system.Experimental results showed that this prototype system could effectively find more vulnerability injection points and could effectively improve vulnerability detection rate.

KeywordsCross-site scripting(XSS) vulnerabilityVulnerability injection pointHidden webpageVulnerability detection

猜你喜欢
表单测试用例脚本
酒驾
电子表单系统应用分析
安奇奇与小cool 龙(第二回)
基于SmartUnit的安全通信系统单元测试用例自动生成
基于混合遗传算法的回归测试用例集最小化研究
浅谈网页制作中表单的教学
快乐假期
小编的新年愿望
基于依赖结构的测试用例优先级技术
动态表单技术在教学管理中的应用*