基于网络爬虫的XSS漏洞检测技术

1. 背景和意义

在早期的网站设计中,网页的存在形式都是静态的。静态的网页内容稳定,不会经常更新,但是在后期却不易维护。如果需要维护更新网页,则必须重新编辑HTML网页,因此当网站很庞大的时候,维护静态网页的工作量几乎是不能容忍的。随着时代的发展,在这方面发展出来一大批的动态网站技术,比如JSP,ASP,PHP等。这些网站技术的动态性主要体现在其相应网页的形成过程是动态的,即网页内容会根据用户的需求和和选择而动态的改变,而需要改变的内容则来源于数据库。虽然这样的技术更符合时代的需求,但是动态网页也容易受到一些攻击,最为常见的应用层攻击就有XSS攻击,SQL注入攻击等。其中XSS攻击是:攻击者在Web网页内注入恶意的脚本代码,然而当信任服务器的用户打开该网站浏览该网页的时候,嵌入在Web网页内的恶意代码就会在用户知情的情况下被执行,从而达到攻击的目的。

网络爬虫的主要功能是自动浏览并扒取互联网网页。网络爬虫是搜索引擎的基础架构之一,它决定着是搜索引擎的数据来源,如果一些存在XSS漏洞的网页被网络爬虫所扒取的话,用户在使用搜索结果的时候,很容易受到XSS攻击,因此搜索引擎的性能评价肯定会收到影响。[1]

由于以上的原因,可见在网络爬虫进行网页获取的时候,对网页进行XSS漏洞检测的重要性。这样做的目的,不仅可以保护搜索引擎用户的安全性,同时也可以间接的遏止XSS攻击的传播。

2. 相关技术介绍


2.1.XSS漏洞

由于在HTML语言允许嵌入脚本语言,从而导致了脚本的安全问题。其中XSS(Cross SiteScript)是最为常见的脚本攻击方法。XSS攻击是攻击者将自己的脚本代码注入到有Web应用程序生成的网页中,当有用户浏览该网页时,攻击者的脚本可以被解释执行,从而达到攻击的目的。

2.1.1.XSS漏洞分类

XSS可以主要分为以下3种:

(1).非持久性XSS(Reflected XSS)

顾名思义,这种类型的XSS攻击是非持久化的。它常出现在Web客户端向Web服务器发送一些请求时,在请求中携带恶意脚本代码。当请求被响应时,请求中的恶意脚本代码有可能被执行,从而受到攻击。这样的攻击是非持久化的,它必须用户在点击带有恶意代码的链接时才会引起。

(2).持久性XSS(Stored XSS)

这类的XSS漏洞主要是已经被持久化到了网站的数据库内。当动态网页动态生成的时候,网页生成器从数据库中调用数据,而持久化XSS漏洞则可能存在这些数据中,即有可能已经有恶意脚本代码存在于这些,所以只要用户浏览该网页,恶意脚本代码就会被解释执行,从而受到攻击。最常见的持久化XSS攻击,就是在网站的留言板中输入恶意脚本代码并提交,如果该网站不对提交的留言就行XSS防御的话,那么该携带恶意脚本代码的浏览就会被持久化进数据库。

(3).基于DOM的XSS(DOM-based XSS)

基于DOM的XSS攻击主要存在于页面中客户端本身。客户端的脚本程序是可以通过本地的DOM动态地改变页面内容,但是如何这些DOM的数据没有经过严格的检查确认的话,那么就可能存在DOM-based XSS。

2.1.2.XSS防御

由XSS漏洞的分类可知,XSS的攻击从属于Client/Server模型,那么XSS的防御也可以从这两个方面入手。

(1).Server端防御

如持久性XSS漏洞,是由于在服务器端对于用户的输入没有进行合理的验证确认,从而使得XSS攻击可能形成。因此,服务器端防御XSS攻击的主要方法是对用户输入进行严格的验证审查,具体方法:对输入的数据进行验证、过滤用户数据、移除或者加密特殊字符等。

(2).Client端防御

客户端的防御主要还是基于用户浏览器。一些具体的途径主要如下:点击直接、确定的链接,不要点击不受信任的网页或者邮件等;禁止脚本的运行;不断对浏览器进行升级。因为浏览器为了保护用户的安全,在XSS防御上也在不断的进步。

2.2.网络爬虫

由于本文所要综述的技术是应用在网络爬虫中的,所以在涉及具体的技术之前,先来介绍一下网络爬虫的模型。

网络爬虫又称自动索引器、网络机器人等,本质是自动浏览互联网的程序。网络爬虫一般都是从一个种子集的URL集合开始扒取网页,首先将这些URL放入待搜索队列,采取某种策略从该队列中提取URL,扒取网页,分析网页内容,将获取的网页放入已搜索队列,以此反复,最终达到某个停止扒取的条件[2],大致流程如图2-1:


2‑1网络爬虫示意图

其中关于网络爬虫的类型,以及普遍的网络爬虫爬行算法,都是搜索引擎的重要的基础。

