一文深入了解CSRF漏洞
字数 1522 2025-08-11 00:08:50

CSRF漏洞深入分析与防御指南

1. CSRF基础概念

1.1 定义

跨站请求伪造(Cross-site request forgery, CSRF/XSRF)是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。与XSS不同:

  • XSS利用用户对指定网站的信任
  • CSRF利用网站对用户浏览器的信任

本质:攻击者欺骗用户的浏览器向已认证网站发送请求,由于浏览器会携带认证信息(如Cookie),服务器会认为是用户自愿的操作。

1.2 攻击原理

  • 用户登录Web应用并保持会话
  • 服务器返回Session凭证保存在Cookie中
  • 攻击者构造恶意请求并诱导用户访问
  • 用户浏览器携带有效Cookie发送请求
  • 服务器认为是合法用户操作并执行

2. CSRF攻击类型

2.1 GET型CSRF

特点

  • 最容易利用,攻击面最大
  • 通过URL参数直接传递攻击指令
  • 可通过img标签等方式自动触发

示例


2.2 POST-表单型CSRF

特点

  • 需要构造自动提交的表单
  • 比GET型利用稍复杂
  • 常见于数据提交功能点

示例

<form action=http://bank.example.com/csrf method=POST>
  <input type="text" name="amount" value="1000" />
</form>
<script> document.forms[0].submit(); </script>

2.3 POST-JSON型CSRF

特点

  • 常见于RESTful API和前后端分离架构
  • Content-Type为application/json
  • 利用难度较高

利用方法

  1. JSON转参数:尝试将JSON格式转为表单参数
  2. 闭合JSON:构造表单闭合JSON结构
  3. Ajax发起请求:使用XMLHttpRequest发送请求
  4. Flash+307跳转:利用Flash跨域特性

Ajax示例

var xhr = new XMLHttpRequest()
xhr.open("POST", "http://test.example.com/csrf")
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8")
xhr.withCredentials = true
xhr.send(JSON.stringify({"a":"b"}))

3. CSRF漏洞挖掘

3.1 常见攻击场景

  • 修改个人信息
  • 发送邮件/消息
  • 资金操作(转账、支付)
  • 创建管理员账户
  • 任何需要认证的操作功能

3.2 验证方法

  1. 检查请求中是否缺少CSRF Token
  2. 尝试删除Referer头看请求是否仍能成功
  3. 构造POC验证漏洞存在性

快速验证步骤

  1. 观察请求头和参数中是否有Token
  2. 删除Referer头测试
  3. 使用Burp生成POC测试

4. CSRF防御措施

4.1 令牌同步模式(STP)

原理

  • 服务器生成唯一随机Token嵌入表单
  • 提交时验证Token有效性
  • 攻击者无法获取Token导致验证失败

实现

<input type="hidden" name="_csrf_token" value="随机唯一值">

注意事项

  • Token需保证随机性和唯一性
  • 会话级Token可减轻服务器负担
  • 需防止Token泄露

4.2 检查Referer字段

原理

  • 验证请求来源是否合法域名
  • 拒绝非本域或空Referer请求

局限性

  • 依赖浏览器正确发送Referer
  • 可能被篡改或禁用
  • 隐私模式下可能不发送

4.3 自定义HTTP头

原理

  • 要求请求包含自定义头(如X-CSRF-Token)
  • 通过JavaScript设置自定义头
  • 非Ajax请求无法添加自定义头

4.4 验证码

原理

  • 关键操作需用户输入验证码
  • 一次性验证码最安全

缺点

  • 影响用户体验
  • 不适合频繁操作

4.5 SameSite Cookie属性

选项

  • Strict:完全禁止跨站携带Cookie
  • Lax:允许部分安全跨站请求携带Cookie

特点

  • 浏览器原生支持
  • 不影响同站请求
  • 需考虑兼容性

