CSRF跨站请求伪造:身份冒用的艺术
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用用户已认证身份执行非预期操作的攻击。与 XSS 不同,CSRF 不窃取用户数据,而是冒充用户发起请求。它被称为"睡梦中的攻击"——用户在不知情的情况下完成了转账、改密等危险操作。
一、什么是 CSRF
CSRF 的核心原理:利用浏览器自动携带 Cookie 的机制,诱导已登录用户访问恶意链接,以用户身份执行非预期操作。
攻击前提条件
- 用户已登录目标网站(Cookie 中有有效会话)
- 浏览器自动携带 Cookie(同源策略不阻止 Cookie 发送)
- 目标网站未验证请求来源(缺少 CSRF 防护)
经典攻击场景
1. 用户登录银行网站 bank.com,Cookie 中有了会话令牌
2. 用户未退出,去访问恶意网站 evil.com
3. evil.com 的页面包含:
4. 浏览器自动携带 bank.com 的 Cookie 发送请求
5. 银行服务器验证 Cookie 有效,执行转账
6. 用户完全不知情,钱就被转走了二、CSRF vs XSS 的区别
| 特性 | CSRF | XSS |
|---|---|---|
| 攻击目标 | 冒充用户执行操作 | 窃取用户数据/执行脚本 |
| 利用机制 | 浏览器自动携带 Cookie | 注入恶意脚本 |
| 需要用户交互 | 访问恶意页面即可 | 通常需要触发脚本 |
| 防御重点 | 验证请求来源 | 过滤/转义用户输入 |
| 危害类型 | 状态改变(转账、改密) | 信息泄露、会话劫持 |
三、CSRF 攻击类型
1. GET 型 CSRF
最简单的形式,通过 、、 等标签发起 GET 请求。
2. POST 型 CSRF
通过自动提交的表单发起 POST 请求,可以携带更多参数。
3. JSON 型 CSRF
针对 AJAX/API 请求的 CSRF,利用 Flash 或 CORS 配置错误。
四、CSRF 实战演示
DVWA 靶场练习
Low 级别(无防护): 构造恶意表单自动提交,密码被修改。
Medium 级别(Referer 检查): 检查 Referer 头,可通过 URL 构造绕过。
High 级别(Token 验证): 服务器生成随机 Token,攻击者无法预测,CSRF 失效。
五、CSRF 防御策略
1. CSRF Token(最有效)
服务器为每个会话生成随机 Token,要求所有状态改变请求携带此 Token。
Token 设计原则:
- 随机性高(不可预测)
- 与会话绑定(防止 Token 被盗用)
- 单次使用或定期轮换(可选增强)
2. SameSite Cookie
现代浏览器支持的 Cookie 属性,控制跨站请求时是否发送 Cookie。
| SameSite 值 | 行为 | 兼容性 |
|---|---|---|
| None | 始终发送(需配合 Secure) | 所有浏览器 |
| Lax | 安全方法允许,危险方法禁止 | 现代浏览器(2017+) |
| Strict | 完全禁止跨站发送 | 现代浏览器 |
3. Referer/Origin 验证
检查请求来源,拒绝非本站的请求。Origin 头更可靠,Referer 可能被禁用。
4. 双重 Cookie 验证
将 Token 同时放在 Cookie 和请求参数中,服务器比较两者是否一致。
5. 自定义请求头
AJAX 请求添加自定义头,浏览器跨站请求会自动阻止自定义头。
6. 人机验证
对敏感操作增加 CAPTCHA 或二次确认。
六、防御方案对比
| 方案 | 安全性 | 用户体验 | 实现复杂度 | 推荐场景 |
|---|---|---|---|---|
| CSRF Token | ⭐⭐⭐⭐⭐ | 无影响 | 中 | 所有表单提交 |
| SameSite Cookie | ⭐⭐⭐⭐ | 无影响 | 低 | 现代浏览器用户 |
| Referer 验证 | ⭐⭐⭐ | 可能误杀 | 低 | 辅助手段 |
| 双重 Cookie | ⭐⭐⭐⭐ | 无影响 | 中 | SPA/前后端分离 |
| 自定义请求头 | ⭐⭐⭐ | 无影响 | 低 | AJAX 请求 |
| 人机验证 | ⭐⭐⭐⭐⭐ | 有干扰 | 中 | 敏感操作 |
七、CSRF 测试方法
手动测试: 登录目标网站 → 构造 CSRF PoC → 在另一个窗口打开 → 观察操作是否执行。
自动化工具: Burp Suite CSRF PoC 生成器、CSRFTester。
八、代码审计检查清单
- □ 所有状态改变操作是否都有 CSRF 防护
- □ 是否使用了 CSRF Token 机制
- □ Token 是否随机生成且与会话绑定
- □ Cookie 是否设置了 SameSite 属性
- □ 是否验证了 Origin/Referer 头
- □ 敏感操作是否有人机验证或二次确认
- □ 是否存在 JSONP 或 CORS 配置过宽的问题
- □ 是否允许跨域的 iframe 嵌入(Clickjacking 风险)
总结
CSRF 是一种利用浏览器信任机制的攻击,它不需要窃取用户凭证,只需要让用户在已登录状态下访问恶意页面。防御的核心是验证请求的真实来源:CSRF Token 是最可靠的方案,SameSite Cookie 是现代浏览器的便捷选择,两者结合使用效果更佳。
网络安全系列第 3 篇 —— 由多多自动发布 🐾