网络爬虫自始至终会保存两个列表:待扒取URL队列,已扒取URL队列。由以上的图可知,在通过某个URL进行网页扒取的时候,会遇到很多网页中的超链接,比较常见的标签有:……、、……等。在一般的网络爬虫中,不管这些链接是否安全,都会一如既往地将其扒取,并且放入已扒取队列。

3. 国内外发展现状

由于XSS使用的攻击代码千变万化,当网络应用开发人员在设计开发的时候不可能对所有的用户输入进行全方位的检测,所以XSS在国内外都是广泛存在的,并且已经逐渐代替了缓冲区溢出等传统型的攻击方式,俨然成为网络安全方面不容忽视的重要难题。

国际Web应用安全组织WASC(Web Application Security Consortium)的统计数据,总共采样分析10297个网站,其中就有31.47%的站点存在XSS漏洞。其中像Google、Yahoo等国际著名IT公司都存在XSS漏洞,另外在商业产品中,平均每个都能发现大概10~25个XSS漏洞[3]

XSS漏洞最早的出现实在1996年,但是在4年之后才被公布。国内关于XSS漏洞的最早资料,也是在2000年。另外2006年,PayPal遭到XSS攻击,攻击者将PayPal站点的访问者重定向到一个新的页面,这个新的页面警告用户他们的账号已经不再安全,需要重新设置,并提示输入密码。2008年PayPal承认其PayPal页面受到XSS攻击,该XSS漏洞会被攻击者用于盗取用户证书或者cookie[4]

4. 主要技术实现

4.1. 基本方案概述

由于目前网站动态网页技术的发展迅速,并且已经诞生出众多动态网页源码编写语言,故使用在网络爬虫中对所有网页进行源码分析,变得不切实际。为此本文涉及的技术——基友网络爬虫的XSS漏洞检测技术,在XSS漏洞进行动态检测的时候使用黑盒测试。所谓的黑盒测试也就是不知道站点的源代码,这样就可以使用该技术检测任意一种语言来构建的网站。

动态检测攻击可以用程序实现对XSS攻击者的模拟:第一步,对检测站点进行全局扫描,通过这样的方式获取该站内所有的合法链接以及用户的注入点;第二步,用事先已经预备好的XSS攻击代码,代替用户的输入,自动填入这些注入点,进行模拟人为提交;第三,通过该请求返回的HTTP响应来判断第二步中的注入是否成功,从而得知该注入点是否存在XSS漏洞[5]

该检测方法主要可以由以下两个模块组成:网络爬虫模块和漏洞检测模块。其中爬虫模块分析Web站点,扒取链接;而漏洞检测模块主要是分析站点注入点是否存在XSS漏洞,主要形式为从数据库提取出数据,对每一个注入点进行测试,再将最后的测试结果保存在数据中,并记录可能存在的哪些XSS漏洞。基本方案示意图如图4-1:


4‑1基本方案示意图

可见整个基本方案中最核心的模块是XSS漏洞检测模块,以下更具体地介绍XSS漏洞检测模块主要完成的3个工作。

4.1.1.分析注入点

在使用浏览器浏览互联网资源的时候,用户与动态网站两者交互的地方主要是在于网页的表单之中。而表单的输入主要是存在input标签中,input标签一般拥有3个属性:name,value和type。在基本方案中,还是采取以正则表达式的形式来查找表单以及表单的这些参数,然后把这些信息记录在本地的数据库中。除了简单的输入之外,实际应用中还会存在网页的链接,比如:或者中的链接。

4.1.2.模拟XSS攻击

拥有了以上这些注入点之后,需要做的就是程序模拟XSS攻击,然后等待下一步的分析响应,从而判断是否存在XSS漏洞。模拟XSS攻击的具体过程为:通过事先准备的XSS攻击代码注入注入点,构造完数据包后,向服务器发送。在这个过程中,由于存在的XSS攻击有多种,对于一个URL会使用循环的方式,完成多种XSS攻击的检测,如果该URL存在XSS漏洞攻击,那么将该XSS漏洞类型保存在数据中,继续检测其他的XSS漏洞类型,直至所有XSS类型检测完毕,则将该URL放入已检测队列。

4.1.3.分析响应

在一般的发送请求时,都是使用HTTP的get请求或者post请求。当发送完请求之后,肯定会返回一个响应,分析这个响应即可以知道该URL是否存在XSS漏洞。为此需要在分析相应的client端存储众多可能存在的XSS攻击代码样例。该数据中存储的XSS攻击样例应该包含得尽可能的全面,这样可以使得测试集的有效性。那么只需要判断请求返回的响应是否存在与数据库中一模一样的子字符串,如果存在,则说明该URL存在XSS漏洞,如果不存在的,可以继续下一操作。

4.2. 基本方案的缺陷

对于基本方案的功能是可以确定有效的,但是基本方案的效率却不得不受到怀疑。

首先,由于每次对于注入点的查询都是要查询数据库来判断,而一旦数据库中记录的很多的话,对于持久化数据的读写时间开销很大,可以采取内存的方式来存储这些信息。

