DVWA Brute Force(暴力破解)Low/Medium/High 完整攻击流程
前置基础
- 访问路径:
DVWA→Brute Force,登录表单:账号+密码,GET传参username&password&Login=Login - 核心逻辑:后端直接拼接SQL查询,无验证码、无登录失败锁定,可批量字典爆破账号密码
- 切换安全等级:DVWA Security 切换 Low / Medium / High
- 工具:Burp Suite(主流)、手工测试、Python脚本
一、Low 级别暴力破解(无任何防护,最简单)
low.php 源码分析
$user = $_GET['username']; $pass = $_GET['password']; $query = "SELECT * FROM users WHERE user='$user' AND password='$pass'"; $db = mysqli_query($GLOBALS["___mysqli_ston"], $query); if( mysqli_num_rows($db) == 1 ){ echo "<pre>Welcome to the password protected area admin</pre>"; }else{ echo "<pre>Username and/or password incorrect.</pre>"; }漏洞点:
- 直接拼接用户输入,字符型SQL注入;
- 无验证码、无请求频率限制、无IP锁定;
- 仅通过页面文字区分成功/失败。
攻击步骤(Burp Intruder 爆破)
步骤1:抓包登录请求
- 浏览器随便输入账号密码,点击 Login;
- Burp拦截请求,完整数据包:
GET /DVWA/vulnerabilities/brute/?username=test&password=123&Login=Login HTTP/1.1 Host: 127.0.0.1 Cookie: PHPSESSID=xxx; security=low步骤2:发送到 Intruder
右键 → Send to Intruder
Payload Positions 自动标记username和password两个参数。
步骤3:Payload 设置
两种爆破方案:
方案1:已知用户名 admin,只爆破密码(推荐)
- 清除username标记,固定值
admin; - password加载密码字典(123456、password、admin、dvwa等弱口令);
- Attack type:Sniper(单字典遍历)。
方案2:同时爆破账号+密码
Attack type:Cluster bomb,分别加载用户字典、密码字典。
步骤4:启动爆破,判断成功包
爆破完成后看响应长度/页面内容:
- 失败包:页面包含
Username and/or password incorrect. - 成功包:页面包含
Welcome to the password protected area admin
筛选长度不同的请求,得到正确密码(默认admin密码:password)。
Low 额外漏洞:结合SQL注入直接绕过登录
payload用户名输入:admin'#,密码任意
SQL拼接后:
SELECT * FROM users WHERE user='admin'#' AND password='xxx'注释后半段密码判断,直接登录成功,无需爆破。
二、Medium 级别暴力破解(增加简单过滤+延时)
medium.php 源码防护点
$user = mysqli_real_escape_string($db, $_GET['username']); $pass = mysqli_real_escape_string($db, $_GET['password']); // 登录失败延时2秒 sleep(2);防护:
mysqli_real_escape_string转义单引号,无法SQL注入绕过登录;- 登录错误强制
sleep(2),大幅拉长爆破时间; - 无验证码、无锁定,依然可以暴力破解。
攻击流程
- 抓包方式和Low完全一致,不能使用注入payload;
- Intruder爆破不变,仅爆破速度变慢(每失败请求等待2秒);
- 识别成功响应依旧依靠页面
Welcome关键字; - 优化技巧:缩小密码字典,只使用高频弱口令,减少请求次数。
三、High 级别暴力破解(Token CSRF防护,核心难点)
high.php 源码新增防护
- 依旧转义字符,禁止SQL注入;
- 增加CSRF token(user_token),每次请求token值动态变化;
- 每次提交必须携带当前页面token,固定数据包直接重放会失效;
- 错误登录依旧sleep延时2秒。
请求新增参数:user_token=随机值
完整参数:username=xxx&password=xxx&Login=Login&user_token=xxxx
Burp自动处理Token爆破完整步骤
步骤1:抓包登录请求,发送到Intruder
三个参数:username、password、user_token,三个变量位置。
步骤2:Payload Type 设置为 Pitchfork
步骤3:配置 Payload 3(token自动获取)
- Payload set 3 选择:
Recursive grep递归提取token; - 打开 Options → Grep - Extract,添加提取规则:
正则匹配页面隐藏表单token:
user_token' value='(.*?)'
- 设置页面刷新请求:每次爆破前先GET登录页,抓取最新token再提交登录。
步骤4:Payload1填固定admin,Payload2加载密码字典,启动攻击
工具会自动:
- 访问页面获取新token;
- 携带新token提交账号密码;
- 循环爆破,识别成功页面。
手工替代方案(Python脚本自动获取token爆破)
逻辑:
- requests.get 访问 brute页面,正则提取user_token;
- 携带token、用户名、密码发送GET登录请求;
- 判断返回页面是否包含Welcome;
- 循环遍历密码字典。
四、Impossible 级别(无法爆破,防御满分,对比参考)
源码防护机制:
- 强密码哈希存储+加盐
md5($salt . $pass); - 登录失败计数器,5次错误直接锁定账号15分钟;
- 复杂CSRF token;
- 使用预处理SQL语句,杜绝注入;
- 无任何可利用漏洞,无法暴力破解。
五、三级等级核心对比表
等级 | 注入绕过 | 延时限制 | CSRF Token | 爆破难点 |
Low | 支持单引号注入直接登录 | 无sleep | 无 | 无,爆破速度最快 |
Medium | 转义引号,注入失效 | sleep(2) | 无 | 爆破速度慢,只能纯字典跑 |
High | 注入失效 | sleep(2) | 动态token | 必须自动抓取token,配置复杂 |
Impossible | 完全防护 | 5次锁定 | 高强度token | 无法爆破 |
六、实战常见问题
- High级别爆破全部失败:未配置递归抓取token,旧token失效;
- Medium爆破速度极慢:sleep(2)强制延时,减少字典数量;
- Low注入payload无效:安全等级切错,当前是Medium/High;
- Cookie丢失导致失效:Burp开启
Redirect automatically,保持PHPSESSID会话。
七、防御暴力破解方案
- 登录失败次数限制,短期锁定账号;
- 图形验证码/短信验证码;
- 后端加盐哈希存储密码,禁止明文;
- CSRF随机Token防护;
- 异常高频请求WAF拦截;
- 使用预处理SQL,防止注入绕过登录;
- 后台登录IP白名单。
