记录一下暴力破解时绕过Token的方法。
靶场环境搭建
源文件下载
代码语言:javascript复制git clone https://github.com/zhuifengshaonianhanlu/pikachu.git
将下载的源文件放置在phpstudy的WWW目录下,修改WWWpikachuinc
目录下的config.inc.php
。
define('DBHOST', '127.0.0.1');//将localhost或者127.0.0.1修改为数据库服务器的地址
define('DBUSER', 'root');//将root修改为连接mysql的用户名
define('DBPW', 'your password');//将root修改为连接mysql的密码,如果改了还是连接不上,请先手动连接下你的数据库,确保数据库服务没问题在说!
define('DBNAME', 'pikachu');//自定义,建议不修改
define('DBPORT', '3306');//将3306修改为mysql的连接端口,默认tcp3306
打开phpstudy,启动Apache
和MySQL
服务。
点击网站>>创建网站,根目录选择pikachu,点击确认,代开浏览器访问localhost:80
即可。
Token防爆破?
进入靶场,查看源码,发现有一个token
,每刷新一次网页就会改变值。
所以使用token来防止暴力破解是没有任何用处的,因为他已经在网页响应中可以查看到了
什么是Token
Token
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。
token
其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。例如在USB1.1
协议中定义了4类数据包:token
包、data
包、handshake
包和special
包。主机和USB设备之间连续数据的交换可以分为三个阶段,第一个阶段由主机发送token
包,不同的token
包内容不一样(暗号不一样)可以告诉设备做不同的工作,第二个阶段发送data
包,第三个阶段由设备返回一个handshake
包。
抓包
打开代理,用户名输入admin
(其实用户名也需要暴力破解,这里就不赘述了,直接用admin),密码随便输入一串数字,用burp suite抓包。发现POST
方式不仅传递了用户名和密码,还传递了一个token
值,这个token
值应该是我们访问这个页面时就已经存在了,所以我们需要得到每一个返回包中的token值,然后进行爆破。全选,点击右键,send to intruder
。
POST /vul/burteforce/bf_token.php HTTP/1.1
Host: localhost:83
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 77
Origin: http://localhost:83
Connection: close
Referer: http://localhost:83/vul/burteforce/bf_token.php
Cookie: PHPSESSID=kltiqjun7dq9lh5bejeekoosnt
Upgrade-Insecure-Requests: 1
username=admin&password=123456&token=9542662f66eac423a8799183261&submit=Login
选中密码和token,点击添加payload位置,成功后密码和token的值两边会加上§
符号。攻击模式选择pitchfork
。
一个密码对应一个token值。
构造payload
密码构造很简单,载入一个字典文件即可。
接下来构造token
的payload
。选择payload
集为2。点击资源池,创建一个线程为1,延迟2000的资源池。因为token是一对一的关系,当第二个token产生,第一个token就会消失,所以需要将线程调整至1。
进入选项(Option),在Grep-Extract
模块中添加token
。
点击获取响应,然后在响应中搜索token
,选中value
,复制下来并点击OK
。
在重定向模块中选择always
,回到payload界面。
选择payload类型为递归匹配(Recursive grep)。再将刚才复制的第一个token
值粘贴在下方的第一个请求的初始payload。
爆破
开始爆破。发现密码为123456
时的length
与其他不同,所以密码为123456。用这个密码尝试登录,发现login success
,就这样完成了绕过token
的暴力破解。
总结
所以这里的token
防爆破其实没有任何用。
如何有效的防范暴力破解?
- 系统层面
- 验证码策略:设计安全的验证码(安全的流程 复杂可用的图形)
- 锁定策略:认证错误对提交次数给予限制,比如错误三次不可再登录2小时。
- 双因子认证:结合两种不同的认证因素对认证用户。如密码、身份证、安全令牌、指纹、面部识别、地理信息等。
- 人为层面
- 提高密码的长度与复杂度。密码每增加一位,爆破的时间就会成指数地增长,加大对方爆破的成本。
- 避免使用字典单词。
- 避免使用个人非机密信息作为密码,例如电话号码、出生日期、名字缩写。