可见在检测的时候,一旦数据库中有N个XSS漏洞样例的话,那么对于一个请求的响应,程序需要将该响应与N条数据库漏洞样例进行对比,这样的检测时间花销也是巨大的,应该设计更有效的算法将注入点进行最合适最可能的攻击形式进行比较,而不是每种攻击代码都去进行比较。

4.3. 基本方案改进

针对4.2提到的基本方案缺陷,可以对基本方案进行一定程度的改进,从而使得本方案在准确性和处理速度都有大幅度的改进。

由于对于大型站点来说,处理速度是一个非常重要的参考点,而基本方案在处理速度上并没有体现出优越性。所以我们可以在这方面做出改进,主要思路是使用多线程网络爬虫,以及弃用数据库,使用动态生成XSS攻击代码的形式,减少模拟XSS攻击的时间开销。

4.3.1.多线程的改进

基本方案的设计中,网路爬虫是采用单线程的,分析完一个网页之后才能分析下一个网页。所以这样的话时间开销的是很大的,在第一个改进中,我们使用多线程技术,这样就可以使得多个线程并行的工作,单线程中按照顺序来一个一个取分析网页的方式被多线程锁取代,这样的话会大大提高CPU的利用率[6]。具体程序框架如图4-2 。


4‑2多线程示意图

4.3.2.自动生成代码改进

由于在基本方案中,每一个URL的检测都是要检测完毕所有数据库中储存的所有XSS攻击样例,这样的导致的时间开销巨大。在该部分的改进中,放弃了使用了数据库,而是采取了自动生成检测代码的方式来完成功能。

根据注入点上下文自动生成攻击代码的过程如下:

(1)对每一个出入点进行固定长度的攻击字符串alert(””XSS)
进行提交。对提交后的响应进行检测,若检测中出现了相同的字符串,那么可以发现服务器没有对<进行过滤,这样的话,也就排除了很多的XSS攻击样例,使得后续的测试样例减少,大大减少时间开销。

(2)其实在实际情况中,应该对于不同的注入点,进行不同的XSS漏洞测试,这样才会对于测试具有更强的针对性,也会对于程序检测的时间开销有很好的正面影响。比如说,可以把用户的注入点简单的分为5类,也就是:文本域,评论域,文本区域,脚本标签和其他类型。程序首先来判断是那种类型的注入点,然后再根据不同的注入点类型和编码情况生成不同的测试代码进行提交。用这样的方式使得代码的提交更具有针对性,也有效的减少从数据库提取数据的时间开销。

改进后,漏洞检测模块的示意图如图:


4‑3漏洞检测模块改进示意图

可见,在该模块的改进中,核心是生成攻击代码。在实际应用中,生成攻击主要包含两个步骤:(1)选择攻击代码类型;(2)生成攻击代码。

由图4-3的示意图可知,在生成攻击代码的前一步为初始检测,这里的初始检测其实是就是为了选择攻击代码的类型。该部分根据初始检测后返回的响应页面中的未知唉自动选择攻击代码的类型。由于在实际的应用中,在表单中输入的字符串可能出现在响应页面的任何东方,所以,对于不同位置应该使用不同类型的攻击代码。这就将弥补使用数据库后盲目的进行全部类型检测的弊端,使得整个检测的过程变得更有针对性,一方面也大大减少了程序运行的时间。

一旦当漏洞检测模块已经选择了攻击代码类型,那么紧接着就是要生成相应的攻击代码。生成XSS攻击代码的话,要满足可以生成任意类型的攻击代码。

5. 总结

由于动态网页技术的发展,对于网络应用层的攻击也变得越来越频繁,XSS就是最为常见的攻击之一。而网络爬虫是采集互联网资源最为流行最为有效的网络程序,则必须要防止扒取网页的安全性、可用性,因此在网络爬虫中进行XSS漏洞检测是极其有意义的事情。

本文综述了XSS攻击的原理以及对于XSS防御的方法。另外还对国内外典型的XSS攻击以及防御和检测方法作了简要的介绍,并着重介绍了基于网络爬虫的XSS漏洞检测技术。在该技术支撑的系统中,网络爬虫采用了多线程技术以保证网络爬虫的效率,另外根据网页注入点的的上下文来动态生成用于检测XSS漏洞的攻击代码,从而做到弃用效率一般、后期维护困难的数据库存储,最终达到高校检测XSS漏洞的目的。


参考文献:

[1]网络爬虫. http://baike.baidu.com/view/19137.htm?fromId=284853

[2]王学松:搜索引擎开发。北京:人民邮电出版社,2008

[3].XSS FAQ:http://www.cgisecurity.com/xss-faq.html#xss

[4]PayPal遭到XSS攻击 :http://news.netcraft.com/archieves/2006/06/16/paypal_security_flaw_allows_identity_theft.html

[5]沈寿忠,张玉清,基于爬虫的XSS漏洞检测工具设计与实现.计算机工程.2009.11

[6]曹忠,赵文静.一种优化的网络爬虫的设计与实现.电脑知识与技术.2008.12

你可能感兴趣的:(基于网络爬虫的XSS漏洞检测技术)