浅谈CSRF漏洞
字数 1392 2025-08-20 18:17:42
CSRF漏洞详解与防御指南
0x01 什么是CSRF
CSRF(Cross Site Request Forgery),中文名称跨站点请求伪造,是一种严重的安全威胁。攻击者可以盗用用户身份,以用户名义发送恶意请求,执行如发送邮件、转账、修改账户信息等操作。
0x02 CSRF攻击原理
- 受害者登录:用户登录受信任网站(如银行),浏览器生成身份验证信息(cookie)
- 恶意请求构造:攻击者构造包含恶意请求的链接或页面
- 诱导访问:用户在保持登录状态时访问恶意页面
- 请求发送:浏览器自动携带身份验证信息发送请求
- 服务器处理:服务器认为请求合法,执行恶意操作
必要条件:
- 用户已登录目标网站
- 用户在不登出的情况下访问恶意页面
- 目标网站没有有效的CSRF防护措施
0x03 CSRF攻击分类
站内CSRF
- 由于滥用
$_REQUEST等变量,导致本应只接受POST请求的操作也接受GET请求 - 攻击者可在站内帖子或留言中植入恶意链接
站外CSRF
- 传统的外部提交数据问题
- 攻击者在站外页面构造自动提交的表单或伪造请求
0x04 CSRF漏洞检测
手动检测方法
- 抓取正常请求数据包
- 去掉Referer字段重新提交
- 如果请求仍然有效,则存在CSRF漏洞
自动化工具
- CSRFTester:抓取访问链接和表单,修改后重新提交测试
- CSRF Request Builder:专门用于构造CSRF测试请求
0x05 CSRF攻击实例分析(DVWA)
Low级别
- 无任何防护措施
- 直接构造恶意URL或HTML表单即可攻击
- 示例攻击步骤:
- 构造恶意HTML表单
- 诱导用户访问
- 表单自动提交修改密码请求
Medium级别
- 添加了Referer检查
- 绕过方法:确保Referer包含目标域名(如127.0.0.1)
- 示例攻击步骤:
- 构造包含目标域名的恶意页面
- 诱导用户访问
- 表单提交时Referer包含目标域名
High级别
- 添加Anti-CSRF token机制
- 每次请求需要携带服务器生成的随机token
- 单纯CSRF难以攻击,需配合XSS等其他漏洞
0x06 CSRF防御之道
1. 使用POST而非GET
- 降低风险但非完全防护
- 攻击者仍可构造自动提交表单
2. 加入验证码
- 强制用户交互,大幅降低CSRF风险
- 需注意验证码强度,防止被破解
3. 验证Referer
- 检查请求来源是否为合法域名
- 可被绕过(如Referer伪造或某些浏览器不发送Referer)
4. Anti-CSRF Token(推荐)
- 服务器生成随机token,嵌入表单或请求参数
- 每次请求验证token有效性
- 实现要点:
- Token需足够随机且不可预测
- Token与用户会话关联
- Token一次性使用或短有效期
- 重要操作必须使用Token
5. SameSite Cookie属性
- 设置Cookie的SameSite属性为Strict或Lax
- 限制第三方上下文发送Cookie
0x07 总结
CSRF是一种危害严重且容易被忽视的漏洞,防御CSRF需要:
- 理解其工作原理和必要条件
- 根据业务场景选择合适的防护措施
- 推荐使用Anti-CSRF Token + SameSite Cookie的组合防御
- 对重要操作添加二次验证(如验证码)
开发者应避免仅依赖单一防护措施,采用多层次防御策略才能有效防范CSRF攻击。