路径遍历检测代码无法遍历文件payload列表,执行到第一行就挂起无报错
问题根因分析
- 最核心的错误是将
input("Site: ")用户输入逻辑写在了PathTraversal函数内:程序每遍历一个payload就会触发一次输入要求,执行到第一个payload时就会阻塞等待用户输入,无任何输出的状态看起来就是程序挂起,就算不用多线程换成普通for循环也会触发同样的阻塞问题 - 次要问题:
requests.get没有设置超时时间,若目标站点无响应会导致请求永久阻塞 - 次要问题:
UserAgent实例每次请求都重新初始化,增加不必要的开销,部分版本的fake_useragent初始化时拉取在线资源也可能导致阻塞 - 次要问题:多线程场景下使用生成器存储payload列表可能出现迭代异常
修复方案
第一步:调整用户输入逻辑位置
将站点输入逻辑移到主入口处,程序启动时仅要求输入一次目标站点,无需每个payload都重复输入
第二步:添加请求超时设置
给requests.get添加timeout参数,避免无响应时永久阻塞
第三步:优化冗余逻辑
将UserAgent初始化、Session实例化移到全局位置,减少重复开销
修复后完整代码
from colorama import Fore, Back, Style from fake_useragent import UserAgent import concurrent.futures import requests import os import sys # 全局初始化仅执行一次 ua = UserAgent() header = {'User-Agent': str(ua.chrome)} session = requests.Session() session.headers.update(header) filepath = os.path.abspath(os.getcwd()) payload_file = os.path.join(filepath, "wordlists/DirTraversal.txt") # 直接读为列表,避免生成器迭代问题 with open(payload_file, "r", encoding="utf-8") as f: dirtraversal = [x.strip() for x in f.readlines() if x.strip()] def get_request(url: str): try: # 添加10秒超时,避免永久阻塞 r = session.get(url, timeout=10) if r.status_code == 200: if b"root:x:" in r.content: print(f"{Fore.GREEN} VULNERABLE {Fore.CYAN} - {Fore.WHITE} {url}") else: print(f"{Fore.RED} NOT VULNERABLE {Fore.CYAN} - {Fore.WHITE} {url}") else: print(f"{Fore.YELLOW} STATUS CODE {r.status_code} {Fore.CYAN} - {Fore.WHITE} {url}") except Exception as e: print(f"{Fore.YELLOW} REQUEST FAILED {Fore.CYAN} - {Fore.WHITE} {url} | 错误信息:{str(e)}") def PathTraversal(target, payload): check_url = target + payload get_request(check_url) if __name__ == "__main__": try: # 输入逻辑移到主入口,仅输入一次 target = input("Site: ").strip() if not target: print("目标站点不能为空") sys.exit(1) with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: # 固定target参数,遍历payload列表 for payload in dirtraversal: executor.submit(PathTraversal, target, payload) except KeyboardInterrupt: print("\n程序已终止") sys.exit(0) except Exception as e: print(f"程序异常:{str(e)}") sys.exit(1)
额外优化说明
- 限制了线程池最大并发数为10,避免短时间内请求过多被目标站点封禁
- 增加了异常捕获逻辑,请求失败时会输出具体错误信息,不会静默挂起
- 读取payload时过滤了空行,避免无效请求
内容的提问来源于stack exchange,提问作者c0d3ninja
相关产品推荐
相关产品推荐

