APP下载

一种自动化的跨站脚本漏洞发现模型

2018-08-17马富天

计算机工程 2018年8期
关键词:脚本漏洞页面

马富天,,

(江南大学 物联网工程学院 物联网技术应用教育部工程研究中心,江苏 无锡 214122)

0 概述

跨站脚本(Cross-site Scripting,XSS)是当前最为普遍的Web安全漏洞之一。根据OWASP(Open Web Application Security Project)开放式Web应用程序安全项目在2007年—2017年期间进行了四次十大Web应用安全漏洞统计,报告显示跨站脚本攻击一直高居前列,是黑客攻击Web应用的主要手段之一。根据XSS攻击方式及特征,可以将它分为反射型跨站脚本(reflected-XSS)、存储型跨站脚本(stored-XSS)和基于文档对象模型的跨站脚本(DOM-based XSS)[1],其中,存储型跨站攻击的危害较大。产生跨站脚本的直接原因是由于Web应用程序缺少对用户输入的数据进行有效验证与过滤[2-3]。攻击者利用存在的漏洞把恶意脚本注入到页面中,当用户浏览这些页面时,会触发页面中恶意脚本的执行,对受害者发起信息盗取、会话劫持、网页木马挂载及破坏页面结构等各类攻击。

通常检测跨站脚本的方法主要有静态分析、动态分析和动静结合方式检测[4]。静态分析是通过审核源代码的方式来挖掘潜在的漏洞,如文献[5-6],其检测准确率和效率比动态分析方法高一些。但在多数情况下,检测人员都无法直接获得Web应用的源代码,并且它对程序逻辑数据处理中出现的问题不能有效的检测,对编程语言的类型也有一定的要求,同时其检测能力也受限于源代码的框架,可扩展性能力较差。动态分析是指在无需源代码的前提下,采用模糊测试的方法来挖掘漏洞。在动态分析方法中,文献[7]通过分析HTML5的新标签、新属性,引入了14个HTML5元素相关的初始攻击向量,基于这些攻击向量构建了攻击向量库,实现一个侧重于Webmail系统的动态跨站脚本检测工具,该工具能够有效的利用基于HTML5的攻击向量检测出系统中的XSS。文献[8]提出通过攻击向量规则库生成初始攻击向量,然后对初始攻击向量使用机器学习算法进行优化,大幅度的减少初始攻击向量库的大小,得到最后的攻击向量库。

本文针对反射型和存储型跨站脚本漏洞,提出一种动态检测XSS的方法。该方法首先通过自动爬虫爬取并分析Web应用的所有页面及注入点,然后根据输入点、输出点类型自动生成合法向量与攻击向量,在攻击过程中自适应调整攻击向量的优先级,优先选取当前时刻优先级较高的攻击向量类型,向服务器提交HTTP请求,根据反馈信息判断漏洞是否存在,待整个攻击过程结束,对站点进行二次遍历,重新检测每个页面中尚未被验证的攻击向量。

1 测试向量

Web应用程序为了避免受到跨站脚本攻击,所有的不受信数据都必须要经过过滤模块才能被写入数据库或返回至客户端浏览器。过滤模块是指Web应用程序中用来过滤或净化用户所输入的数据以防止引起跨站脚本攻击的函数或模块。过滤模块比较常用的方法[9]包括黑名单过滤,一般使用正则表达式进行合法性校验;另一种做法是只接收已知的合法数据(白名单过滤)或对输入长度与编码进行限制;最后一种方法是将特殊字符或标签转成无害的。

因此,为了能够充分测试过滤模块是否有效,需要精心地构造出尽可能全面且有效的测试向量来绕过各种验证函数,从而挖掘出由于过滤模块过滤不够全面而造成的跨站脚本。测试向量包括攻击向量、合法向量。传统的检测方法在攻击过程中,对每个注入点的所有注入变量同时发送攻击向量,但这会极大降低攻击的成功率。本文模型提出在发送攻击的过程中,每次攻击仅对注入点的某个注入变量发送攻击向量,而其他的注入变量使用合法向量。

1.1 攻击向量

