靶场环境搭建
源文件下载
git clone https://github.com/zhuifengshaonianhanlu/pikachu.git
phpstudy的WWW目录下,修改WWW\pikachu\inc
目录下的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
其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。例如在协议中定义了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
§
符号。攻击模式选择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小时。
双因子认证:结合两种不同的认证因素对认证用户。如密码、身份证、安全令牌、指纹、面部识别、地理信息等。
-
人为层面
提高密码的长度与复杂度。密码每增加一位,爆破的时间就会成指数地增长,加大对方爆破的成本。
避免使用字典单词。
避免使用个人非机密信息作为密码,例如电话号码、出生日期、名字缩写。