石大e舟
 您现在正在浏览: 首页 » 学生工作 » 石大E舟  
   

web漏洞扫描器之web爬虫实现

发布时间: 2016-10-13 18:01:59   作者:本站编辑   来源: 本站原创   浏览次数:  

1 爬虫工作流程     

      在介绍web爬虫的流程和原理之前,先说明web漏洞扫描器自身的特点,进而对爬虫进行特定要求WEB 漏洞的种类很多,但基本原理都是由于用户的恶意输入导致产生漏洞,所以在进行WEB 漏洞自动化检测时着重关注URL 中参数,如XSS(跨站脚本攻击)、SQL 注入漏洞都是通过URL 中的参数进行攻击(当然也有些漏洞不是通过GET 或POST 请求中的参数来进行检测,如信息泄露和列目录,着重看URL 请求后的响应内容,这类漏洞暂不讨论,以使爬虫更有针对性,提高效率)。另外,爬虫的速度不应该成为漏洞扫描器的瓶颈。

 

                                                                                                                   QQ20161013181425.png

 

爬虫在进行工作之前,需要用户提供一个根URL 并放入到待请求URL 队列中。
A. 从队列中取出一条待请求URL 去进行页面请求;
B. 根据请求返回的页面进行页面分析,进而提取新的URL;

C. 对新生成的URL 进行过滤;
D. URL 去重处理,将新生成的URL 与存储库中的URL 进行比对,如果存在则丢弃,
如果不存在则加到待请求URL 队列中,无论是否存在都将父URL 加到URL 存储
库中去;这一步较为关键,也是需要优化的地方;
E. 重复回到A,直至待请求URL 队列为空时停止,爬虫结束。

2 爬虫关键技术点分析

基于上面对爬虫工作流程的分析,我们从以下几个方面分析爬虫的技术点。

2.1 多线程技术

       由于扫描器对爬虫的时间有一定的要求,很容易想到在爬虫中引入多线程技术。我们将爬虫的整个工作过程分为两块,一是页面下载部分,二是页面分析、过滤及去重部分,这两
部分基本独立,通过任务队列(分别称为页面下载队列和页面处理队列)进行交互,那么如果这两部分分别用线程池实现,将增加并发效率。需要注意的是,两个线程池中的线程在各
自队列为空并不能退出,因为URL 是动态生成的,还需要等待所有线程均空闲时才能退出。对应如图2 所示。

 

                                                                     QQ20161013183322.png

 

页面下载线程根据下载的页面添加新的页面处理任务到页面处理队列,而页面处理线程(包括对页面进行分析、URL 过滤和URL 去重等)根据处理结果添加新的页面下载任务到页面下载队列中。

2.2 URL 去重处理

        URL 去重处理是指在页面分析和URL 过滤后的新生成的URL,需要根据URL 存储库中已下载的URL 决定是否再进行爬取,如果之前已经爬取过,则无需再进行爬取,否则要加到待请求URL 队列中等待页面下载线程去下载页面。简单说,就是去重处理时如何提高效率?影响URL 去重的因素有两个,一是字符串比较的时间,二是任务队列在内存中的空间占用。

URL 字符串的比较,由于一般URL 都比较长,较浪费时间,但如果进行URL 压缩势必减少字符串比较时间,所以如果对URL进行HASH减少存储空间和存储长度,如计算MD5,变为32个字节的哈希值,可以提高字符串比较效率。例如,Python的hashlib库提供MD5的计算方法:

                                                                                                hashlib.md5(src).hexdigest()

       URL存储库放在什么地方呢?如果放在磁盘上,则不用担心存储空间的问题,但大部分时间浪费在了IO操作上,严重影响性能;如果放在内存,访问速度很快,但随着爬虫的爬取,URL存储库越来越大,一段时间后内存面临被耗光的危险,并且爬虫爬取的速度也明显下降。通过调研,这里引入ORACLE公司的嵌入式数据库berkeley DB的概念,它非常适合key/value格式数据的存储,且BDB与程序在同一进程空间,大大提高了访问速度,具有非常优越的性能。

      另外在URL去重处理中还有布隆过滤算法等。

2.3 动态页面解析

       页面解析主要解析返回的html页面,在分解页面元素后进而提取所有的可能的URL。但对于基本的静态页面分析,则只能提取静态的URL,如href属性及form表单中的action的url,而对于ajax请求、标签属性中与用户的交互式事件以及JS中其它动态操作DOM元素生成的URL,一般的静态页面分析无法提取URL。所以,爬虫需要引入JS引擎解析模块。

       需要注意的是,这里单独的JS引擎无法满足要求,需要引入类浏览器的功能,因为需要DOM解析、JS解析,以及将DOM元素传给JS引擎的连接器,如XPCOM等。

2.4 特定优化

       根据之前描述的,由于WEB漏洞扫描器对漏洞的检测上存在一些特定的要求,因而我们可以降低爬虫的压力,提高爬取的性能。

       从爬虫的角度,只会关注那些请求后的响应中会包含新URL的URL,所以对于那些请求图片、文档等的URL请求,可以直接丢弃,也不需要进入URL存储库,因为也不是WEB安全漏洞关注的URL形式。这样可以减少URL请求的个数。

      比如,定义一下白名单页面类型:

      ['php', 'html', 'htm', 'xml', 'xhtml', 'xht', 'xhtm',

      'asp', 'aspx', 'php3', 'php4', 'php5', 'shtm',

      'shtml', 'phtm', 'phtml', 'jhtml', 'jsp', 'cfm', 'cfml']。

      有的时候,在进行多次URL请求后得到的响应页面中分析得到的新生成URL中,只是参数值不同,URL及参数名、参数个数都完全相同,那么在进行去重时可以将URL中参数值以外的部分进行比较,确定URL是否重复。

      比如,存在下面两个URL:

      http://g.cn/a.php?a=1&b=2

      http://g.cn/a.php?a=3&b=4

     那么在去重时就认为这两个URL相同,不需要再进行页面下载。

3 总结

     通过对WEB漏洞扫描器中爬虫工作原理、关键技术点的分析,可以看出,一个轻便爬虫自身的原理较简单,但是爬虫技术中值得我们改进和优化的技术点还是挺多的,需要我们衡量比较采取一种可行的优化方案。希望这篇文章对关注轻便爬虫实现的同学有帮助。

 
  | 校内邮箱 | BB网络教学平台 | 教务管理系统 | 院长信箱 | 书记信箱 |本科毕业设计管理系统 |