郭晓军,闫宇辰,吴志浩
(西藏民族大学a.信息工程学院;b.西藏自治区光信息处理与可视化技术重点实验室,陕西咸阳 712082)
随着Web 应用的普及,出现一系列安全问题。其中跨站脚本(Cross Site Scripting,XSS)是Web 中一个持续存在的问题,在2017 版OWASP Top 10 中,XSS攻击位列第7[1]。XSS 攻击主要由于攻击者往Web页面里插入恶意HTML 代码,当用户浏览该页时,嵌入该Web页面的HTML 代码会被执行,达到恶意攻击用户的特殊目的[2-3]。其主要危害有网络钓鱼,会话劫持后执行任意操作,强制弹窗,网页挂马等,给普通用户和企业带来严重危害[4-5]。
常见的XSS 检测方式主要有静态分析[6]和动态分析[7]。静态分析技术通过分析Web 应用的源代码或对目标代码进行语法分析及对源码结构和数据处理过程分析,发现系统潜在漏洞[8]。与动态分析相比,检测效率和准确度相对较高。Ibéria 等[9]提出使用静态分析的方法,找出并删除Web 应用程序中潜在的漏洞。邱子谨[10]设计并实现基于静态分析的PHP 源码缺陷自动检测工具,采用基于格的数据流分析框架并提出一种基于有效路径的污点分析方法,对污点型漏洞有着较高的检测率,但只能针对PHP 语言进行分析,具有局限性。
但大多数情况,无法直接获取程序源码,且无法分析用户和Web 应用交互所造成的一些与环境相关的漏洞,无法保证漏洞检测的全面性[11]。王丹等[12]充分提取XSS 漏洞注入点,模拟用户行为,触发Web 页面交互点,制定规则并选择合适的攻击载荷验证漏洞存在,但检测效率较低。赵跃华等[13]设计了一种结合黑盒测试与动态污点分析技术的XSS 漏洞检测方案,依据XSS 攻击向量模版,对不同注入点选择合适攻击载荷,并根据过滤规则集测试结果进行反过滤变换,但XSS 源代码种子库覆盖面不全,导致检测准确度降低。吴子敬等[14]定义一套可绕过服务器对XSS 漏洞代码进行过滤的反过滤规则集,通过反过滤规则集对XSS代码进变换,使其绕过过滤成功执行。但攻击向量模板和变换规则的不全面导致检测准确度下降。马富天等[15]提出一种动态分析方法,候选元素与初始攻击向量组合,在特定输出点自动生成对应攻击向量,并自动调整向量优先级。倪萍等[16]为指定规则构造的模糊测试用例设置初始权重,依据输出点类型,选择对应有潜力的攻击载荷并对其进行变异操作形成变异攻击载荷作为请求参数,对网站响应进行分析,调整元素的权重以便生成更加高效的攻击载荷,提高了检测效率。
用动态分析方法进行漏洞检测时,无需程序源码,但为降低误报率而增加攻击向量数量,则会导致服务器负荷增加,也降低了检测的效率。本文根据初始载荷的位置选择适当的绕过方式,形成攻击向量库,再对注入点进行模糊测试(Fuzzing),提高了检测效率。
为了提高检测效率,同时保证较高的准确度,本文基于抽象语法树(Abstract Syntax Tree,AST)解析和Fuzzing,提出了F-Xscan 漏洞模型。通过识别合法向量在返回页面中的位置,选择适当的攻击载荷,并与绕过规则进行适当组合,形成攻击向量库。
(1)AST语法树。AST 是一种分层程序表示,以树状的形式表现编程语言的语法结构,树上的每个AST 节点对应于源代码的一项[17]。
(2)语法分析器。语法分析器(Parser)通常作为编译器或解释器的组件出现,其作用是进行语法检查,并构建由输入单词组成的数据结构。本文采用了AST语法树对HTML 和JavaScript 进行解析,可准确判断回显的位置,便于下文攻击载荷的生成。
(3)动态分析。动态分析主要是模拟攻击者攻击的过程,向注入点写入包含特定代码的脚本,分析服务器返回的页面响应内容,如果响应内容中存在特定的数据,则表示存在XSS 漏洞。
(4)模糊测试。模糊测试[18]是一种基于缺陷注入的自动化软件漏洞挖掘技术,其基本思想与黑盒测试类似。模糊测试通过向待测目标软件输入一些半随机的数据并执行程序,监控程序的运行状况,同时记录并进一步分析目标程序发生的异常来发现潜在的漏洞。本文采取模糊测试的方式,对最终攻击向量进行确定。
本文提出的F-Xscan漏洞检测模型共分为4 个部分,分别为探针载荷测试、初始攻击载荷生成、绕过规则选择和最终攻击向量生成等模块。总体模块设计如图1 所示。
图1 F-Xscan漏洞模型
反射型XSS 漏洞产生的原因是服务器端对用户输入恶意数据未过滤,直接“反射”给浏览器,即用户输入的参数直接输出到页面上。所以,首先要验证良性输入向量是否能在页面中回显。此处良性输入向量即为探针载荷。若确认页面回显,则当前页面可能存在反射型XSS 漏洞。
探针载荷生成过程:
式中,β≥0为一个与状态的先验分布信息有关的参数,调节β可以提高协方差矩阵的精度。对于高斯分布来说,β=2是最优的。
(1)输入待检测的URL,确认请求方法及请求参数。
(2)生成良性载荷。选取随机6 位数字、字母组合作为参数,并发送请求包。例如“kc4d9”。
(3)根据HTML、JavaScript、CSS 语法树解析,找到良性载荷的位置。根据载荷所处位置的上下文语法,形成对应初始攻击向量。
(4)若良性载荷在页面中无回显,则不存在反射型XSS。
良性攻击载荷回显流程如图2 所示。
图2 良性攻击载荷回显
有害数据的输入可能会触发浏览器的防御机制,而无法准确判断XSS 漏洞是否存在[19]。本文构造一种初始攻击载荷,以良性载荷为基础,构造载荷的逃逸来判定漏洞是否存在,避免过滤机制的触发使得结果更为准确。
根据图2—探针载荷在页面中输出的位置,运用AST 语法树解析、分析输出点类型,选择对应的标签、符号闭合。以探针载荷为初始值对应生成初始攻击载荷。该初始攻击载荷由回显页面对应上下文得出。预处理得到的初始攻击载荷更符合页面的攻击语法规则,使得攻击方案更优,减少后续不必要的模糊测试开销。在保证准确率的同时,提高了效率。
(1)确认探针载荷回显后,分析回显页面结构。
(2)根据回显位置,选择适当的逃逸技术和逃逸行为组成初始攻击载荷。
初始攻击载荷生成规则见表1,逃逸技术及行为见表2。
表1 初始攻击载荷生成规则
表2 逃逸技术及行为
例如可控点位于HTMLAttribute:
首先发送良性探针载荷“kc4d9”,确定值“1”可控。通过AST 语法树解析知,可控值“1”位于<textarea ></textarea >标签之间和<img >标签的src属性中。由表1、2 可知需先闭合src 属性,再闭合<textarea >标签。所以初始攻击载荷为</textarea >”><svgonload =alert(1)>。
越来越多的网站都制定了拦截规则,对用户提交的数据进行拦截和过滤。在一定程度上减少了用户的恶意输入,减少了漏洞的产生。但仍有不完全的过滤方式使得网站存在漏洞。针对Web 应用中常见的过滤方式进行归纳总结,制定了自己的规则即过滤机制的逃逸技术。对1.4 节初始攻击载荷进行变异,用于攻击向量库生成阶段。总体绕过对象分2 种:过滤符号和过滤关键字(见表3)。
表3 绕过对象
制定绕过规则库(见表4)。
表4 绕过规则库
在1.4、1.5 节中,制定了逃逸规则和绕过规则。本小节对初始攻击载荷进行上述2 种类型规则的组合绕过,生成攻击向量库。攻击向量样本见表5。
表5 最终攻击向量样本
表5 罗列了部分生成的攻击向量。以往对攻击向量的选取,普遍采用随机选择的方法。虽然其单个选择时间短,但随机性较大,易造成无目的的选取。使其效率及准确率降低,造成检测效果的不理想。
本文在初始攻击向量的基础上,添加绕过规则,随机生成最终攻击向量。根据网站的过滤情况自动调整绕过规则的选取,使其更快速准确地检测出漏洞。对传统的随机产生向量的方法进行了补足。
为客观、有效地评估本文提出的反射型XSS 漏洞检测模型,搭建了2 个XSS 漏洞检测平台,并与其他Web 漏洞检测模型对比分析,得出最终结论。
环境1Damn Vulnerable Web Application(DVWA)是基于PHP/MySQL 环境编写的,用来进行安全脆弱性鉴定的Web 应用,帮助网络安全专业人员在合法的环境中测试其专业技能。实验选取了其安全等级为Low 和Medium 时做对比测试。
环境2该站点是以PHP 语言开发,搭载MySQL数据库的自行搭建的博客站点。
Acunetix Web Vulnerability Scanner(AWVS)是一款Web 应用程序漏洞扫描工具。在其扫描并发现漏洞后,将模拟黑客攻击过程,在可输入数据的地方自定义脚本,尝试不同输入组合。实验选取的版本为AWVS 11。
Burp Suite 是用于攻击Web 应用程序的集成平台,开启代理模式后,将作为一个在浏览器和目标应用程序之间的中间人,允许拦截、查看和修改在2 个方向上的原始数据流。实验选取的版本为Burp Suite V1.7.31。本机环境及配置见表6。
表6 本机环境及配置
设置对比试验,将模型与2 款著名Web 漏洞扫描软件做对比,验证了本文模型的检测效率和准确率。检测准确率和误报率,见表7。
表7 博客环境检测结果
为排除爬虫对检测时HTTP 请求次数的干扰,本文只统计反射型XSS 检测时各模型选取载荷测试时的请求,总共对30 个注入点进行了测试。对博客环境HTTP 平均请求次数测试如图3 所示。
图3 博客环境HTTP 平均请求次数
对DVWA环境HTTP 平均请求次数测试见表8。
表8 DVWA 环境HTTP 平均请求次数表
由表7、8 及图3 所示,与传统的Web 漏洞检测模型Burp Suite 和AWVS 相比,针对探针载荷在输出页面上下文点的类型,选取适当绕过规则形成攻击向量,该方法在一定程度上减少了HTTP 请求,降低了页面负载。同时根据上下文类型可更好地确定漏洞是否存在,具有更高的准确率,同时保持了较低的误报率。
针对当前反射型XSS 漏洞检测效率较低,误报率较高的问题,提出了一种基于AST 分析和Fuzzing 的反射型XSS 漏洞识别模型。利用AST 语法树分析在请求后的Web 页面中,探针载荷的回显位置,选取合适的初始攻击载荷。再根据该Web 页面过滤情况,结合绕过规则,生成攻击向量库,对可疑Web 注入点进行Fuzzing。仿真结果表明,本文方法在检测效率较高的同时,有着较低的误报率。