Web目录扫描工具webdirscan.py编写 2016-03-28 #python #webdirscan #web目录扫描工具
写在前面
一直没有找到一款自己喜欢的跨平台的web目录扫描工具,因为我自己电脑装的是ubuntu,毕竟买不起mac
然后ubuntu下也没有找到几个我自己满意的工具,所以最终决定:自己撸!!!
想法:预期功能
- 可指定初始扫描目录(可选,默认根目录)
- 可设置文件后缀(可选,默认php)
- 可设置线程数(可选,默认20)
- 字典分为多种分类
想法:一些不错的思路
- 遇到
/a/
目录,然后扫描a.rar
、a.zip
等文件 - 遇到
/1.php
,然后扫描1.php.bak
、1.php.swp
等、 - 遇到有参数的网址以及所有表单,扔给sqlmap API进行sql注入检测
- 扫描
robots.txt
并且访问里面的目录,探测是否可以列目录
开发:最基础的目录扫描
首先我们把最基础的遍历字典,扫描目录写出来,代码如下:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import argparse
import requests
# 命令行传值
parser = argparse.ArgumentParser()
parser.add_argument('website',help="Website for scan, eg: http://www.secbox.cn | www.secbox.cn",type=str)
args = parser.parse_args()
# 字典设置
webdic = 'dict/dict.txt'
# 对输入的网址进行处理
website = args.website
# 请求头设置
headers = {
'Accept': '*/*',
'Referer': website,
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; ',
'Connection': 'Keep-Alive',
'Cache-Control': 'no-cache',
}
# 字典存入数组
webdict = []
with open(webdic) as infile:
while True:
dirdic = infile.readline().strip()
if(len(dirdic) == 0): break
webdict.append(website+dirdic)
for url in webdict:
try:
respon = requests.get(url, headers=headers)
except Exception,e:
print url
print e
if(respon.status_code == 200):
print '['+str(respon.status_code)+']' + ":" + url
最简单的功能已经搞定,但是还有很多坑要补,比如有的网站所有页面都返回200,这个时候就要做一些措施,下一步打算把提高扫描页面的准确性,判断页面是否存在多加几个标准:
- 首先访问
songgeshuozhegeyemianbucunzai/strikersb666.php
和onggeshuozhegeyemianbucunzai/strikersb555.php
判断两个文件内容是否一样 - 如果一样表示这个内容是404的内容,然后在后来的扫描中,返回长度等于这个长度的判定为404
开发:对不存在的页面也返回200进行兼容
有的网站访问不存在的页面为了SEO同样会返回200或者302,此时就需要做兼容,我这里的解决办法是:请求时禁止302跳转,然后抓取一个404页面,判断文件存在的条件是返回状态码200且与404页面内容不一样,具体代码如下:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re
import argparse
import requests
from termcolor import colored
# 版权区域
mycopyright = '''
*****************************************************
Web目录扫描工具 - webdirscan.py
作者:王松_Striker
邮箱:song@secbox.cn
团队:安全盒子团队[SecBox.CN]
*****************************************************
'''
print colored(mycopyright,'cyan')
# 命令行传值
parser = argparse.ArgumentParser()
parser.add_argument('website',help="Website for scan, eg: http://www.secbox.cn | www.secbox.cn",type=str)
args = parser.parse_args()
# 字典设置
webdic = 'dict/dict.txt'
# 对输入的网址进行处理
website = args.website
pattern = re.compile(r'^[http\:\/\/|https\:\/\/]')
res = pattern.match(website)
if not(res):
website = 'http://' + website
# 请求头设置
headers = {
'Accept': '*/*',
'Referer': website,
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; ',
'Cache-Control': 'no-cache',
}
# 字典存入数组
webdict = []
with open(webdic) as infile:
while True:
dirdic = infile.readline().strip()
if(len(dirdic) == 0): break
webdict.append(website+dirdic)
# 404页面分析,避免有的网站所有页面都返回200的情况
notfoundpage = requests.get(website+'/songgeshigedashuaibi/hello.html',allow_redirects=False)
# 遍历扫描过程
for url in webdict:
try:
respon = requests.get(url, headers=headers,timeout=30,allow_redirects=False)
except Exception,e:
print e
if(respon.status_code == 200 and respon.text != notfoundpage.text):
print colored('['+str(respon.status_code)+']','green') + " " + url
简单的扫描基本已经搞定了,下一步打算做一下视觉上的优化,比如显示进程:有多少待检测、有多少正在检测等等