浅谈CSRF漏洞
字数 1392 2025-08-20 18:17:42

CSRF漏洞详解与防御指南

0x01 什么是CSRF

CSRF(Cross Site Request Forgery),中文名称跨站点请求伪造,是一种严重的安全威胁。攻击者可以盗用用户身份,以用户名义发送恶意请求,执行如发送邮件、转账、修改账户信息等操作。

0x02 CSRF攻击原理

  1. 受害者登录:用户登录受信任网站(如银行),浏览器生成身份验证信息(cookie)
  2. 恶意请求构造:攻击者构造包含恶意请求的链接或页面
  3. 诱导访问:用户在保持登录状态时访问恶意页面
  4. 请求发送:浏览器自动携带身份验证信息发送请求
  5. 服务器处理:服务器认为请求合法,执行恶意操作

必要条件

  • 用户已登录目标网站
  • 用户在不登出的情况下访问恶意页面
  • 目标网站没有有效的CSRF防护措施

0x03 CSRF攻击分类

站内CSRF

  • 由于滥用$_REQUEST等变量,导致本应只接受POST请求的操作也接受GET请求
  • 攻击者可在站内帖子或留言中植入恶意链接

站外CSRF

  • 传统的外部提交数据问题
  • 攻击者在站外页面构造自动提交的表单或伪造请求

0x04 CSRF漏洞检测

手动检测方法

  1. 抓取正常请求数据包
  2. 去掉Referer字段重新提交
  3. 如果请求仍然有效,则存在CSRF漏洞

自动化工具

  • CSRFTester:抓取访问链接和表单,修改后重新提交测试
  • CSRF Request Builder:专门用于构造CSRF测试请求

0x05 CSRF攻击实例分析(DVWA)

Low级别

  • 无任何防护措施
  • 直接构造恶意URL或HTML表单即可攻击
  • 示例攻击步骤:
    1. 构造恶意HTML表单
    2. 诱导用户访问
    3. 表单自动提交修改密码请求

Medium级别

  • 添加了Referer检查
  • 绕过方法:确保Referer包含目标域名(如127.0.0.1)
  • 示例攻击步骤:
    1. 构造包含目标域名的恶意页面
    2. 诱导用户访问
    3. 表单提交时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需要:

  1. 理解其工作原理和必要条件
  2. 根据业务场景选择合适的防护措施
  3. 推荐使用Anti-CSRF Token + SameSite Cookie的组合防御
  4. 对重要操作添加二次验证(如验证码)

开发者应避免仅依赖单一防护措施,采用多层次防御策略才能有效防范CSRF攻击。

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攻击。