文章目录
- 前言
- 一、token参数分析
- 二、burp设置宏操作
- 三、爬虫脚本
- 四、小结
前言
在工作中,会遇到很多登陆页面有token保护,如果用Burpsuite直接抓取数据包并使用爆破模块,则会因token过期导致无法爆破。此时至少可以采用三种办法:
第一种是设置burp宏,从服务器返回包中提取token值,并更新当前数据包再爆破;
第二种是使用爬虫脚本,动态更新token值,并构造新数据后进行爆破;
第三种是使用python运行selenium库进行爆破,好处是无需管什么token,坏处是效率很低,不推荐这种方法。
下面使用DVWA在线靶场分别演示前两种方法(这里不便公布靶场地址,读者自行下载DVWA本地搭建环境即可)。
一、token参数分析
首先访问DVWA登陆页面:
账号密码随便输入,然后点击登陆按钮并抓取数据包:
发现页面中存在token。那么此时使用重放模块测试一下token是否只能用一次,。第一次发送(注意需要跟随重定向):
发现提示的是Login Failed。
第二次发送:
发现提示token不正确。这就意味着,token必须每次更新,通过后端校验后,才会检验正好密码。
接下来查看返回包内容,可以找到token的藏身之处:
现在我们知道,该页面需要保证token正确。那么token又是如何更新的呢,我们在repeater模块是跟随了重定向后出现了token,那么在proxy模块正常传递数据包时,服务端又是如何返回token的呢?查看proxy模块的http history:
可以看到,登陆请求包发送之后,会发送一次GET请求,同时服务器会返回新的token值,下次登陆就需要用这个新的token了。
现在可以判断出,DVWA登陆页面的防爆破功能的逻辑,就是先提交账号密码,当登陆失败时,返回一个新的token,下次提交登陆数据时,需要带着这个token,当token验证通过后,才会验证账号密码。
因此,要想对此页面进行爆破,只要在常规操作的基础上增加一个读取响应包中的token并替换掉数据包中的旧token这样的操作即可实现爆破操作。
二、burp设置宏操作
从上述分析中可以看出,这样的操作流程是固定的,而且需要大量重复操作,那么此时burp的宏就有用武之地了。
现在为了方便你们操作,我用Burp英文版演示一下。
为了节约时间,我就当开了天眼了,知道了账号是admin,但密码不知道,需要爆破。
首先登陆页面输入账号admin,密码随便输入,然后使用burp拦截并放包一次。这样做是为了在burp的历史记录中留下一条记录,如图所示:
接下来在burp的设置中找到以下内容:
不同版本的burp不尽相同,但通常都在sessions里面,有Macrors,这个就是burp的宏。找到以后,需要新增一条宏规则,点击add,然后选择刚才生成token的那条历史记录,接着点击OK:
在出来的界面中,Macro description表示宏的描述,可以随便写。然后点击下方的Response,接着点击右边的Configure item:
接着点击右下角的add:
接着在parameter name这个输入框中,输入user_token,这个值由于后面会变成全局变量,因此绝对不能出错,要完整填入。然后选中下方token的值(不包含单引号),如图所示:
然后连续点击OK即可。
接着可以看到,宏已经设置好了:
此时宏还不能起作用,需要设置规则,告诉burp什么时候执行这个宏。
在session handling rules这里,点击add,然后再rule actions这里点击add,并输入run a macro:
然后如图所示添加user_token变量:
其余内容保持不变,点击右下角的OK。接着点击scope:
接下来就比较灵活了,上面表示该规则要在哪些模块里生效,下面表示要在哪些URL里生效。目前来看如果只是爆破的话,设置对所有URL生效就可以了,因为不是所有的URL都有user_token这个参数:
接着点击OK。
然后在proxy模块将刚才登陆页面的POST请求发送到repeater模块(注意先不要跟随重定向)。
第一次发送:
第二次发送:
此时发现token已经自动在变化了,说明我们刚才设置的规则已经生效了。
接着将该数据包发送到intruder模块。注意爆破时需要跟随重定向,否则无论密码正确与否,都是302,就无法分辨结果了:
之后通过爆破可得密码为password。
用爆破后的密码登陆:
三、爬虫脚本
使用爬虫脚本就不好多做解释了,懂得自然一看就懂,不明白的解释了也没用,大家自行使用即可,源码如下:
import requests
import re
url = "http://target_ip:port/login.php"
def login(password):
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}
session = requests.session()
session.headers.update(headers)
req=session.get(url)
#{}是限定符,{32}表示固定匹配32位,而[a-z0-9]本身表示匹配小写字母和任意数字,后面加上限定符表示必须连续匹配32个数字或小写字母
#re.search()是匹配整个字符串,并返回第一个匹配成功的字符串,因此使用group()函数时,该函数只能为空参数或传入参数0来提取匹配的结果中的字符串
user_token=re.search("[a-z0-9]{32}",req.text).group(0)
data={"username":"admin","password":password,"Login":"Login",'user_token':user_token}
#需要跟随重定向才能保证结果的准确性
req=session.post(url=url,data=data,allow_redirects=True)
html = req.text
return html
with open('这里替换为你的密码字典.txt') as p:
passlist =p.readlines()
#开始爆破
for line in passlist:
line = line.strip("\n")
#随机选取一段只有登陆成功后才能看到的字符串,比如File Upload
if 'File Upload' in login(line):
print( f'>>>爆破成功!正确密码为:{line}')
break
else:
print(f'>>>正在使用密码{line}进行爆破尝试,未成功!')
运行效果如下:
四、小结
本文以DVWA登陆页面为例介绍并演示了含token的登陆页面如何使用burp宏或爬虫脚本实时更新token并进行爆破操作,其中爬虫是我个人重点推荐的,操作简单效率极高,burp相对会繁琐一些。