针对Web应用程序过滤模块可能采取的过滤方式[10],表1列举部分常见的过滤方式,可依此制定出能够绕过过滤模块的攻击向量。

表1 Web应用程序过滤方式

攻击向量即指能够执行JavaScript代码的恶意字符串(例如:),攻击向量的类型多种多样。通过分析许多著名安全工程师共同总结出的XSS Cheat Sheet(XSS过滤绕过备忘单)[11],本文在HTML4元素的基础上,也引入了HTML5新标签、新属性构建了基本候选元素库(见表2),并构造出基于HTML5的攻击向量(见表3),最后总结出初始攻击向量种子库(见表4)。初始攻击向量种子库是指所有尚未经过格式变换的已知的可以用于跨站攻击的XSS代码集合,库中的每一个XSS代码都代表了一种XSS攻击类型。

表2 基本候选元素库

表3 基于HTML5的攻击向量示例

表4 初始攻击向量种子库

如果在Web应用的过滤模块中,对某种编码格式不支持的话,则可能通过编码格式转换的方式来绕过过滤[12-13]。在实际中,攻击者会对攻击向量做各种形式的变换来试图规避过滤模块对用户输入进行的过滤和净化。其中编码变换有十六进制编码、八进制编码或UTF-8编码等。在初始攻击向量经过变换规则(见表5)变形后,添加模糊前缀,得到最终的攻击向量。针对不同的输出点类型应该选取相应的攻击向量种子(见表6),才能够在该输出点位置上触发JavaScript代码的执行。最后,由于仅通过攻击向量自动生成算法构造的攻击向量并不能完全涵盖所有的类型,因此本文模型另外构建了攻击向量静态库作为补充,使其覆盖范围更为全面。

表5 攻击向量变换规则库

表6 攻击向量输出点类型

1.2 合法向量

传统检测方法没有针对合法向量的选取与生成进行详细分析,但合法向量的选取也是至为重要的。若仅使用数字与字母组合随机生成的字符串作为合法向量,极为可能无法绕过过滤模块,导致注入失败。因此,本文提出根据表单相关信息(即输入点类型),构造出相应的合法向量。

例如:对于表单元素,通过有效信息可以判断需要输入的是邮箱地址,因此,自动生成向量如:xSs_sCanner123@test.com等,对于,通过分析相关有效信息可以判断需要输入的是网址,可生成向量如:http://www.scanner1.com等。表7列举部分表单元素相关信息,利用这些信息有助于生成更加准确有效的合法向量。

表7 表单元素相关信息

2 总体结构与检测流程

本文模型总体结构(如图1所示)主要分为3个模块,分别是注入点分析模块、测试向量挖掘模块、攻击与分析模块。各个模块之间通过查询与操作session对象或数据库来完成相互协作。

图1 本文模型总体结构

2.1 注入点分析模块

完整、准确、高效地挖掘出所有页面及漏洞注入点是增强检测能力、减少漏报误报的关键问题之一,注入点分析模块(如图2所示)在检测中起着重要的作用。当前,网页提供给用户输入数据的方式各式各样,而传统检测中爬虫的功能较为单一(如文献[14]),仅能够提取出表单内容,比较难解析基于JavaScript或Ajax的提交方式,对于需要登录后才能够访问的页面无法获取到。为了获取更为全面的注入点,将跨站脚本攻击的注入点可大致分为3类:1)表单输入类;2)含参数的url类;3)基于JavaScript或Ajax的数据提交方式。注入点分析模块通过爬虫爬取目标站点的所有页面,并分析页面以获取注入点及相关信息。本文采用多线程网络爬虫,在爬取过程中采取广度优先搜索策略,使用正则表达式匹配页面中的url,过滤不属于目标站点的url,并将相对路径的url转成绝对路径加入到待爬取队列中,同时使用Bloom Filter算法[15]对url进行去重。

图2 注入点分析模块结构

在整个爬取过程中需要与Web服务器进行多次交互,针对一些需要登录后才能访问的页面,需要保持会话状态,否则在访问页面时Web应用会拒绝访问或者页面重定向。本文方法运用cookie技术来解决这一问题,预先输入用户登录的相关信息(如账号、密码等)以获取返回的cookie信息,并需要将退出登录的链接从待爬取url集合中删去,当再次访问页面时,则将相应的cookie信息添加到爬虫的HTTP请求协议头中,使其能够在爬取过程中保持会话状态,以获取更多页面。

