绕过token进行密码爆破
-
预备知识
-
什么是Token?
Token是计算机术语:令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧。Token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。
-
基于 Token 的身份验证方法:
1.客户端使用用户名跟密码请求登录。
2.服务端收到请求,去验证用户名与密码。
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端。
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里。
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token。
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
-
-
实验准备
-
DVWA靶场
-
Burp suite 2022.9.5(爆破工具)
-
python3环境(后附python爆破脚本)
-
-
登录流程
-
用户请求GET请求网站首页,服务器给用户返回一个session,Token藏在Session中同时也在响应页面
-
用户输入账号密码通过post请求自动将Token作为数据发送给服务器
-
服务器将前后两个Token进行对比,如果一致,再判断账号密码是否正确
-
-
Burpsuite爆破思路
- 利用Burpsuite获取服务器第一次返回的Token
- 利用第一次的Token和账号密码提交POST请求
- 选定密码作为爆破参数,进行Intruder模块爆破
-
Burp的两种爆破方法
-
设置宏插件进行爆破
首先开启代理,抓取get请求页面,获取Token
放行GET页面让Burpsuite有记录
添加Session抓取规则
添加宏规则,选中步骤3中的Run A macro,添加一个宏规则
选中刚才放行的GET请求,点击OK
配置宏规则
添加规则
选择需要抓取的Token的内容,同时设置和响应中相同的参数名字,点击OK
这里发现我们的宏规则已经配置成功,继续点击OK
继续OK
设置仅使用刚才设置的参数,设置完毕点击close,点击OK
配置影响的URL
设置完毕后就可以爆破了,输入账号密码抓取POST请求包
右键选择Send to Intuder,发送到Intuder模块,在Intuder模块中选中密码作为爆破参数
选择payload,设置爆破的字典
选择总是重定向,因为输入账号密码以后的网站会被服务器进行重定向
在Burpsuite2022.9.5中需要选择自定义攻击线程为1,线程过多Token容易混乱爆破不出来(我就是因为线程太多,爆破了好多次都失败了),而且这个版本的Burpsuite很坑需要手动把窗口拉大或者放大,才可以看到自定义的线程。
设置完毕以后开始爆破,时间取决于你的字典,如果是1个线程还没有办法爆破成功,可能是你的字典里面没有这个密码,在爆破页面我们将返回长度按照从大到小排列,就可以看到爆破成功的密码和其他的米密码长度不同。就可以确定正确密码,也可以查看服务在跳转以后的返回页面。密码就是:password
-
利用Pitchfork模式直接爆破密码和Token
同样抓取POST请求包,直接发送到Intuder模块选择Pitchfork模式
选择密码和Token为爆破目标
在Options中先选择总是跳转,然后设置查找规则,选中响应中的Token作为匹配规则
设置完毕以后,设置Token的payload类型
选择线程进行攻击
按照同样的方法可以看到正确的密码为password
-
-
使用python脚本进行自动化Token绕过爆破
#coding:utf-8 import requests import re url = input("请输入您要爆破的地址:") def login(password): session = requests.session()#记录request第一次的session req=session.get(url)#利用session进行get请求 token = re.findall(r'value=\'(.+)\'', req.text) #利用正则寻找第一次get请求中的user_token user_token = token[0]#将get请求中的token保存下来 data={"username":"admin","password":password,"Login":"Login",'user_token':user_token}#post请求中需要的数据 req=session.post(url=url,data=data,allow_redirects=True)#发送post请求,并且允许跳转 html = req.text#获取post请求以后的respond return html #读取爆破需要用到的字典 with open('./top1000_02.txt') as p: passlist =p.readlines() p.close() for line in passlist: line = line.strip("\n") print(line) if 'Welcome' in login(line):#判断是否爆破成功,如果成功直接停止 print( "[* 密码 is %s *]" % line ) break
-
总结
绕过Token就是抓取服务器第一次返回客户端的Token,带着这个Token配合密码字典进行爆破。Token的设置就是为了防止CSRF(跨站请求伪造)攻击的,确保发起请求的人是客户本人,如果不是及时拦截。想要交流这个爆破脚本的可以留言。