1. 漏洞简介
暴力破解:指攻击者通过穷举字典中所有的密码组合,逐一尝试登录,直到找到正确的密码。
核心成因:服务器端没有对登录失败的次数进行限制,也没有验证码(Captcha)或二次验证(2FA)机制,导致攻击者可以无限次尝试。
2. 环境准备
- 靶场:Pikachu -> 暴力破解 -> 基于表单的暴力破解
- 工具:Burp Suite Pro
- 字典:自己收集的弱口令字典(包含常用用户名以及密码字典)
3. 渗透测试过程
第一步:抓取登录数据包
随便输入用户名 test 和密码 test,点击 Login。在 Burp Suite 的 Proxy 模块中拦截到如下请求:

可以看到是标准的 POST 请求,包含 username 和 password 两个参数。
第二步:发送到 Intruder 模块
右键点击请求包,选择 Send to Intruder (或 Ctrl+I)。
在 Positions 选项卡中,点击 Clear § 清除所有标记,然后选中 username 和 password 的值,点击 Add §。

- Attack Type 选择:Cluster bomb (集束炸弹模式)。
- 笔记:因为要同时爆破用户名和密码,Cluster bomb 会尝试所有组合(笛卡尔积)。如果已知用户名只爆破密码,可以用 Sniper 模式。如上图所示。
第三步:配置有效载荷 (Payloads)

第四步:发起攻击与结果分析
点击 Start Attack 开始爆破。观察结果列表,我们需要通过 响应长度 (Length) 、状态码 或者 页面返回情况 来区分是否成功。这里没爆破用户名,因为如果加上用户名,爆破次数实在是太多了,但实战过程中如果不知道用户名,就需要爆破用户名。

发现异常 :
大部分请求的响应长度都是 35021(假设值),但有一条请求的长度是 34997。
查看该请求的 Response,发现页面返回了 login success 字样。
4. 代码审计
查看 Pikachu 后端的 PHP 源码(去 GitHub 看,或在镜像文件 app/vul/burteforce 中看):
// 典型的问题, 没有验证码, 没有其他控制措施, 可以暴力破解
if(isset($_POST['submit']) && $_POST['username'] && $_POST['password']){$username = $_POST['username'];
$password = $_POST['password'];
$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);
$line_pre->bind_param('ss',$username,$password);
if($line_pre->execute()){$line_pre->store_result();
if($line_pre->num_rows>0){$html.= '<p> login success</p>';} else{$html.= '<p> username or password is not exists~</p>';}
} else{$html.= '<p> 执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';}
}
分析 :
代码中仅校验了用户名和密码是否匹配数据库,完全没有 以下防护措施:
- 没有验证码(机器可以自动化提交)。
- 没有针对 IP 或 账号 的登录失败锁定机制(例如:输错 5 次锁定 30 分钟)。
- 没有双因素认证。
这就是导致暴力破解漏洞的根本原因。
5. 修复与防御建议
如果在生产环境中遇到此类漏洞,建议开发人员采取以下措施:
- 增加验证码:引入图形验证码或滑块验证,增加自动化攻击成本。
- 账号锁定策略:记录登录失败次数,例如“连续失败 5 次,锁定账号 15 分钟”。
- 延时响应:登录失败后,强制等待几秒钟才能再次请求。
- 强密码策略:强制用户设置复杂的密码,避免被简单字典跑出来。