You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

路径遍历检测代码无法遍历文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:06:04