0x01web目录扫描程序
脚本利用演示
直接输入python DirScan.py会打印出使用说明信息
然后扫描一下
可以看到扫描出了我的服务器的这些结果
点开其中一个
再对比一下我自己的服务器目录,可以看到确实是把自己服务器的一些目录扫描出来了(这里我就不把自己服务器的目录放出来了~~大家可以自己去测试一下~)
Tips:还可以当做ctf的备份文件泄露,源码泄露的扫描工具来使用,只要load上你的字典就可以了。
脚本代码的实现和分析
这个脚本支持自定义扫描的字典
支持自定义扫描时带上的UA头
程序实质是Web目录的暴力破解,即基本过程为取出字典内容、和目标网站进行组合、然后进行请求识别,能否扫描出相应的Web目录主要看字典的强大与否。至于字典,网上也很多资源,收集一下即可。
这里的user_agent_list.py是自定义代理模块,可以实现在扫描web目录网站的时候随机切换UA头(绕过一些防扫描的机制)
class DirScanMain:
def __init__(self,options):
class DirScan(threading.Thread):
def __init__(self,queue,total):
def run(self):
def msg(self):
def start(self):
if __name__=='__main__':
if options.url and options.ext:
d=DirScanMain(options)
d.start()
sys.exit(1)
程序的大致实现思路是这几个,先是创建一个DirScanMain(options)对象,然后执行start方法,在start方法中拼接好url,结合threading和queue多线程编程,实例化DirScan(queue,total)对象,自动执行重写后的run方法,然后带上随机生成的UA发起一个get请求,通过判断返回的状态码是否为200,如果返回的状态码为200,就认为扫描的目录存在,并写进result.html中,并且会在run方法中调用msg()函数,实时打印出扫描的进度
发现问题
其实这里我们只使用返回的状态码是否为200来判断目录是否存在精确度是不够的
例如我们扫描一下百度的页面,查看扫描结果
但是点开其中的一些链接,会发现这些页面其实都是不存在的,但是被302重定向了。
这里我们点开 http://www.baidu.com/beingmate_in.php 会发现我们被重定向到了http://www.baidu.com/forbiddenip/forbidden.html
我们再访问一下
http://www.baidu.com/syssite/install/ini_setup.php
这时候我们会被重定向到了
http://www.baidu.com/search/error.html
因为这里我们直接用requests.get()访问
http://www.baidu.com/syssite/install/ini_setup.php 和
http://www.baidu.com/beingmate_in.php
都是会得到状态码200的,所以我们的扫描器就认为这个页面是存在的了
但实际上这两个页面都是被重定向了的,状态码按道理来说应该是302,至于为什么这里实际上是会返回200,具体原因我也不知道,但肯定是百度对这个做了一些处理。
动手优化扫描器
既然发现了问题,我们下面就对这个扫描器进行优化一下,提高扫描页面的准确性,判断页面是否存在多加几个标准,思路
首先访问Zheshiyigebucunzaideyemian233333333.php记录下返回的页面的内容长度,然后在后来的扫描中,返回长度等于这个长度的判定为404
Tips:这里修改脚本的时候注意一下各种变量在类和函数中的传递过程,注意一下变量的作用范围,引用范围。
修改后的脚本我命名为DirScan_youhua.py
对比测试一下,先运行DirScan.py
说明一下这里我把字典设置为只有这个链接是有效的
http://www.baidu.com/home/news/data/newspage?nid=14578898130818524711&n_type=0&p_from=1
其他都是无效的
这里DirScan.py明显把很多不存在的页面也识别为存在了
我们下面看看我优化过的脚本的执行情况
识别度得到了明显的提高
然后后面能扫出多少就全靠字典了