Pikachu靶场通关笔记(1) — 基于表单的暴力破解

50次阅读
没有评论

1. 漏洞简介

暴力破解:指攻击者通过穷举字典中所有的密码组合,逐一尝试登录,直到找到正确的密码。
核心成因:服务器端没有对登录失败的次数进行限制,也没有验证码(Captcha)或二次验证(2FA)机制,导致攻击者可以无限次尝试。

2. 环境准备

  • 靶场:Pikachu -> 暴力破解 -> 基于表单的暴力破解
  • 工具:Burp Suite Pro
  • 字典:自己收集的弱口令字典(包含常用用户名以及密码字典)

3. 渗透测试过程

第一步:抓取登录数据包
随便输入用户名  test  和密码  test,点击 Login。在 Burp Suite 的 Proxy 模块中拦截到如下请求:

Pikachu 靶场通关笔记(1) — 基于表单的暴力破解

可以看到是标准的 POST 请求,包含  username  和  password  两个参数。

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

Pikachu 靶场通关笔记(1) — 基于表单的暴力破解
  • Attack Type 选择:Cluster bomb (集束炸弹模式)。
    • 笔记:因为要同时爆破用户名和密码,Cluster bomb 会尝试所有组合(笛卡尔积)。如果已知用户名只爆破密码,可以用 Sniper 模式。如上图所示

第三步:配置有效载荷 (Payloads)

Pikachu 靶场通关笔记(1) — 基于表单的暴力破解

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

Pikachu 靶场通关笔记(1) — 基于表单的暴力破解

发现异常
大部分请求的响应长度都是  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>';}
}

分析
代码中仅校验了用户名和密码是否匹配数据库,完全没有 以下防护措施:

  1. 没有验证码(机器可以自动化提交)。
  2. 没有针对 IP 或 账号 的登录失败锁定机制(例如:输错 5 次锁定 30 分钟)。
  3. 没有双因素认证。

这就是导致暴力破解漏洞的根本原因。

5. 修复与防御建议

如果在生产环境中遇到此类漏洞,建议开发人员采取以下措施:

  1. 增加验证码:引入图形验证码或滑块验证,增加自动化攻击成本。
  2. 账号锁定策略:记录登录失败次数,例如“连续失败 5 次,锁定账号 15 分钟”。
  3. 延时响应:登录失败后,强制等待几秒钟才能再次请求。
  4. 强密码策略:强制用户设置复杂的密码,避免被简单字典跑出来。
正文完
 1
评论(没有评论)