在爬取url的过程中,分析注入点,将含参的url类与基于Ajax的数据提交类注入点使用表单类形式保存,统一注入点形式,同样也需对注入点进行去重处理。

2.2 测试向量生成模块

由第1节提供的攻击向量基本候选元素库,以及攻击向量变换规则库,并添加模糊数据,例如注释、空白符、tab键等,且动态生成模糊前缀,生成最终的攻击向量(见表8)。

表8 最终的攻击向量

2.3 检测与分析模块

并非所有用户能够输入数据的地方都能够导致跨站脚本的产生。发生反射型和存储型跨站脚本攻击的必要条件是用户输入的数据能够在某一个时刻被Web应用程序调用且加载到Web页面中。

传统检测方法将攻击向量提交至漏洞注入点,且对该注入点的所有注入变量同时使用攻击向量进行攻击,在攻击过程中判断漏洞是否存在只需检测响应页面中是否含有该攻击向量,就能大致判断漏洞是否存在。但这种检测方法是不完善的,易造成漏报误报,因为攻击向量不仅可能出现在服务器响应页面中,还可能某一个时刻出现在其他任何页面中,并且在同一页面中也可能有若干个不同的输出点类型(如图3所示)。

图3 输入数据输出终点的处理过程示意图

在检测效率方面,传统检测方法针对每个注入点,将攻击向量库中的攻击向量全部提交完成后才判断漏洞是否存在,这样会大大降低检测效率。在现有动态生成攻击向量的方法中,对于攻击向量的选取大多数采用随机选取方法,其优点在于简单快速,易于理解与实现,但由于随机选取方法中并没有利用其他任何相关的信息,其检测能力往往不是很理想。因此,如何使用较少的攻击向量来尽快发现漏洞是尤为重要的。

为解决上述问题,本文提出单次攻击只对某一注入点的某一个注入变量在某一输出点类型上进行攻击。首先,在检测过程中根据注入变量的输出点类型自动生成攻击向量,并随着当前时刻的检测结果自适应调整攻击向量优先级,优先选取攻击成功概率较高的攻击向量类型,以尽可能早地发现漏洞,弥补随机选取方法的不足。

为了对不同漏洞注入点注入的攻击向量进行区分,需要对每个注入点的某一个注入变量的攻击向量分配一个唯一的标识(即攻击向量ID),同时其他的注入变量根据输入点类型自动选取相应合法向量,向Web应用服务器发送Get或Post请求。当检测到特殊字符如<,>等标签已经被后台实体化或过滤后,导致无法执行脚本代码,则停止对此注入点变量的攻击。另外,将获取到的输出点类型攻击完毕之后,若依旧没有发现漏洞,则对每个注入变量都需要提交其他尚未选取的输出点类型自动选取对应的攻击向量进行攻击,避免在其他页面中有不同输出点类型中出现,造成漏报。在判断攻击是否成功的过程中,将分析页面范围扩大至注入点展示页面、请求页面以及服务器响应页面,判断漏洞存在当且仅当攻击向量类型与输出点类型相符合,并且攻击向量ID与注入点变量相匹配,能够触发脚本代码,才判定漏洞存在,这样可以降低误报率。

当所有注入点被攻击完成后,对整个网站进行二次遍历,检测尚未被验证的注入变量。如图3所示,用户输入的数据可能在任何页面的任何输出点位置上,且每个输出点位置可能是不同的输出点类型,因此,仅仅在攻击过程中同时根据反馈信息来判断漏洞是否存在会造成漏报问题,二次遍历对Web应用的原有页面与新页面进行重新遍历搜索,查找所有尚未得到验证的攻击向量,一旦确认查找到的攻击向量与相应的输出点类型匹配,则判断该攻击向量对应的注入点变量是存在跨站脚本漏洞的,并将该注入点变量对应的所有攻击向量移除,然后继续匹配直到待查找的攻击向量为空或者所有页面已遍历完毕,则整个检测过程结束。

