当用户访问Web页面时,如果浏览器执行了攻击者向Web页面中插入的恶意脚本代码时,就会引发跨站脚本(cross site script,XSS)漏洞攻击,造成窃取用户敏感信息、劫持用户浏览器等安全问题[1-2]。XSS漏洞攻击属于代码注入式漏洞攻击,根据开放式Web应用程序安全项目(open web application security project,OWASP)[3]发布的Web应用安全漏洞统计,XSS漏洞已连续几年均列十大安全漏洞前三名。目前,随着JavaScript语言和Ajax技术的普遍使用,动态交互的网络应用在丰富网络内容、增加用户体验的同时,也容易引发较严重的网络安全问题,因为任何能够提供用户信息交互的地方都可能成为XSS攻击者提交恶意攻击脚本的载体,成为漏洞的注入点[4]。如果Web应用系统未对输入的内容进行有效验证,也没有严格的过滤机制对可能含有恶意脚本的内容进行过滤,就可能引发XSS漏洞攻击[5]。渗透测试技术通过模拟攻击和对Web响应进行分析来检测安全漏洞,已成为动态发现Web漏洞的有效手段之一[6-7]。如何有效发现漏洞注入点、并构造测试有效的攻击向量以提升漏洞检测效率和覆盖率是渗透测试需要研究解决的关键问题之一,尤其是XSS漏洞攻击本身具有复杂的攻击方式,检测效果在很大程度上依赖于漏洞注入点发现的全面性和漏洞攻击向量设计的完整性。
本文提出了基于隐马尔科夫模型(hidden Markov model,HMM)的攻击向量动态生成和优化方法,并基于数据的输出位置对攻击向量进行了分类,设计并实现了基于渗透测试的XSS漏洞检测的原型系统。
1 攻击向量生成及优化 1.1 种子攻击向量目前,在使用攻击向量进行XSS漏洞动态检测过程中,绝大多数都是使用基于XSS Cheat Sheet的攻击向量集,并在此基础上进行相关的变形,作为最后的攻击向量。在此过程中,种子攻击向量的选择一般都来自现有的攻击向量集合,包括XSS Cheat Sheet攻击脚本,以及根据xssed网站中发布的XSS攻击所采用的脚本。
种子攻击向量是对攻击变量进行变形的基础,它被从攻击向量队列中读出之后经过如下几种操作,如URL编码、HTML实体替换、UTF-8编码、Base64编码、Hex编码以及用String.fromCharCode()函数和插入特殊字符、随机字符的大小写变形等,产生多种变形后成为新的攻击向量,随后再经过对重复的攻击向量的筛除,继续作为下一次攻击向量种子,最后通过响应函数prifix()函数引入的前缀符号,如“; ”、“〉”、“&”、“′〉”、“+〉”、“\>”和“>”等,与Web页面中的“ < ”,“+”闭合,使上述攻击向量成为能够被浏览器解析执行的自由脚本。
1.2 攻击向量结构引发XSS攻击的攻击向量有很多种,它们本身有一定的组成规则:1)它所包含的恶意脚本被浏览器加载执行;2)能够执行具有特定目的攻击动作;3)符合HTML语义逻辑。本文基于语法规则,将攻击向量的语法分为备选符号集、攻击向量形式说明、变形规则说明三部分,分析如下。
1) 备选符号集。如HTML中标签、JavaScript的敏感词和CSS的敏感符号,即可能出现于攻击向量中的语法符号。参考并整理文献[8-9],本文涉及的备选符号集分为如表 1所示的三部分。
2) 攻击向量形式说明。通过相关的文献和收集的攻击向量发现:攻击向量主要由分隔符、HTML标签、一个或者多个属性的组合,表 2给出部分示例。
3) 变形规则说明。通过编码、混编大小写、添加空白字符等变形操作而绕过代码过滤,是攻击向量常用的一种策略。攻击向量的变异就是通过使用变形规则自动生成攻击向量,达到绕过Web站点中过滤器的目的。
1.3 攻击向量分类本文以合法请求向量在Web页面中的输出点为依据,对攻击向量进行分类,达到减少访问XSS注入点、减少与服务器交互次数、提高效率的目的。输出点分类如表 3所示。
本文攻击向量自动化生成方法的基本过程是:根据前文攻击向量的结构分析中选取一种攻击向量的组合形式,然后从攻击向量符号集中选择一个备选字符集的值,并且随机选取恶意符号功能集和分隔符集中的元素值,最后根据组合规则组合生成一个基本的攻击向量。基本攻击向量结构定义如下:
Class BasicAttackVector{
String vectorType; //基本攻击向量组合形式
String vectorPattern; //攻击向量符号集类型
String vectorValue; //攻击向量备选字符}
下面给出一个攻击向量生成实例:
1) vectorType:基本攻击向量组合形式。假设为 < HTML_TAG HTML_EVENT=JS_S > < /HTML_TAG > 。为了生成攻击向量,首先选取该种攻击向量的组合形式。
2) vectorPattern:HTML备选字符集。以组合形式为基础,分别从HTML_TAG、HTML_EVENT集中选取HTML标签和事件属性,并且从恶意功能符号集中选择JS_S类型,组成基本的攻击向量。
3) vectorValue:备选符号集的值。根据步骤2)中的符号集,选取对应符号集备选值中的任意一个,如 < button > 标签、onmousedown事件属性和alert(111)作为攻击串。
基于此,攻击向量就成为
< button onmousedown=alert(111) > test < /button > 。
考虑合适的攻击向量与非法的攻击向量语法方面的差别,本文使用HMM模型对攻击向量进行优化:用通过正常训练样本集学习的语法M代表合适的行为模式,与语法M有较高符合度的测试样本就被认为是合适的攻击向量;否则判断为非法的攻击向量。样本特征提取和样本分类基于HMM语法检测的两个过程,特征提取结果是样本的异常测度评估a,异常测度a高的样本被认为是非法的攻击向量。对样本的分类则是基于a和分类阈值a0:a≤ a0的样本为合适的攻击向量,加入攻击向量库中。
为提高检测效果,本文首先对初步生成的攻击向量进行分类处理,使用的是决策树分类算法[10]。这样一来,在使用探子技术检测到输出点种类后,即可根据输出点的类型开展测试,因此减少了不必要的测试。构建决策树的前提是创建其测试样本,本文以攻击向量分类策略来选取特征属性及其取值,并用一个二维数组对象来表示特征值,每条待分类的样本数用数组中的行表示,行中元素的值为该样本对应属性的取值。另外,需要将结果输入到决策树中作为决策树分类学习的依据,因为用于构建决策树的样本的分类是已知的。决策树的构建采用递归方式完成。首先找到一个划分值,基于该划分值判断节点是否为叶子节点,然后对非叶子节点进行划分。
而后就可以使用构建的决策树对已优化后的攻击向量自动分类,产生攻击向量库。表 4即为使用优化模型之后生成的攻击向量部分例子。
XSS漏洞攻击经常利用代码混淆技术将恶意代码加以注入。常用的漏洞攻击检测方法多采用特征检测识别的方式对脚本语言是否包含跨站脚本攻击的恶意特征进行检测。然而,针对HTML语言经过代码混淆后并不能完全直接展示恶意代码的特征,而是隐藏在代码逻辑中,使得传统的检测方法无法工作,增加了对XSS攻击的检测难度。通过对跨站脚本种子攻击向量的变形可产生攻击向量的多个变种,变形方法主要有编码、混合编码、插入特殊字符等。使用URL编码等变形算法后最终生成的攻击向量,举例如下:
x′ > < a HrEF=jaVAscRIPt:alert(111) > Click < /a >
x-- > < AudiO oNerROr=alert(111) sRc=x > Click < /aUDIo >
< Body sTYlE=BackgrOUnD-Image:uRl(JavAscripT:alert(111))
> Click < /Body >
x > < buTtOn onMouSeoUT=
\u0077\u0072\u0069\u0074\u0065(111) > Click < /buTtOn >
< iMG lOwSrC=jaVasCrIPT:prompt%283%29 / >
x > x′ > x" > x— > < A hREf=JAVAscrIPT:alert(111) > Click < /a >
< /tiTle > < scRipt > alert(111) < /scRipt >
2 漏洞攻击注入点分析 2.1 注入点的查找为进行漏洞检测,应抓取Web应用中的所有页面,并进行分析,提取所有可用注入点[11-12]。对于普通的HTML文档中的漏洞注入点的查找,本文采用构建DOM树并分析DOM树节点、查找普通的输入标签以及URL中的变量注入的属性的方法来完成。其中主要分析和处理页面中 < form > 、< a > 、< input > 、< text > 、< textarea > 等标签,将其相关的属性添加相应的URL中进行路径补全,并将其保存到初始的注入点列表队列。
对使用Ajax技术的Web应用的漏洞注入点查找,就是增量地构建Ajax应用状态流图的过程,通过比较事件触发前后的DOM结构来判断是否产生新的Ajax应用状态,并将新状态和转换添加到状态图中。当DOM状态发生改变时,检测Web响应页面是否出现与注入数据相关的反馈数据来判定注入漏洞的存在。
2.2 URL去重由于相同功能的表单可能会位于一个Web应用的不同页面中,例如,完成搜索功能的标签等,因此无需对这些表单中的注入点进行重复检测。本文使用Bloom Filter算法对已提取的注入点进行去重处理。Bloom Filter的初始状态是用一个包含m位的位数组itemVector表示,每个位置的值都设置成0。为了将URL或注入点ID映射到itemVector中,本文采取5个hash函数,分别是:RSHash、SDBMHash、BKDRHash、ELFHash和JSHash,利用这5个独立的hash函数对任意一个URL或注入点id进行hash运算,共得到5个hash值:hash1、hash2、hash3、hash4、hash5。然后,将这5个hash值映射到itemVector数组的索引,并将该索引位置的数组元素值设置为1。后续的URL或注入点ID映射时,判断映射的位置的元素是否全为1,若元素不全为1,则该URL或注入点ID不重复,将其添加到对应的URL列表或注入点列表,并将该索引位置的元素设置为1。若映射位置的元素全为1,则该URL或注入点ID已经存在。基于Bloom Filter的URL去重算法描述如算法1所示。
算法1 Bloom Filter去重算法
输入:原始URL或注入点ID队列
输出:去重后的URL或注入点ID队列
1) 创建初始位数组itemVector[m],并将每个元素值初始化为0;
2) 从URL或注入点ID队列中取出一条数据item;
3) 将item分别经过RSHash、SDBMHash、BKDRHash、ELFHash和JSHash这5个hash函数运算,得到5个hash1、hash2、hash3、hash4、hash5;
4) 将这5个hash值与itemVector数组长度m做模运算,可得到五个索引index1、index2、index3、index4、index5;
5) 判断5个索引位置的元素是否全为1,若全为1,则该URL或注入点ID已经位于URL或注入点ID队列,直接舍弃;
6) 若不全为1,则将URL或注入点ID加入相应的去重后的队列中,并且将itemVector数组中对应索引位置不为1的元素值更新为1;
7) 重复步骤2)~6),直到原始URL或注入点ID队列元素全部判断完为止;
8) 返回去重后的相应队列,算法结束。
3 攻击与响应分析 3.1 响应过程XSS漏洞攻击检测过程就是不断取出注入点、生成攻击向量并发送HTTP请求,然后分析响应页面信息并生成漏洞检测报告的过程[13-14]。为减少逐条使用攻击向量模拟攻击行为引发的与服务器的交互次数,本文先通过发送探子请求,再根据探测结果决定是否有进一步。在对响应探子请求的页面分析时,采用DOM路径定位技术对输出点的类型予以分析。而后,从对应类型的攻击向量库中逐条取出攻击向量对注入点进行检测。确定该注入点是否存在XSS漏洞攻击的依据是响应页面中若存在与攻击向量相同的字符串,就断定存在XSS漏洞攻击,然后记录相关的检测点和攻击向量信息,结束检测;否则,继续逐条对攻击向量库的攻击向量进行分析检测,直至攻击向量库为空。
需要说明的是,存储型XSS的输出可能不在响应页面中,而是位于其他页面,这时要确定注入点是否为Form表单。当为Form表单时,再进行如下过程的存储型XSS攻击检测:找到Form表单提交后的响应页面,这需要遍历所有的页面。为提高效率,本文对Form-stored队列中的每一个Form表单采用唯一的一个合法向量进行探子请求,即采用java.util.UUID类的randomUUID()方法来生成。之后,从hash值发生变化的文件中查找对应的合法向量,基于合法向量与Form表单间的对应关系,就可生成Form表单及其响应页面的对应集合。最后,再依次提交攻击向量对每个Form表单进行测试。
3.2 两次探子请求探子请求技术是用来判断有无后续检测的必要,以降低无效检测引发的额外服务器压力,提高检测效率。本文中,采用UUID(Universally Unique Identifier)作为探子请求字符串,它是一个128位的16进制表示的数。在完成提交该请求字符串后,若响应页面返回了该字符串,且注入点不是Form表单,则可认为该注入点不存在XSS漏洞,停止攻击向量测试。若无返回字符串,但注入点存在于Form表单,就将该注入点加入Form-stored队列中,继续开展存储型攻击向量检测[8];若注入点不存在于Form表单中,则分析并记录该探子字符串的DOM路径,为后续漏洞检测和结果分析提供支持。然后第二次使用探子请求技术,本次探子请求字符串在上次的探子字符串基础上添加alert(111) < br > ,来判断Web服务端是否对“ < ”进行了过滤或编码。
使用两次探子主要是为了提高漏洞检测效率,减轻服务器的测试压力。第一次探子请求主要用来判定是否有对某个注入点进行后续检测的必要,以及记录探子字符串的DOM路径,提高后续漏洞检测中结果分析的效率;第二次探子请求主要是用来判断Web站点是否对特殊字符进行编码过滤,若服务端对特殊字符进行了编码,那么在选择攻击向量库时就不必使用未进行代码混淆处理的攻击向量。
3.3 XPath路径定位方法在响应分析阶段,若每次检测都使用静态页面分析技术来查找响应页面的话,效率会比较低,本文使用XPath路径定位技术来提升分析效率。作为一种表达式语言,XPath的返回值是以节点、节点集合、原子值以及节点和原子值的混合等形式出现,用于对XML文档节点树中的节点定位。采用探子请求技术之后,针对服务器返回的页面继续采用正则表达式来确定该页面是否包含探子请求字符串。若存在,则继续采用Xpath路径定位技术解析该HTML文件,也就是记录该探子请求字符串的DOM路径,实际上是记录从该文件的根节点 < html > 到探子请求字符串所在的标签节点的路径字符串,然后将该路径字符串保存下来。在后续的检测中,为了分析检测结果,直接使用Xpath定位技术,按路径字符串所标识的路径来解析HTML文件,查看该路径下是否存在本次检测所使用的攻击向量。这样就避免了每次检测时都需对HTML响应页面进行分析而影响响应效率的问题。
4 实验与分析本文的实验系统的设计如图 1所示。实验结果采用以下四个指标,分别是检测的漏洞个数、漏报率、误报率和响应时间来进行分析。
OWASP的开源项目提供了很多用于测试的网站,且XSSed.com网站也发布了存在XSS漏洞且尚未修复的网站,本文选择其中XSSer、Paros Proxy和本文设计的系统。XSSer则是基于渗透测试的XSS漏洞的检测工具,可绕过某些过滤;Paros Proxy是一个Web应用程序漏洞评估的代理程序,通过网站攻击扫描器实现XSS漏洞检测。
三种检测方法的对比如表 5所示。被检测样本来自于XSSed.com网站,100个是存在XSS漏洞且未被修复的样本,50是个修复漏洞后的样本。表 6为与OWASP开源项目WebGoat-6.0.1站点的比对分析。
从对比结果来看,Paros Proxy的误报率和漏报率极低,响应时间短。XSSer误报率较高,未能全部检测出存储型XSS漏洞。本文的方法在一定程度上降低了响应时间和漏报率,提高了性能,反应了对攻击向量进行分类整理的措施是有效的。
4.2 攻击向量自动化生成方法的测试与分析为测试本文提出的攻击向量自动化生成方法的有效性,我们分别选取了自建的攻击向量库以及收集的手动的攻击向量库,使用这两种攻击向量分别进行测试,比较分析本文提出的攻击向量自动化生成优化分类方法是否有效。我们从XSSed.com网站选取200个发布的XSS漏洞的样本,分别使用两种攻击向量库,对这些样本进行测试,以被发现的XSS漏洞个数作为评估标准来验证本文提出的攻击向量生成方法的有效性。使用手动攻击向量库检测的漏洞个数为163个,而使用自动攻击向量检测的漏洞个数为171个,两种方式攻击向量的表现基本持平,说明本文的自动化攻击向量生成方式是有效的。当然这和手动攻击向量的选取范围也有一定的关系。从检测效果来看,由于自动生成攻击向量的设计中加入了攻击向量的分类,提高了检测效率。
5 结论1) 基于HMM模型和决策树的漏洞攻击测试向量的生成、描述和优化方法,能够有效识别XSS漏洞注入点和漏洞攻击模式,可优化漏洞攻击向量的自动生成。
2) 使用探子请求技术对输出点进行DOM路径定位改进了漏洞检测中攻击向量逐条注入检测带来的效率低下问题。根据输出点类型来选择相应类型的攻击向量库,减少了漏洞检测中不必要的测试请求,提高了检测效率。
本文的方法尚未考虑DOM型XSS漏洞,无法对其进行有效检测,将在后续的工作中继续研究。
[1] |
VAN DEURSEN A, MESBAH A, NEDERLOF A. Analysis of web applications:prospects and challenges[J]. Science of computer programming, 2015, 97: 173-180. DOI:10.1016/j.scico.2014.09.005 (0)
|
[2] |
DEEPA G, THILAGAM, SANTHI P. Securing web applications from injection and logic vulnerabilities:approaches and challenges[J]. Information & software technology, 2016(74): 160-180. (0)
|
[3] |
OSWAP. Types of cross-site scripting[EB/OL]. https://www.owasp.org/index.php/TypesofCross-SiteScripting, 2017.
(0)
|
[4] |
GUPTA S, GUPTA B.B. JS-SAN:Defense mechanism for HTML5-based web applications against javascript code injection vulnerabilities[J]. Security and communication networks, 2016(9): 1477-1495. (0)
|
[5] |
SAXENA P, MOLNAR D, LIVSHITS B. SCRIPTGARD:automatic context-sensitive sanitization for large-scale legacy web applications[C]//Proceedings of Computer & Communications Security, 2011:601-614. http://dx.doi.org/10.1145/2046707.2046776
(0)
|
[6] |
程诚, 周彦晖. 基于模糊测试和遗传算法的XSS漏洞挖掘[J]. 计算机科学, 2016, 43(6A): 328-331. CHENG Cheng, ZHOU Yanhui. Finding XSS vulnerabilities based on fuzzing test and generation algorithm[J]. Computer science, 2016, 43(6A): 328-331. DOI:10.11896/j.issn.1002-137X.2016.6A.078 (0) |
[7] |
STOCK B, BEN S. Precise client-side protection against dom-based cross-site scripting[C]//Proceedings of the 23rd USENIX security symposium, 2014:655-670. http://dl.acm.org/citation.cfm?id=2671267&preflayout=flat
(0)
|
[8] |
王云. 基于爬虫和模糊测试的XSS漏洞检测工具设计与实现[D]. 广州: 华南理工大学, 2015: 28-30. WANG Yun. Design and implementation of XSS vulnerability detection based on crawler and fuzzing test[D]. Guangzhou:South China University of Technology, 2015:28-30. http://cdmd.cnki.com.cn/Article/CDMD-10561-1015987007.htm (0) |
[9] |
李冰, 赵逢禹. Stored-XSS漏洞检测的研究与设计[J]. 计算机应用与软件, 2013, 30(3): 17-21. LI Bing, ZHAO Fengyu. Study and design of stored-XSS vulnerability detection[J]. Computer application and software, 2013, 30(3): 17-21. (0) |
[10] |
莫勇. 基于决策树算法的Web客户端脚本安全检测研究[D]. 北京: 北京林业大学, 2015: 21-25. MO Yong. Research on security detection of Web client script based on decision tree[D]. Beijing:Beijing Forestry University, 2015:21-25. http://cdmd.cnki.com.cn/Article/CDMD-10022-1015319831.htm (0) |
[11] |
GUPTA S, GUPTA B B. Cross-site scripting (XSS) attacks and defense mechanisms:classification and state-of-the-art[J]. International journal of system assurance engineering and management, 2015: 1-19. (0)
|
[12] |
张伟伟. 基于特征注入的XSS漏洞检测模型研究[D]. 兰州: 兰州理工大学, 2016: 17-18. ZHANG Weiwei. Research on XSS vulnerability detection model based on feature injection[D]. Lanzhou:Lanzhou University of Technology, 2016:17-18. http://cdmd.cnki.com.cn/Article/CDMD-10731-1017802093.htm (0) |
[13] |
ROCHA T S, SOUTO E. ETSSDetector:A tool to automatically detect cross-site scripting vulnerabilities[C]//Proceedings of 13th International Symposium on Net Work Computing and Applications. IEEE Computer Society, 2014:306-309. http://ieeexplore.ieee.org/document/6924244/
(0)
|
[14] |
FABIEN D, ROLAN G, SANJAY R, et al. XSS vulnerability detection using model inference assisted evolutionary fuzzing[C]//Proceedings of Fifth International Conference on Software Testing, Verification and Validation. IEEE Computer Society, 2012:815-817. http://ieeexplore.ieee.org/document/6200193/
(0)
|