python小工具连载-取代御剑 web目录爆破

python小工具连载

-取代御剑 web目录爆破-

使用本网站前,请先阅读免责声明,同意其内容后再进行食用!

应用场景

在上次,我们通过安装开源的cms来对网站进行目录的碰撞,但是这有一个前提,就是我们的目标是使用的开源cms,且我们可以找到他的源码,但是在实际的情况中,针对一些未开源的系统,我们往往没有不能完全掌握所有的网站可以访问的文件,如果使用爬虫,在很多情况下有大量的配置文件,残留的开发文件、调试文件,及其他琐碎的安全文件可以通过敏感的信息或者暴露出开发者不希望暴露出的功能。唯一能够发现这些内容的方法就是使用暴力破解工具获取常见的文件名和目录。

工具效果

利用工具对自己的网站进行目录爆破

使用方法 python3 目录爆破.py url 字典

Snipaste_2022-01-02_11-38-42.png

 

当然,我在这里使用的字典是php字典,由于我已经知道了我的网站是php的站,假如不知道,你也可以使用无后缀的字典,让我们的脚本自动对各种常用的字典进行爆破。

实现原理

首先,我们先来实现一个用户文件读取的函数,首先根据我们的输入尝试去打开我们的字典文件,这里要根据字典文件的编码格式进行修改,我的字典的编码格式是gbk,所以可以看到,我使用了encoding=’gbk’来定义要读取的文件的编码格式,如果你的文件是utf-8的,那么你可以直接不写这个参数,因为默认就是utf-8。

然后我们按行读取文件中的内容,生成一个队列,依次将我们字典中读取到的内容加入到我们的队列当中,最后将这个队列返回。

def build_wordlist(wordlist_file):
    '''
        文件读取函数
    '''
    # 打开文件
    fd = open(wordlist_file,"r",encoding="gbk")
    # 按行读取
    raw_words = fd.readlines()
    fd.close()

    found_resume = False
    words = queue.Queue()

    for word in raw_words:
        # 删除末尾置顶空行如\r\n等
        word = word.rstrip()
        if resume is not None:
            if found_resume:
                words.put(word)
            else:
                if word == resume:
                    found_resume = True
                    print("Resuming wordlist from : {} ".format(resume))
        else:
            words.put(word)
    return words

然后我们需要完成一个用来扫描的函数,首先他回判断队列中的内容是否为空,如果不为空就拿出来一个进行使用,然后根据是否存在”.”来判断其是目录还是文件,并且如果我们使用的是无后缀的字典,那么我们回根据传入的extensions参数中的内容去给我们的字典加入相应的后缀,并存入扫描使用的列表中,最后依次从这个列表中获取内容,加在我们的url后面,尝试去访问,根据访问的结果判断是否存在这个文件。

def dir_bruter(word_queue,extensions=None):
    '''
        网站目录扫描
    '''
    while not word_queue.empty():
        attempt = word_queue.get()
        attempt_list = []

        # 如果字典中的数据是以/开头,则去除开头的/
        if attempt[0] == '/':
            attempt = attempt[1:]

        # 判断是目录还是文件
        if "." not in attempt:
            attempt_list.append("/{}/".format(attempt))
        else:

 

相关代码

import threading
import queue
import urllib
import requests
import sys

threads = 50
target_url = sys.argv[1]
wordlist_file = sys.argv[2]
resume = None
header = {
    'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:92.0) Gecko/20100101 Firefox/92.0'
}
code_list = [200,301,302]

def build_wordlist(wordlist_file):
    '''
        文件读取函数
    '''
    # 打开文件
    fd = open(wordlist_file,"r",encoding="gbk")
    # 按行读取
    raw_words = fd.readlines()
    fd.close()

    found_resume = False
    words = queue.Queue()

    for word in raw_words:
        # 删除末尾置顶空行如\r\n等
        word = word.rstrip()
        if resume is not None:
            if found_resume:
                words.put(word)
            else:
                if word == resume:
                    found_resume = True
                    print("Resuming wordlist from : {} ".format(resume))
        else:
            words.put(word)
    return words

def dir_bruter(word_queue,extensions=None):
    '''
        网站目录扫描
    '''
    while not word_queue.empty():
        attempt = word_queue.get()
        attempt_list = []

        # 如果字典中的数据是以/开头,则去除开头的/
        if attempt[0] == '/':
            attempt = attempt[1:]

        # 判断是目录还是文件
        if "." not in attempt:
            attempt_list.append("/{}/".format(attempt))
        else:
            attempt_list.append("/{}".format(attempt))

        # 如果没有后缀则添加后缀
        if extensions and "." not in attempt:
            for extension in extensions:
                attempt_list.append("/{}{}".format(attempt,extension))

        for brute in attempt_list:
            url = "{}{}".format(target_url,brute)
            try:
                r = requests.get(url,headers=header)
                if len(r.text) and r.status_code in code_list:
                    print("[{}] => {}".format(r.status_code,url))
            except:
                pass

word_queue = build_wordlist(wordlist_file)
extensions = [".php",".bak",".orig",".inc","jsp"]

for i in range(threads):
    t = threading.Thread(target=dir_bruter,args=(word_queue,extensions))
    t.start()

 

请登录后发表评论

    • 小白的头像-FancyPig's blog汉堡会员小白LV10超级版主0