跨站脚本漏洞渗透测试技术

2017-12-06 06:46王丹顾明昌赵文兵
哈尔滨工程大学学报 2017年11期
关键词:字符串表单漏洞

王丹,顾明昌,赵文兵

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

跨站脚本漏洞渗透测试技术

王丹,顾明昌,赵文兵

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

为提升跨站脚本(XSS)漏洞检测方法的检测效果,本文提出了基于隐马尔科夫模型(HMM)的攻击向量动态生成和优化方法。采用决策树模型和代码混淆策略对攻击向量进行分类和变形,获得测试用攻击向量。使用注入点去重处理和探子技术去除一部分不存在XSS漏洞的Web页面,避免重复检测不同Web页面中相同的漏洞注入点,减少测试阶段与Web服务器的交互次数;进一步采用XPath路径定位技术提高漏洞检测结果分析的效率。对比实验结果表明,本文提出的方法降低了响应时间和漏报率,提高了检测效率。

跨站脚本漏洞; 渗透测试; 隐马尔科夫模型; 攻击向量; 注入点

当用户访问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所示的三部分。

表1 备选符号集分类

2)攻击向量形式说明。通过相关的文献和收集的攻击向量发现:攻击向量主要由分隔符、HTML标签、一个或者多个属性的组合,表2给出部分示例。

3)变形规则说明。通过编码、混编大小写、添加空白字符等变形操作而绕过代码过滤,是攻击向量常用的一种策略。攻击向量的变异就是通过使用变形规则自动生成攻击向量,达到绕过Web站点中过滤器的目的。

表2 攻击向量的组合形式

1.3攻击向量分类

本文以合法请求向量在Web页面中的输出点为依据,对攻击向量进行分类,达到减少访问XSS注入点、减少与服务器交互次数、提高效率的目的。输出点分类如表3所示。

1.4攻击向量生成

本文攻击向量自动化生成方法的基本过程是:根据前文攻击向量的结构分析中选取一种攻击向量的组合形式,然后从攻击向量符号集中选择一个备选字符集的值,并且随机选取恶意符号功能集和分隔符集中的元素值,最后根据组合规则组合生成一个基本的攻击向量。基本攻击向量结构定义如下:

Class BasicAttackVector{

String vectorType;//基本攻击向量组合形式

String vectorPattern; //攻击向量符号集类型

String vectorValue; //攻击向量备选字符}

下面给出一个攻击向量生成实例:

1)vectorType:基本攻击向量组合形式。假设为。为了生成攻击向量,首先选取该种攻击向量的组合形式。

2)vectorPattern:HTML备选字符集。以组合形式为基础,分别从HTML_TAG、HTML_EVENT集中选取HTML标签和事件属性,并且从恶意功能符号集中选择JS_S类型,组成基本的攻击向量。

3)vectorValue:备选符号集的值。根据步骤2)中的符号集,选取对应符号集备选值中的任意一个,如