社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

WhITECat安全团队 • 4 年前 • 453 次点击  


声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系昊辰。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。

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

dirsearch扫描结果

image-20211225181523010

实现原理

因为我们的工具实现原理是我们扫描本地的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

关注公众号回复"web目录碰撞"获取该工具



推荐阅读


python小工具学习连载-ssh隧道


python小工具学习连载-ssh反向连接


python小工具学习连载-反向shell


python小工具学习连载-取代瑞士军刀


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125133