Web目录扫描工具webdirscan.py编写

写在前面

一直没有找到一款自己喜欢的跨平台的web目录扫描工具,因为我自己电脑装的是ubuntu,毕竟买不起mac

然后ubuntu下也没有找到几个我自己满意的工具,所以最终决定:自己撸!!!

想法:预期功能

  • 可指定初始扫描目录(可选,默认根目录)
  • 可设置文件后缀(可选,默认php)
  • 可设置线程数(可选,默认20)
  • 字典分为多种分类

想法:一些不错的思路

  • 遇到/a/目录,然后扫描a.rara.zip等文件
  • 遇到/1.php,然后扫描1.php.bak1.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.phponggeshuozhegeyemianbucunzai/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

简单的扫描基本已经搞定了,下一步打算做一下视觉上的优化,比如显示进程:有多少待检测、有多少正在检测等等

不把过程往博客写了,主要是太麻烦了,前往Github看吧~

已有 8 条评论

评论已关闭