暴力破解(Brute Force)
漏洞原理分析
后端代码逻辑(Low级别)
<?phpif(isset($_GET['username'])&&isset($_GET['password'])){$user=$_GET['username'];$pass=$_GET['password'];$pass=md5($pass);// MD5加密// 查询数据库验证$query="SELECT * FROM users WHERE user='$user' AND password='$pass'";}?>关键特征:
- 使用GET请求传输凭证
- 登录成功和失败返回的页面大小不同
- 无验证码防护
- 无登录频率限制
手工测试
1. 获取凭证信息
访问phpMyAdmin:http://127.0.0.1/phpmyadmin/
-- 查看users表SELECT*FROMdvwa.users;-- 发现:用户名: admin 密码哈希:5f4dcc3b5aa765d61d8327deb882cf99使用CMD5.com解密:password
2. 观察响应差异
正确凭证: 页面显示"Welcome to the password protected area" 错误凭证: 页面显示"Username and/or password incorrect"关键点:页面长度(Length)不同,这是暴力破解的判断依据。
Burp Suite自动化攻击
攻击流程
1. 抓包并发送到Intruder
输入任意密码 → 点击Login → Burp抓包 → 右键 → Send to Intruder2. 配置攻击位置
GET /vulnerabilities/brute/?username=admin&password=123&Login=Login ^^^ 选中123 → Add点击"Clear $"清除所有标记,然后仅标记密码字段。
3. 选择攻击模式
四种攻击模式详解
Sniper(狙击手)模式
特点:单一变量攻击适用场景:
- 已知用户名,爆破密码
- 单一输入框测试
示例:
用户名: admin(固定) 密码: [字典中的值]Battering Ram(撞锤)模式
特点:多个位置使用同一payload适用场景:
- 用户名和密码相同的情况
- 工号、学号等场景
示例:
用户名: [payload] 密码: [相同payload]Pitchfork(草叉)模式
特点:多个字典一一对应适用场景:
- 撞库攻击
- 从其他泄露数据库获取的凭证
- 成功率可达85%
示例:
用户名列表: [admin, user1, user2] 密码列表: [pass1, pass2, pass3] 组合: admin:pass1, user1:pass2, user2:pass3Cluster Bomb(集束炸弹)模式
特点:完全笛卡尔积攻击适用场景:
- 完整的暴力破解
- 用户名和密码都未知
示例:
用户名: [admin, user1] 密码: [123, 456, 789] 组合: admin:123, admin:456, admin:789, user1:123, user1:456, user1:7894. 加载字典
Payloads → Payload Options → Load → 选择密码字典 或 手动添加: Add → 输入密码 → 确保包含正确密码5. 优化配置
Options → Request Engine → Number of threads: 10增加线程数提高速度(默认为1)。
6. 开始攻击
Intruder → Start attack7. 分析结果
点击Length列排序 → 找出响应长度不同的记录 → 即为正确密码验证码对抗
方案一:打码平台
实现流程:
# 伪代码示例1.检测到验证码2.截图验证码区域3.发送到打码平台API4.人工识别(大学生兼职)5.返回识别结果6.填入验证码并提交成本:约每100次识别收费数元
适用场景:
- 简单图形验证码
- 数字字母组合
- 中文验证码
方案二:机器学习
技术栈:
- 深度学习框架(TensorFlow、PyTorch)
- CNN卷积神经网络
- 图像识别模型
优势:
- 可识别复杂验证码
- 长期成本更低
- 可处理滑块、点选等交互式验证
劣势:
- 需要较强技术背景
- 模型训练需要大量样本
- 初期投入高
防护建议
开发层面:
// 1. 使用POST传输凭证if($_SERVER['REQUEST_METHOD']==='POST'){$username=$_POST['username'];$password=$_POST['password'];}// 2. 实施账户锁定$attempts=get_login_attempts($username);if($attempts>5){die("账户已锁定,请30分钟后再试");}// 3. 添加验证码if(!verify_captcha($_POST['captcha'])){die("验证码错误");}// 4. 记录审计日志log_login_attempt($username,$ip,$result);