5. 个人防护建议

  1. 使用隐私/无痕浏览器进行敏感操作
  2. 不随意点击不明链接
  3. 操作完成后及时登出
  4. 为不同网站使用不同密码
  5. 定期清理浏览器Cookie

6. 总结

CSRF攻击利用的是Web身份验证机制的缺陷 - 服务器无法区分请求是用户自愿发出还是被诱导发出。有效的防御需要结合多种措施,推荐使用CSRF Token+SameSite Cookie的组合方案,既能有效防御攻击,又能保证良好的用户体验。

CSRF漏洞深入分析与防御指南 1. CSRF基础概念 1.1 定义 跨站请求伪造(Cross-site request forgery, CSRF/XSRF)是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。与XSS不同: XSS利用用户对指定网站的信任 CSRF利用网站对用户浏览器的信任 本质 :攻击者欺骗用户的浏览器向已认证网站发送请求,由于浏览器会携带认证信息(如Cookie),服务器会认为是用户自愿的操作。 1.2 攻击原理 用户登录Web应用并保持会话 服务器返回Session凭证保存在Cookie中 攻击者构造恶意请求并诱导用户访问 用户浏览器携带有效Cookie发送请求 服务器认为是合法用户操作并执行 2. CSRF攻击类型 2.1 GET型CSRF 特点 : 最容易利用,攻击面最大 通过URL参数直接传递攻击指令 可通过img标签等方式自动触发 示例 : 2.2 POST-表单型CSRF 特点 : 需要构造自动提交的表单 比GET型利用稍复杂 常见于数据提交功能点 示例 : 2.3 POST-JSON型CSRF 特点 : 常见于RESTful API和前后端分离架构 Content-Type为application/json 利用难度较高 利用方法 : JSON转参数:尝试将JSON格式转为表单参数 闭合JSON:构造表单闭合JSON结构 Ajax发起请求:使用XMLHttpRequest发送请求 Flash+307跳转:利用Flash跨域特性 Ajax示例 : 3. CSRF漏洞挖掘 3.1 常见攻击场景 修改个人信息 发送邮件/消息 资金操作(转账、支付) 创建管理员账户 任何需要认证的操作功能 3.2 验证方法 检查请求中是否缺少CSRF Token 尝试删除Referer头看请求是否仍能成功 构造POC验证漏洞存在性 快速验证步骤 : 观察请求头和参数中是否有Token 删除Referer头测试 使用Burp生成POC测试 4. CSRF防御措施 4.1 令牌同步模式(STP) 原理 : 服务器生成唯一随机Token嵌入表单 提交时验证Token有效性 攻击者无法获取Token导致验证失败 实现 : 注意事项 : Token需保证随机性和唯一性 会话级Token可减轻服务器负担 需防止Token泄露 4.2 检查Referer字段 原理 : 验证请求来源是否合法域名 拒绝非本域或空Referer请求 局限性 : 依赖浏览器正确发送Referer 可能被篡改或禁用 隐私模式下可能不发送 4.3 自定义HTTP头 原理 : 要求请求包含自定义头(如X-CSRF-Token) 通过JavaScript设置自定义头 非Ajax请求无法添加自定义头 4.4 验证码 原理 : 关键操作需用户输入验证码 一次性验证码最安全 缺点 : 影响用户体验 不适合频繁操作 4.5 SameSite Cookie属性 选项 : Strict :完全禁止跨站携带Cookie Lax :允许部分安全跨站请求携带Cookie 特点 : 浏览器原生支持 不影响同站请求 需考虑兼容性 5. 个人防护建议 使用隐私/无痕浏览器进行敏感操作 不随意点击不明链接 操作完成后及时登出 为不同网站使用不同密码 定期清理浏览器Cookie 6. 总结 CSRF攻击利用的是Web身份验证机制的缺陷 - 服务器无法区分请求是用户自愿发出还是被诱导发出。有效的防御需要结合多种措施,推荐使用CSRF Token+SameSite Cookie的组合方案,既能有效防御攻击,又能保证良好的用户体验。