目录
漏洞简介
什么是暴力破解(Brute Force)?
暴力破解是一种试错方法,攻击者通过系统地尝试所有可能的密码组合来获取访问权限。
常见场景:
- 登录表单
- 管理后台
- API密钥
- 加密文件
危害:
- 未授权访问账户
- 数据泄露
- 权限提升
- 系统接管
Low 难度
攻击目标
无任何防护的登录表单,可直接暴力破解。
后端代码分析
1 |
|
漏洞分析
存在的安全问题:
- 使用GET请求 - 密码明文显示在URL中,会被浏览器历史、代理服务器记录
- 无输入验证 - 直接使用用户输入
- SQL注入漏洞 - 直接拼接SQL语句
- 无防护机制 - 没有任何限制:
- 无登录尝试次数限制
- 无验证码
- 无延迟
- 无账户锁定
- 无IP黑名单
- 错误信息详细 - SQL错误会直接显示
攻击步骤
方法1:使用Burp Suite Intruder
步骤1:抓取登录请求
- 打开Burp Suite,开启代理
- 浏览器访问
http://dvwa.local/dvwa/vulnerabilities/brute/ - 尝试登录(例如:admin / test)
- 在Burp Suite的Proxy → HTTP history中找到请求
步骤2:发送到Intruder
- 右键点击请求 → Send to Intruder
- 进入Intruder → Positions标签
步骤3:配置攻击位置
1 | GET /dvwa/vulnerabilities/brute/?username=§admin§&password=§test§&Login=Login |
- 点击 Clear § 清除所有标记
- Attack type 选择
Cluster bomb(组合攻击) - 标记username和password参数
步骤4:配置Payload
Payload set 1(用户名):
1 | admin |
Payload set 2(密码):
1 | password |
步骤5:开始攻击
- 点击 Start attack
- 观察 Length 列,长度不同的响应通常表示成功
- 或使用 Grep-Match 功能匹配 “Welcome to the password protected area”
步骤6:验证结果
找到长度异常的请求,右键 → Show response in browser,验证登录成功。
方法2:使用Hydra命令行工具
1 | # 安装hydra(Kali Linux自带) |
参数说明:
-L users.txt- 用户名字典文件-P passwords.txt- 密码字典文件http-get-form- HTTP GET表单^USER^- 用户名占位符^PASS^- 密码占位符:Username and/or password incorrect- 失败标识H=Cookie- 添加Cookie头
方法3:Python脚本
1 | import requests |
DVWA默认账户
1 | admin / password |
Medium 难度
攻击目标
添加了基本防护,但仍可破解。
后端代码分析
1 |
|
新增防护
- mysqli_real_escape_string() - 防止SQL注入
- sleep(2) - 每次失败延迟2秒
仍存在的漏洞
- 仍使用GET请求
- 无账户锁定
- 无验证码
- 延迟可预测(固定2秒)
- 仍可暴力破解(只是变慢)
攻击步骤
使用Burp Suite Intruder:
Medium难度因为有2秒延迟,所以需要配置为单线程攻击。
配置步骤(Burp Suite 2023版本):
基本步骤与Low难度相同
- 发送请求到Intruder
- 配置Positions(标记username和password)
- 配置Payloads(添加字典)
关键配置:在Settings标签中限制并发
进入
Intruder→Settings标签:方法A:使用Resource pool(如果你的版本有此选项)
- 找到
Resource pool选项 - 点击
Create new resource pool - 设置
Maximum concurrent requests: 1(单线程) - 原因:Medium有2秒延迟,多线程也需要等待,单线程更稳定
方法B:使用新版Burp Suite的Settings(2023及更新版本)
如果你的Burp Suite没有Resource pool选项,使用以下配置:
- 找到 “HTTP/1 connection reuse” 部分
- 勾选 ✅
Reuse HTTP/1 connections if the server supports it(复用连接) - 找到 “Redirections” 部分
- 根据需要设置重定向策略(通常选择
Never) - 找到 “Error handling” 部分
- 设置
Number of retries on network failure: 3 - 设置
Pause before retry (milliseconds): 2000
重要说明:
- Burp Suite 2023版本已经移除了单独的Resource pool配置
- 默认情况下,Burp会自动管理并发连接
- 由于Medium难度有2秒延迟,即使多线程,每个请求也会等待
- 因此不需要特别限制线程,Burp会自动优化
- 找到
开始攻击
- 点击
Start attack按钮 - Burp会按顺序发送请求
- 每次失败会自动等待2秒(服务器端延迟)
- 点击
时间计算:
- 尝试100个密码 = 200秒(约3分钟)
- 尝试1000个密码 = 2000秒(约33分钟)
优化策略:
- 使用更精准的小字典
- 针对DVWA使用已知密码列表
- 晚上挂机运行
Burp Suite版本差异说明:
| 功能 | 旧版本(2020及之前) | 新版本(2023+) |
|---|---|---|
| 线程控制 | Resource pool | 自动管理 |
| 配置位置 | Intruder → Options | Intruder → Settings |
| 并发设置 | Maximum concurrent requests | HTTP/1 connection reuse |
| 建议 | 手动设置为1 | 保持默认即可 |
High 难度
攻击目标
添加了CSRF Token和随机延迟,难度大幅提升。
后端代码分析
1 |
|
新增防护
- CSRF Token验证 - 每次请求需要有效token
- stripslashes() - 额外输入过滤
- 随机延迟 - 0-3秒随机延迟(平均1.5秒)
仍存在的漏洞
- 仍使用GET请求
- 无账户锁定
- Token可以被提取
攻击步骤
High难度的关键在于绕过CSRF Token验证。
方法1:使用Burp Suite的Macro功能
步骤1:创建Macro获取Token
- 打开Burp Suite
Settings→Sessions→Session Handling Rules- 点击
Add - Rule Actions →
Add→Run a macro - 点击
Add创建新Macro:- 名称:Get CSRF Token
- 从Proxy History中选择访问brute force页面的GET请求
- 点击
Configure item - 添加Custom parameter location
- Parameter name:
user_token - 使用正则提取:
name='user_token' value='([^']+)'
步骤2:配置Session Handling
- 在Rule中启用 “Update only the following parameters”
- 添加
user_token - Scope → Include all URLs
步骤3:开始Intruder攻击
现在每次请求前都会自动获取新的token。
方法2:Python脚本自动获取Token
1 | import requests |
Impossible 难度
攻击目标
几乎无法攻破的完善防护。
后端代码分析
1 |
|
完善的防护机制
- POST请求 - 密码不出现在URL
- PDO预编译 - 完全防止SQL注入
- CSRF Token - 防止跨站请求伪造
- 账户锁定 - 3次失败锁定15分钟
- 失败计数 - 记录每个账户的失败次数
- 成功重置 - 成功登录清零计数器
- 时间更新 - 记录每次尝试时间
- 随机延迟 - 2-4秒不可预测
为什么几乎无法攻破?
攻击成本计算:
假设密码字典有1000个密码:
- 每3次尝试需要等待15分钟
- 1000密码 ÷ 3 = 334轮
- 334轮 × 15分钟 = 5010分钟 ≈ 83.5小时
- 加上每次2-4秒延迟:1000次 × 3秒 ≈ 50分钟
- 总计:约84小时(3.5天)
这还只是一个用户名!
防御层级:
- PDO预编译 → SQL注入无效
- CSRF Token → 自动化工具需要额外处理
- 账户锁定 → 暴力破解效率极低
- POST请求 → URL不泄露密码
- 随机延迟 → 增加时间成本
防御建议
代码层面
- 使用POST请求 - 敏感数据不应出现在URL
- PDO预编译语句 - 彻底防止SQL注入
- CSRF Token - 防止跨站请求伪造
- 密码哈希 - 使用bcrypt、Argon2,不要用MD5
- 输入验证 - 严格验证所有输入
机制层面
账户锁定
- 5次失败锁定30分钟
- 或使用指数退避(1分钟→5分钟→30分钟)
验证码
- 3次失败后显示验证码
- 使用reCAPTCHA v3
多因素认证(MFA)
- 短信验证码
- TOTP(Google Authenticator)
- 硬件密钥
限流
- IP限流:每IP每分钟10次请求
- 账户限流:每账户每分钟3次尝试
监控层面
日志记录
- 记录所有登录尝试
- 包括IP、时间、用户名
异常检测
- 监控失败登录高峰
- 检测分布式攻击
告警机制
- 多次失败触发告警
- 异常IP自动封禁
Web应用防火墙(WAF)
- Cloudflare
- AWS WAF
- ModSecurity
总结对比
| 特性 | Low | Medium | High | Impossible |
|---|---|---|---|---|
| 请求方法 | GET | GET | GET | POST |
| SQL注入防护 | ❌ | ✅ mysqli_escape | ✅ mysqli_escape | ✅ PDO预编译 |
| CSRF防护 | ❌ | ❌ | ✅ Token | ✅ Token |
| 登录延迟 | ❌ | ✅ 2秒固定 | ✅ 0-3秒随机 | ✅ 2-4秒随机 |
| 账户锁定 | ❌ | ❌ | ❌ | ✅ 3次/15分钟 |
| 失败计数 | ❌ | ❌ | ❌ | ✅ |
| 攻击难度 | 极易 | 简单 | 中等 | 极难 |
| 预计破解时间 | <1分钟 | 30分钟 | 数小时 | 数天 |
实战建议
- 从Low开始 - 熟悉基本操作
- 理解Medium - 学习基础防护
- 挑战High - 掌握Token绕过
- 研究Impossible - 理解完善的防护体系
学习路径:
- 手动测试 → Burp Suite → 脚本自动化 → 分析防护机制
道德准则:
- 只在授权环境测试
- 不攻击真实系统
- 学习目的是防御,不是攻击