绕过CSRF防御
字数 1156 2025-08-25 22:58:20
CSRF防御绕过技术详解
1. CSRF防御概述
CSRF(跨站请求伪造)是一种常见的Web安全威胁,许多站点会实施各种防御措施,包括:
- 请求主体中的CSRF token
- Referer字段检测
- 特殊HTTP头字段或cookie字段
然而,这些防御措施并非无懈可击,下面将详细介绍各种绕过技术。
2. 通用绕过技术
2.1 点击劫持(Clickjacking)
原理:通过iframe将目标页面嵌入攻击者页面,诱导用户点击看似无害的元素实际触发敏感操作。
特点:
- 绕过所有CSRF防御措施
- 请求确实来自合法站点
- 需要目标页面存在点击劫持漏洞
2.2 更改请求方法
技术要点:
- POST转GET:将POST请求改为GET请求
- GET转POST:将GET请求改为POST请求
示例:
原始POST请求:
POST /change_password
POST body: new_password=qwerty
改为GET请求:
GET /change_password?new_password=qwerty
3. CSRF Token防御绕过
3.1 删除token或发送空token
原理:应用程序可能只在token存在或非空时验证
攻击方式:
- 完全删除token参数
- 发送空token值
示例:
原始请求:
POST /change_password
POST body: new_password=qwerty &csrf_tok=871caef0757a4ac9691aceb9aad8b65b
攻击请求:
POST /change_password
POST body: new_password=qwerty
或
POST /change_password
POST body: new_password=qwerty&csrf_tok=
3.2 使用另一个session的CSRF token
原理:应用只验证token合法性而不验证token与用户的对应关系
攻击方式:
- 攻击者使用自己的合法token构造请求
示例:
原始请求(使用受害者token):
POST /change_password
POST body: new_password=qwerty &csrf_tok=871caef0757a4ac9691aceb9aad8b65b
攻击请求(使用攻击者token):
POST /change_password
POST body: new_password=qwerty &csrf_tok=YOUR_TOKEN
3.3 Session固定攻击
适用场景:双提交cookie防御(服务器不存储token,仅比较cookie和参数中的token)
攻击步骤:
- 通过session固定控制受害者cookie
- 在参数中使用相同token执行CSRF攻击
示例:
POST /change_password
Cookie: CSRF_TOK=FAKE_TOKEN;
POST body: new_password=qwerty &csrf_tok=FAKE_TOKEN
4. Referer防御绕过
4.1 移除Referer字段
技术实现:
在页面中添加:
<meta name="referrer" content="no-referrer">
原理:应用可能只在Referer存在时验证
4.2 绕过正则表达式检查
技术要点:
- 将目标域名置于二级域名位置:
bank.com.attacker.com
- 将目标域名置于URL路径中:
attacker.com/bank.com
适用场景:当应用仅简单检查Referer中是否包含特定字符串时
5. 防御建议
针对上述绕过技术,建议实施以下防御措施:
- 对于CSRF token:
- 确保每个会话使用唯一token
- 验证token与用户的对应关系
- 无论token是否存在都进行验证
- 对于Referer检查:
- 实施严格的白名单验证
- 检查完整的域名匹配
- 通用防御:
- 防止点击劫持(X-Frame-Options头)
- 严格区分GET和POST方法的用途
- 避免仅依赖单一防御机制
通过了解这些绕过技术,安全人员可以更好地评估和加固Web应用的CSRF防御体系。