Portswigger Labs — CSRF
字数 2473 2025-08-18 11:36:53
CSRF攻击技术全面解析与防御绕过方法
1. CSRF基础概念
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用受害者已登录的身份,在受害者不知情的情况下执行非预期操作的攻击方式。
基本攻击原理
- 攻击者构造恶意请求
- 诱骗已认证用户访问包含恶意请求的页面
- 用户浏览器自动携带认证信息(如cookie)发送请求
- 服务器误认为是用户自愿操作
2. CSRF攻击场景分类与绕过技术
2.1 无任何防护的CSRF
场景特征:
- 请求中没有CSRF token等防护机制
- 仅依赖会话cookie进行身份验证
攻击步骤:
- 登录目标网站
- 点击"update email"功能并抓包
- 确认请求中没有csrf-token等防护
- 使用工具(如Burp Suite)生成CSRF POC
- 将HTML复制到exploit server
- 发送给受害者(deliver exploit to victim)
防御建议:
- 实现CSRF token机制
- 检查请求来源(Referer)
2.2 更改请求方法绕过验证
场景特征:
- POST请求中包含CSRF token验证
- 但服务器仅对POST方法验证token
攻击步骤:
- 抓取更新邮件的POST请求,确认body中有csrf-token
- 修改csrf token后重放请求,确认会提示"invalid csrf token"
- 将POST方法改为GET方法
- 确认不再验证token,攻击成功
- 生成相应payload并利用
防御建议:
- 对所有敏感操作强制使用POST方法
- 对所有HTTP方法都进行CSRF token验证
2.3 删除csrf-token绕过验证
场景特征:
- 请求中存在csrf-token
- 但服务器不强制要求token存在
攻击步骤:
- 抓包确认存在csrf-token
- 尝试修改token后重放请求失败
- 尝试更改请求方法也失败
- 直接删除csrf-token参数
- 确认请求成功
防御建议:
- 强制要求所有敏感请求必须包含有效CSRF token
- 对缺失token的请求直接拒绝
2.4 未绑定用户session的csrf-token
场景特征:
- 存在CSRF token机制
- 但token不与用户session绑定
攻击步骤:
- 点击update抓包,复制csrf token
- 新开浏览器,同样操作获取另一个token
- 将前一步的token替换到新请求中
- 确认可以成功修改
- 生成CSRF POC时,只需使用一个未利用过的有效token即可
防御建议:
- 将CSRF token与用户session绑定
- 每个token只能使用一次(或短时间有效)
2.5 与非会话cookie绑定的csrf-token
场景特征:
- 需要同时验证csrfKey(存储在cookie)和csrf(在请求体中)
- 但csrfKey可通过其他途径注入
攻击步骤:
- 登录两个账号,分别抓包
- 确认需要同时替换csrfKey和csrf才能完成请求
- 发现搜索功能没有CSRF防护
- 利用搜索功能注入csrfKey到受害者浏览器:
- 生成包含对应csrf的POC
- 受害者访问时会先被注入csrfKey,然后执行CSRF攻击
防御建议:
- 确保csrfKey是HttpOnly和Secure的
- 对设置cookie的操作进行严格限制
- 实现SameSite cookie属性
2.6 cookie和body中重复的csrf-token
场景特征:
- 在cookie和body中同时存在csrf参数
- 单独修改任一处都会报错
- 需要两处同时修改为相同值
攻击步骤:
- 确认需要同时修改cookie和body中的csrf
- 通过搜索功能注入cookie中的csrf:
- 生成POC时在body中也包含相同的csrf值:
<form action="https://target.com/my-account/change-email" method="POST"> <input type="hidden" name="email" value="attacker@example.com" /> <input type="hidden" name="csrf" value="attacker_value" /> </form>
防御建议:
- 避免在cookie和body中重复相同token
- 实现严格的token绑定机制
2.7 删除referer绕过验证
场景特征:
- 没有CSRF token
- 但验证Referer头
- 允许缺失Referer的请求
攻击步骤:
- 确认请求没有csrf token但验证Referer
- 尝试删除Referer头,确认请求成功
- 修改POC,添加禁止referer的meta标签:
<meta name="referrer" content="no-referrer"> - 完整POC示例:
<html> <body> <form action="https://target.com/my-account/change-email" method="POST"> <input type="hidden" name="email" value="attacker@example.com" /> </form> <meta name="referrer" content="no-referrer"> <script>history.pushState(document.forms[0].submit();</script> </body> </html>
防御建议:
- 实现CSRF token而非仅依赖Referer检查
- 对缺失Referer的敏感请求保持警惕
3. 综合防御策略
-
使用CSRF Token:
- 每个表单/请求包含唯一token
- Token与用户session绑定
- 存储在隐藏字段而非cookie
-
检查Referer头:
- 验证请求来自合法源
- 但不能作为唯一防护措施
-
SameSite Cookie属性:
- 设置
SameSite=Strict或Lax - 防止CSRF攻击自动发送认证cookie
- 设置
-
敏感操作要求重新认证:
- 如密码修改等关键操作要求输入当前密码
-
限制HTTP方法:
- 敏感操作只允许POST方法
- 避免GET请求修改状态
-
双重提交Cookie:
- 在cookie和请求中都包含token
- 但需确保两者匹配且难以伪造
-
自定义请求头:
- 通过JavaScript添加自定义头
- 服务器验证头是否存在
4. 自动化工具使用
Burp Suite Professional的CSRF POC生成器使用流程:
- 拦截目标请求
- 右键选择"Engagement tools" > "Generate CSRF PoC"
- 根据需要修改生成的HTML
- 测试PoC有效性
- 部署到exploit server
5. 总结
CSRF攻击方式多样,防御需要多层防护。关键点包括:
- 理解每种绕过技术的原理
- 识别目标应用的防护机制
- 针对特定防护选择合适的绕过方法
- 组合利用多种技术(如cookie注入+CSRF POC)
- 防御时应采用纵深防御策略,不依赖单一机制
通过全面了解这些攻击技术和防御方法,安全人员可以更好地评估和加固Web应用的安全性。