实验环境:
攻击机:
Burp
靶机:
lzctf.thecat.top
PHP+Mysql+中间件(容器)实验环境搭建这里就不多赘述了。
基本概念和原理:
概念:“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。
其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。
为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
连续性尝试+字典+自动化(成功率不是100%)
字典:一个有效的字典可以大大提高攻击效率
- 常用的账号密码弱口令(TOP500的用户名&&密码)
- 互联网泄露的被拖库的账号密码
- 通过软件生成的密码字典
漏洞形成的原因:
如果一个网站没有对登录接口实施放暴力破解措施(无失败错误限制等),或者实施了不合理的措施(验证码形同虚设)。
漏洞复现&&利用方法:
攻击流程:
- 确认登录接口的脆弱性
确认目标是否存在被暴力破解的的可能性。
比如:尝试登录抓包——抓包——观察报文(判断是否存在暴力破解的可能)
- 对字典进行优化
根据实际情况进行优化,提高爆破效率
比如:1)根据注册提示信息进行优化、2)管理后台爆破(admin/root/administered...)
- 工具自动化操作
配置自动化工具(比如线程、超时时间、延时时间、重放次数等)
BURP暴力破解使用:
Proxy模块:抓包-丢包-放过
intruder模块:根据对应策略进行自动化重放。(常用于自动化猜解、暴力破解)
- target选项卡:设置攻击目标,可以通过proxy发送
- Pasitions选项卡:指定需要暴力破解的参数并且设置成变量,同时选择攻击模式:
Sniper:狙击手
设置一个Payload,先将第一个变量使用字典进行测试。然后再将第二个变量使用字典进行测试。
Battering ram:冲撞车
设置一个Payload,然后所有的变量使用字典内容被替换,然后一起尝试。
Ptichfork:草叉型
每个变量设置一个Payload,分别使用对应的字典对变量进行同时替换爆破;一一对应。
Clustering bomb:集束炸弹
需要为每个变量设置一个Payload,分别使用字典内容组合对变量进行替换。
Payload选项卡:设置字典,并可以对字典进行统一的策略处理。
Options选项卡:对扫描的线程失败重试进行配置;对结果设置匹配的Flag:通过一个标识符来区别结果,并在结果栏中结果出来。
基于表单的暴力破解
开启抓包——登录框随便输入账号密码登录——将数据包发送到intruder模块进行爆破;
将字段长度排序 特殊长度字段,看到返回数据包中带有login success字段 说明爆破成功。
基于验证码的暴力破解
聊一聊“验证码”
你的验证码真的安全吗???
基于前端JavaScript校验验证码绕过
上实验:
发现某站后台登录含有验证码,
输入错误的验证码网页——>>验证码输入错误哦!
不输入验证码——>>验证码不能为空哦!
说明必须输入正确的验证码才能登录。
这个时候右键查看源代码,发现验证码只是在前端进行了校验。
var code; //在全局 定义验证码
function createCode() {
code = "";
var codeLength = 5;//验证码的长度
var checkCode = document.getElementById("checkCode");
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的
for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 36);
code += selectChar[charIndex];
}
//alert(code);
if (checkCode) {
checkCode.className = "code";
checkCode.value = code;
}
}
function validate() {
var inputCode = document.querySelector('#bf_client .vcode').value;
if (inputCode.length <= 0) {
alert("请输入验证码!");
return false;
} else if (inputCode != code) {
alert("验证码输入错误!");
createCode();//刷新验证码
return false;
}
else {
return true;
}
}
createCode();
知道 是前端校验了,那么还需要测试后端是否进行了校验。
开启抓包——登录——将数据包发送到Repeater模块;
对验证码进行删除、修改发包 。经过测试后发现返回包里出现了账号或密码错误(username or password is not exists~)的提示。从中我们可以判定验证码仅仅是前端做了校验,传入后端并没有进行校验。
错误验证码:
删除验证码:
依旧使用Clustering bomb模块进行爆破即可。
基于服务端SERVER校验验证码绕过
保持BURP抓包状态
发现某站后台登录含有验证码,
输入错误的验证码网页——>>验证码输入错误哦!
不输入验证码——>>验证码不能为空哦!
审查元素发现 如下代码
发现验证码是在网页刷新的时候生成的;那么如果保持网页不刷新验证码不刷新的状态使用burp进行爆破是否可行呢???
经过Repeater模块的删除、修改验证码,发包测试说明。验证码传入后端进行了判断校验。
验证码为空的情况:
验证码为错误的情况:
但是保持网页不刷新的情况下,数据包中带入正确的验证码 爆破发现爆破成功,说明验证码不失效。
成功:
Token防爆破?
Token并不能防止爆破。
首先在靶场中选择token放爆破?模块,在用户名和密码栏中随意输入一个用户名和密码,打开Burp Suite并开启截获功能,抓取数据包。
将所得数据包发送到Repeater模块测试是否除了验证码、用户名和密码外还有token保护。
将数据包发送到Intruder模块将线程设为1,然后给用户名、密码和token添加变量,此时我们要设置一个针对token的字典,点击options勾选grep-extract并点击添加,在弹出的窗口中点击refetch在得到的数据包中找到token值并选中,此时会自动填充值,然后点击ok。如此就得到了一个针对于token的字典。
此时我们将爆破方式改为Pitch fork,给用户名和密码添加常规字典,在给token添加变量是选择recursive grep,使用刚才得到的字典,在下方的框中输入未被使用的token值。

## 后台代码分析:
## 防范措施:
* 是否强制要求用户设置复杂密码;
* 是否每次验证都使用安全的验证码;
* 是否对尝试登录的用户的行为进行判断&&限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
* 是否在必要情况下采取了双因素认证;
* ...等