python小工具连载-web目录碰撞

python小工具连载

web目录碰撞

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

应用场景

我们都知道,现在存在大量开源的cms被我们使用,甚至于在各种企业网络中都变得常见。而所有的系统在安装、配置以及不定管理方面都有着自己的缺陷,CMS也不例外。由于我们可以从网上下载任何开源的web应用程序,并在本地搭建,那么我们可以根据这个来创建一个能够获取远程目标所有文件都扫描器。这样就能深度挖掘被.htacess文件保护的残留安装文件和目录以及其他内容。相比于常见的御剑、dirsearch来说,我们通过利用本地cms源码来对网站进行扫描,大大提高了命中率,就像针对不同的病毒打不同的疫苗一样,在测试中我使用dirsearch对自己的网站进行扫描,结果只有10个左右,但是使用本次编写的web目录碰撞工具,成功扫描到了140+个敏感文件,其中不乏数据库的配置文件等。

工具效果

利用本地源码目录对自己的网站目录进行碰撞。

使用方法:python3 web目录碰撞.py target_url 本地cms路径

Snipaste_2021-12-25_18-12-23.png

 

 

 

dirsearch扫描结果

image-20211225181523010.png

 

实现原理

因为我们的工具实现原理是我们扫描本地的cms源码文件,通过这些源码文件中的目录去对网站的目录进行碰撞,所以我们肯定需要一个cms的源码。这里我将源码下载放在了download下的build文件中。

首先呢,我们需要输入目标的网址以及本地源码的路径,然后根据源码的路径,使用os.chdir函数将工作目录切换到该路径下。然后通过os.walk函数去遍历该路径下的所有文件,并以队列的方式进行存储。并且在发现一些我们不需要的文件时,会自动将它省略。

target = sys.argv[1]
directory = sys.argv[2]
filters = [".jpg",".gif",".png",".css"]
# 切换工作路径
os.chdir(directory)
# 创建一个队列
web_paths = queue.Queue()

for r,d,f in os.walk("."):
    for files in f:
        remote_path = "{}/{}".format(r,files)
        if remote_path.startswith("."):
            remote_path = remote_path[1:]
        if os.path.splitext(files)[1] not in filters:
            web_paths.put(remote_path)

现在我们就获得了该cms的所有文件的路径,然后我们将其与我们的url拼接起来,使用requests模块去进行访问,通过网页状态码来判断该页面是否可以访问到。

def test_remote():
    while not web_paths.empty():
        path = web_paths.get()
        url = "{}{}".format(target,path)
        #print(url)
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)'
        }
        
        try:
            response = requests.get(url,headers=headers)
            if response.status_code == 200:
                print("[{}] => {}".format(response.status_code,url))
                result.append(url)
            else:
                print("[-] {} 状态吗为:{}".format(url,response.status_code))
        except:
            print("[-] {} {}".format(url,"连接失败"))
            pass

因为一个网站的文件往往很多,所以这里还采用了多线程的方式进行扫描,并且在最后扫描结束时,将扫描的结果全部放入我们的result.txt文件中。

for i in range(threads):
    t = threading.Thread(target=test_remote)
    t.start()

while True:
    if threading.active_count() == 1:
        os.chdir(now_work)
        f = open('result.txt','w')
        for i in result:
            f.write(i+'\n')
        f.close()
        break

相关代码

import queue
import threading
import os
import sys
import urllib3
import requests
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

threads = 10

target = sys.argv[1]
directory = sys.argv[2]
filters = [".jpg",".gif",".png",".css"]

# 记录当前工作路径
now_work = os.getcwd()
# 切换工作路径
os.chdir(directory)
# 创建一个队列
web_paths = queue.Queue()

for r,d,f in os.walk("."):
    for files in f:
        remote_path = "{}/{}".format(r,files)
        if remote_path.startswith("."):
            remote_path = remote_path[1:]
        if os.path.splitext(files)[1] not in filters:
            web_paths.put(remote_path)

result = []

def test_remote():
    while not web_paths.empty():
        path = web_paths.get()
        url = "{}{}".format(target,path)
        #print(url)
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)'
        }
        
        try:
            response = requests.get(url,headers=headers)
            if response.status_code == 200:
                print("[{}] => {}".format(response.status_code,url))
                result.append(url)
            else:
                print("[-] {} 状态吗为:{}".format(url,response.status_code))
        except:
            print("[-] {} {}".format(url,"连接失败"))
            pass

for i in range(threads):
    t = threading.Thread(target=test_remote)
    t.start()

while True:
    if threading.active_count() == 1:
        os.chdir(now_work)
        f = open('result.txt','w')
        for i in result:
            f.write(i+'\n')
        f.close()
        break

 

 

 

 

 

请登录后发表评论