跨站请求伪造近身对抗攻防录
字数 1158 2025-08-23 18:31:17
跨站请求伪造(CSRF)攻防全面指南
基本概念
CSRF(Cross-site request forgery)是一种挟持用户在已登录的Web应用程序上执行非本意操作的攻击方式。攻击者盗用用户身份,以用户名义发送恶意请求,服务器会认为这是合法请求。
利用条件
- 恶意操作:应用中存在攻击者需要诱导的操作(特权操作或用户数据操作)
- 会话处理:仅依赖会话Cookie识别用户,无其他会话跟踪机制
- 参数预测:请求参数值可被攻击者确定或猜测
CSRF攻击示例
基础案例
<html>
<body>
<form action="https://vulnerable-website.com/email/change" method="POST">
<input type="hidden" name="email" value="pwned@evil-user.net"/>
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
CSRF Token绕过技术
1. 请求方法依赖
- 缺陷:POST方法验证token,GET方法跳过验证
- 绕过:将POST请求改为GET请求
2. Token存在性依赖
- 缺陷:仅验证Token是否存在,忽略时跳过验证
- 绕过:删除整个Token参数
3. 会话无关Token
- 缺陷:Token不与用户会话绑定,使用全局Token池
- 绕过:攻击者获取自己的Token用于受害者
4. Cookie绑定但不集成
- 缺陷:CSRF Token绑定到非会话Cookie
- 绕过:利用Cookie设置行为将攻击者Cookie放入受害者浏览器
5. 双重提交缺陷
- 缺陷:仅验证请求参数和Cookie中的Token是否匹配
- 绕过:利用Cookie设置功能注入Token
SameSite防护绕过
Strict模式绕过
- 客户端重定向:利用同一站点内的客户端重定向gadget
- 同级子域:利用易受攻击的同级子域发起请求
Lax模式绕过
- GET方法利用:将操作改为GET请求通过顶级导航触发
- 方法重写:使用框架特性重写请求方法
<form method="POST"> <input type="hidden" name="_method" value="GET"> </form> - 120秒窗口期:Chrome对前120秒的跨站点POST请求不强制执行Lax
Referer头防护绕过
1. 移除Referer头
<meta name="referrer" content="no-referrer">
2. 域名验证缺陷
- 子域绕过:
http://vulnerable-website.com.attacker.com - 查询参数注入:
http://attacker.com/?vulnerable-website.com
防御措施
1. CSRF Token最佳实践
- 绑定到用户会话
- 高熵、不可预测
- 严格验证所有敏感操作
2. SameSite Cookie设置
- 明确设置每个Cookie的SameSite限制
- 关键Cookie使用Strict模式
- 非敏感跨站Cookie使用None模式(必须配合Secure)
3. 深度防御
- 结合Token验证和SameSite
- 关键操作要求二次验证
- 定期审计防护机制有效性
实战案例
案例1:GET方法绕过
<script>
document.location = "https://target.com/change-email?email=attacker@evil.com&_method=POST";
</script>
案例2:双重提交绕过
<form action="https://target.com/change-email" method="POST">
<input type="hidden" name="csrf" value="fake"/>
</form>
通过全面理解这些技术和防御措施,安全团队可以更有效地防护CSRF漏洞,而渗透测试人员可以更全面地评估应用安全性。