陈春玲,张 凡,余 瀚
(南京邮电大学 计算机学院,江苏 南京 210003)
Web应用程序漏洞检测系统设计
陈春玲,张 凡,余 瀚
(南京邮电大学 计算机学院,江苏 南京 210003)
随着Web技术的普及,Web漏洞对网络安全的威胁越来越大。由于很多网站对用户的输入输出内容过滤不严,导致各大网站中普遍存在跨站脚本漏洞,而现有的Web漏洞检测方案及工具存在着效率低、漏检率高、误报率高等缺陷。为解决上述问题,设计并实现了一种Web应用中的跨站脚本漏洞检测系统。该系统在现有Web漏洞检测工具的基础上,添加了模拟用户登陆功能和验证码识别功能,解决了检测期间需要输入验证码或用户登陆后才可向服务器提交数据的问题,并根据现有Web漏洞检测工具的不足,对系统的网络爬虫、漏洞检测模块进行改进,同时根据XSS Filter过滤规则,构造出更多能够绕过XSS Filter的测试用例。实验结果表明,所构建的系统具有低漏检率、低误报率和较高的效率。
跨站脚本漏洞;Web应用;漏洞检测;网络爬虫
随着网络的运用越来越广泛,Web技术在人们生活的各个领域被广泛利用,它使人们获取信息更加快速、全面、便捷,使人们的生活更加舒适方便。然而它给人们的生活带来便利的同时,却存在着许多弊端,各种网络犯罪事件不断发生。因为目前众多网站中存在各种各样的Web应用漏洞,给了攻击者可趁之机。在众多Web漏洞中,跨站脚本漏洞(Cross Site Script,XSS)是Web应用中最为普遍的漏洞之一,近年来,有跨站脚本攻击的安全事件层出不穷。如2011年新浪微博受到XSS攻击,大量用户被自动转发各种微博与私信,并且对一个名为hellosamy的用户自动关注。2014年,百度贴吧受到XSS攻击,在多个贴吧中,点击推广贴会自动转发到用户所关注的所有贴吧中,并且导致吧友被封禁。
由于各种有关XSS攻击的安全事件的发生,XSS漏洞得到了越来越多的重视。为找到Web应用程序中的XSS漏洞,研究者们提出了一系列自动化测试工具[1]。一般分为白盒脆弱性扫描工具[2]和黑盒Web应用程序测试工具[3]。虽然这些工具有助于识别XSS漏洞,但依然存在各种各样的缺陷[1]。现有的漏洞检测工具Paros可以对Web应用程序的安全性进行检测,但其针对存储型XSS漏洞的漏报率较高,并且测试用例提交模块并没有采用多线程,所以效率较低。针对XSS漏洞的扫描工具XSS ME只能分析单页面且只对表单测试,忽略了可提交数据的URL。文献[4]忽略了POST请求引起的XSS漏洞,而文献[5]未对可提交数据的URL进行检测。文献[6]研究了只针对Flash的跨站脚本漏洞。
针对上述问题,高效,低误报率和漏检率的XSS漏洞检测系统的设计成为研究热点。为此,设计并实现了一个高性能的针对XSS漏洞的Web应用检测系统。该系统可以从攻击者的角度对Web应用进行模拟攻击,监测是否有异常情况产生,从而挖掘Web应用中的XSS漏洞。
XSS跨站脚本漏洞是因为Web应用程序对用户提交的数据没有进行严格的过滤导致的,使攻击者可以向Web应用提交恶意代码。当普通用户阅览网站时,恶意代码会自动执行,攻击者可以利用跨站脚本漏洞窃取用户信息,进行会话挟持、钓鱼欺骗等。
根据XSS漏洞形成的原因和利用方法,可将其分为反射型XSS、存储型XSS、基于DOM的XSS。
1.1反射型XSS
反射型XSS(Reflected XSS)又称非持久型跨站脚本漏洞[7]。当客户端向用户提供数据时,对用户数据没有进行HTML实体编码就将其包含在页面中,那么动态页面就可能被注入客户端代码。此类漏洞受攻击的过程为:攻击者编写一个可利用此类漏洞的URL并发送邮件给用户。用户登录站点,浏览了攻击者构造的URL后,恶意代码就会在用户的浏览器中执行,盗取用户信息。
1.2存储型XSS
存储型XSS又称持久型跨站脚本漏洞。攻击者将恶意代码上传到服务器,永久地保存在网站中,当用户浏览这些网页时就会受到攻击,使得所有浏览这些网页的用户以及管理员都面临信息被泄露的危险,因此存储型XSS漏洞的危害极大。
1.3基于DOM的XSS
又称本地跨站脚本漏洞,此类漏洞是服务器执行脚本时自身产生的恶意内容[8-9]。对于此类漏洞,在客户端提交的数据如果含有恶意代码,并且没有经过过滤,Web应用程序就会受到攻击。此类漏洞的利用过程为:供给者恶意构造一个URL发送给用户,用户点击此URL后,含有漏洞的页面就会被安装在电脑上,此页面是在本地域所执行的脚本中,恶意脚本可执行用户权限下的命令。
目前现有的Web漏洞检测工具的检测过程是通过网络爬虫对待检测网站进行页面爬取和信息提取,得到网站中的URL和Form表单信息,交给漏洞检测模块进行漏洞检测。但现有的Web漏洞检测工具检测过程中常常会遇到一些问题。如:非用户登录状态不能获取页面或提交数据,需要输入验证码才能提交到服务器等情况。为解决这些问题,系统添加了模拟登录模块和验证码识别输入模块并对网络爬虫和测试用例的生成进行改进。系统总体结构见图1。
图1 系统总体结构
2.1模拟登录模块设计及实现
很多网站的一些页面只有在用户登录后才可以打开或评论、留言,这说明在非登录状态下,爬虫不能获取这些页面,漏洞检测模块不能像这些页面提交测试用例。因此系统添加了能够模拟用户登录的模拟登录模块,使系统在登录的状态下进行网络爬虫页面爬取和攻击数据提交,避免网页爬取遗漏和数据无法提交到服务器。
模拟登录模块中设计了getHtml()函数,向登录页面发送http的get请求,以获取登录页面内容得到表单信息,通过对标签的提取,获取需要提交的参数。Userpost()函数模拟表单提交,将用户名、密码和其他需要提交的参数通过http的post请求提交到服务器。对返回结果进行分析,判断是否登录成功,如果成功,存储当前cookie值。
2.2验证码识别模块
用户向网页提交数据时,如留言、注册等,往往会遇到需要输入验证码的情况,如果验证码输入不正确或为空,数据将无法提交到服务器。漏洞检测模块向网页提交测试用例时遇到这种情况,同样需要提交正确的验证码,因此需要验证码识别模块来获取正确的验证码。
通过http请求获取html页面信息,解析网页信息,在form表单中解析出验证码图片的URL,验证码识别模块将验证码图片下载保存到本地。通过对其进行二值化去除背景,与样本进行像素比较等过程获得验证码对应的字符。
2.3网络爬虫模块
网络爬虫模块能够快速、准确、全面地爬取网页链接,是整个漏洞检测系统的基础。网络爬虫模块采用广度优先爬取策略,由待爬取URL队列、form表单队列、可疑URL队列、网页抓取模块、网页解析模块、URL去重模块组成。待爬取URL队列存储还未被解析网页的URL,网页抓取模块向服务器发送http请求获取网页内容,网页解析模块对获取的网页内容进行分析,提取有用的信息,form表单队列存储解析出的form表单信息,可疑URL队列存储可提交内容的URL,URL去重模块对重复的URL进行消除。
为提高爬虫系统的工作效率,采用多线程的方法对网页进行爬取,当种子URL爬取结束后,对种子URL上的所有网页链接同时进行爬取。多个爬虫同时工作,网络爬虫模块工作的时间缩短了数倍,大大提高了网络爬虫的工作效率。
爬虫模块的设计思想是将待检测网站看成树形结构,网站中的网页可看作是树中的节点。开始爬取的种子URL为树的根节点,Depth值为1,网页中所含的超链接的Depth值为此网页的Depth+1,Depth值代表节点在树中的深度,即网页在网站中的深度。在爬虫爬取网页前,需先定义爬取的最大深度MaxDepth。网络爬虫单个线程算法的具体过程为:
(1)定义一个URL为开始爬取的种子URL,其Depth为1,将URL和Depth值存入带爬取URL队列。
(2)判断待爬取URL队列是否为空,如果不为空,就从队列中取出一个待爬取URL及其Depth值;如果为空,结束循环。
(3)向服务器发送http请求,获取网页信息。
(4)网页解析模块对获取的网页内容进行解析,获取表单信息和超链接。超链接提取:超链接一般存在于、、
(5)判断是否从网页信息中提取到了form表单信息,如果存在,将URL和提取出的form表单信息存入form表单队列。
(6)判断URL是否为可提交数据的URL,如果是,将URL存入可疑URL队列。
(7)判断网页的Depth值是否小于MaxDepth,如果小于,去重模块对步骤(4)提取出的超链接进行去重处理,将去重后的超链接队列和其Depth值存入待爬取URL队列,其Depth值为原网页的Depth值+1。
(8)跳转到步骤(2)。
网络爬虫模块流程见图2。
图2 网络爬虫模块流程图
2.4URL去重
一般常见的URL消重算法有:建立数据库对URL进行对比去重、hash映射去重、MD5加密映射去重、Boolm filter去重[10]、MD5去重树[11]等。其中Boolm filter去重较前三种去重方法具有效率高、节省空间等优点,虽然没有MD5去重树速度快,但其产生冲突可能性小。因此,此系统选用Boolm filter去重方法对URL进行过滤。
Boolm filter是Burton Bloom提出的一种高效、高空间利用率的数据结构[10]。它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。它由k个hash函数和1个很长的二进制向量组成。基本思想是:一个长度为m的位数组和k个哈希函数,每个函数都能将元素映射到位数组中,对每个元素用k个哈希函数计算k次,得到位置P1,P2,…,Pk,查询下标为P1,P2,…,Pk的位,如果都为1,则认为该元素存在集合中[12]。
2.5测试用例生成模块
XSS漏洞测试用例有4种生成方法:
(1)使用