假设I指注入点集合,其中,Ii指第i个注入点,Iij指Ii的第j个注入变量,i∈{1,2,…,n}(n是注入点总数),j={1,2,…,m}(m是Ii的注入变量总数),P指输出点类型集合,Pk指Iij的第k个输出点位置,k∈{1,2,…,s}(s是Iij的输出点类型总数),q指对Iij在Pk上的攻击次数,Ht指对Iij在位置Pk发送的第t次http请求,t∈{1,2,…,q},U指url集合,V指具有Iij标识的攻击向量,Vlist指待检测的攻击向量列表。

输入注入点集合I,url集合U

输出发现的跨站脚本漏洞

具体检测算法描述如下:

1)若i

2)若j

3)若k

4)若t

5)检测相关反馈页面中出现的V所在输出点类型是否与攻击向量V相符合,若是,则判定Iij存在漏洞,更新V的优先级,并从Vlist中移除与Iij相关的V,停止攻击Iij,重复第4个步骤。

6)检测相关反馈页面中出现的V所在输出点类型,更新Iij的输出点类型集合P。

7)检测相关反馈页面中出现的url,更新集合U。

8)检测相关反馈页面中是否存在被实体化后的攻击向量,若是,且在Pk不符合触发脚本执行条件,判定此输出点类型不存在漏洞,并结束对Iij在Pk的攻击,重复第3个步骤;若否,重复第4个步骤。

9)遍历U中所有的url,匹配Vlist中的V,若输出点类型与V的类型相符合,则判定存在漏洞,并从Vlist中删除与Iij相关的V。当U遍历完毕或Vlist为空时,则检测结束并输出结果。

3 实验结果与分析

依据本文提出的检测方法,设计并实现了一款自动化跨站脚本发现模型WXS,模型使用PHP作为服务器端脚本语言,具有易于进行维护和二次开发的特点。检测流程简单、实用性强、自动化程度高。为了验证模型的有效性,同时使用著名商业工具WVS(Web Vulnerability Scanner)与APPScan对2个测试站点进行扫描测试。其中,站点1是自行搭建的个人博客站点,该网站使用PHP语言开发,使用MySQL数据库,站点2是某论坛网站,采用.NET框架,提供用户留言评论等功能。检测结果如表9和表10所示,表11为检测耗时比较。

表9 站点1检测结果

表10 站点2检测结果

表11 检测耗时比较

为了更好地体现出模型WXS的有效性,需要在真实环境下做测试。据XSSed官方(XSS漏洞公布平台)截止到目前不完全数据显示,现收集有45 884个XSS漏洞,已修复3 026个漏洞。本文实验从XSSed平台中分别收集已修复和尚未修复的漏洞各50例作为测试样本,分别使用上述3种模型对其进行检测,检测结果如表12所示。

表12 XSSed平台收集的测试样本检测结果

实验结果表明,本文设计的模型WXS与其他工具相比较,能够检测出更多页面和注入点,挖掘出漏洞数量较多,并且误报数少。APPScan没有针对Ajax提交数据的注入点类进行分析与研究,不能检测出此类注入点。WVS与APPScan没有进行二次遍历扫描,并且缺乏对合法向量进行挖掘,容易被后台过滤模块过滤,存在漏报问题。在耗时方面,WXS发送的http请求次数(攻击次数)少于WVS与APPScan,说明在攻击向量与合法向量的选取上有较强的能力。

4 结束语

本文在分析跨站脚本攻击原理的基础上,提出一种动态检测反射型与存储型跨站脚本方法,设计并实现了一款自动化检测模型。该模型与同类检测工具相比,能够降低误报率和漏报率,从而更加有效地发现Web应用中的跨站脚本漏洞。下一步将针对Dom-based XSS进行分析与研究,使所提模型能够检测出该类型的跨站脚本漏洞。

猜你喜欢

脚本漏洞页面
酒驾
漏洞
刷新生活的页面
答案
安奇奇与小cool 龙(第二回)
快乐假期
小编的新年愿望
三明:“两票制”堵住加价漏洞
漏洞在哪儿
高铁急救应补齐三漏洞