filebackup记录

重新造了个小轮子,基于爬虫的动态敏感文件扫描脚本,想法来源于cdxy前段时间的一篇文章,也是一直想把动态文件探测加入到静态扫描中去,所以自己写了个,踩了一些坑,发现还是自己代码量太少了,项目地址:https://github.com/zxyxx/FileBackup

最初就想做成两种模式,mini模式和完整模式,mini模式类似一个爬虫,爬取给予的页面根据一些链接和关键字生成下一步探测目标,完整模式则在传统静态字典扫描器的基础上加入了mini模式的下一跳URL探测系统。

爬虫方面使用了requests + lxml的方法,命令行处理用了docopt,多线程是困扰了我挺久的一个地方,下面是一些记录和坑点。

URL查重:

简单的用字典处理了。更好的方法:哈希表,布隆过滤器

docopt的坑:

在docopt的设置文件里的Options中不能用tab代替空格,不然会报错,坑了我好久。。

对自定义404页面的处理:

通过正则匹配404页面,同时禁止自动的302跳转,不然会有一半的流量用在了跳转自定义404页面上,为了处理正常的302跳转页面,把302的返回头的Location取出来作为下一步探测的URL。

rewrite

某些中间件会设置rewrite,导致不同的url实际指向相同的页面,初步想法通过页面哈希对比来去重(是否可以代替URL查重?)

多线程:

比较坑,在于对线程的实现和原理了解不够清晰,开始嫌麻烦不想手撸threading + Queue,于是开始找库,分别选用了threadpool和concurrent.futures两个模块来实验,threadpool没有找到好的动态创建线程的方法,最后还是用了concurrent.futures里的ThreadPoolExecutor + queue的方法来实现递归传递下一跳URL,速度方面还算可观,在简单的环境下fullfuzz的速度甚至比dirsearch还快,但是在所有线程结束后如何终止没有找到较好的解决办法,暴力用了queue.get的超时来判断是否扫描完毕。

编码问题的处理:

在抓取gb2312编码的页面出现encoding error : input conversion failed due to input error,

暴力方法:r.content.lower().decode(‘utf-8’)然后再传入lxml.etree.HTML

一个小栗子:

在http://localhost/nctf/下存在如下目录:

其中index.php有

hello.php和world.php都没有指向其他文件,flag.php中有<a>标签指向f1ag.php。

所以在minifuzz模式下可以探测到从index.php触发进而探测到hello.php和world.php接着探测到三个php文件的备份文件,此时无法探测到flag.php

而在fullfuzz模式下根据静态字典可以探测到flag.php从而可以完整探测到这11个文件。

不足

对rewrite页面的适配性还是不够,以及对同域的url匹配性不足,以及线程收尾不好,以及若干BUG。

总结

对代码的敏感性不够,隔一下写一下的工作状态会对整个架构模式思路不清晰,有些地方也不够pythonic。