安服水洞系列|04. CSRF
字数 1554 2025-08-11 08:36:07

CSRF漏洞详解与防御指南

1. CSRF概述

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用受害者在已登录目标网站的情况下,通过该网站的权限执行恶意操作的攻击方式。

1.1 基本概念

  • 攻击者诱骗受害者浏览器发送伪造请求
  • 利用受害者在目标网站的已认证状态
  • 可执行如修改密码、删除数据等恶意操作

1.2 危害程度

  • 危害范围从轻微到严重不等
  • 高级利用案例:内网穿透、RCE(如phpstudy漏洞)
  • 但部分厂商在众测中可能不接受CSRF或轻微危害的CSRF报告

2. CSRF攻击原理

2.1 攻击流程

  1. 用户登录并保持目标网站会话
  2. 用户访问恶意网站或点击恶意链接
  3. 恶意代码构造并发送伪造请求
  4. 目标网站服务器误认为是用户合法请求并执行

2.2 浏览器Cookie策略

  • 自2021年起,Chrome默认应用SameSite=Lax策略
  • 示例:Set-Cookie: session=0F8tgdOhi9ynR1M9wa3ODa; SameSite=Lax
  • Lax策略影响:
    • 允许跨站点GET请求携带Cookie
    • 阻止跨站点POST请求携带Cookie

3. CSRF漏洞检测

3.1 检测方法

  1. 检查请求中是否存在防护机制:

    • Token验证
    • Referer检查
    • 验证码
  2. 测试步骤:

    • 对于GET请求:直接构造URL测试
    • 对于POST请求:
      • 尝试去掉Referer头重新提交
      • 使用不同浏览器测试(因SameSite策略实现可能不同)

3.2 检测工具

  1. Burp Suite:可生成CSRF PoC
  2. CSRFTester
  3. CSRF Request Builder
  4. XSRFProbe(GitHub项目)

4. CSRF攻击构造

4.1 基本攻击方式

  • 构造恶意HTML表单自动提交
  • 使用img标签触发GET请求
  • 使用iframe隐藏操作

4.2 JSON CSRF示例

<html>
<body>
<script>
function submitRequest() {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "https://www.xxxxx.com/simauth/app/updateAppInfo", true);
    xhr.setRequestHeader("Accept", "application/json");
    xhr.setRequestHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
    xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    xhr.withCredentials = true;
    xhr.send(JSON.stringify({"appId":"300016001555","appName":"0xdawn"}));
}
</script>
<form action="#">
    <input type="button" value="Submit request" onclick="submitRequest()">
</form>
</body>
</html>

4.3 漏洞挖掘思路

  1. 重点关注可提交数据的功能点,特别是:
    • 上传图片功能
    • 可自由构建URL的接口
  2. 检查关键操作(如密码修改、数据删除)是否缺乏防护

5. CSRF防御措施

5.1 主要防御方法

  1. Token验证

    • 在请求中加入随机生成的token
    • 服务器端验证token有效性
    • 推荐使用同步器令牌模式
  2. 验证码

    • 关键操作要求输入验证码
    • 有效阻断自动化CSRF攻击
  3. Referer检查

    • 验证请求来源是否为合法域名
    • 但可能被绕过(如某些浏览器隐私模式)
  4. SameSite Cookie属性

    • 设置SameSite=StrictSameSite=Lax
    • Strict最严格,完全禁止跨站携带Cookie
  5. 自定义HTTP头

    • 添加并验证自定义头(X-Requested-With等)
    • 因为浏览器同源策略限制跨域自定义头

5.2 进阶防御

  1. 双重提交Cookie

    • token同时存在于Cookie和请求参数中
    • 服务器比较两者是否一致
  2. 用户交互验证

    • 关键操作前要求重新输入密码
    • 增加攻击难度
  3. 操作延时

    • 敏感操作设置执行延时
    • 提供撤销操作的时间窗口

6. 开发注意事项

  1. 不要依赖单一防御机制:采用多层次防御
  2. GET请求安全:确保GET请求不修改数据(遵循REST规范)
  3. 关键操作防护:对修改密码、转账等操作特别加强防护
  4. 定期审计:检查防护机制是否被绕过

7. 进阶学习资源

  1. CSRF进阶知识
  2. OWASP CSRF防护指南
  3. 各语言框架的CSRF防护模块文档

8. 总结

CSRF是一种常见但危害可大可小的Web安全漏洞。随着浏览器安全策略的演进(如SameSite Cookie),部分传统的CSRF攻击方式已失效,但攻击者也在不断寻找新的绕过方法。开发者应当理解CSRF原理,实施多层次防御,并定期检查防护措施的有效性。

CSRF漏洞详解与防御指南 1. CSRF概述 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用受害者在已登录目标网站的情况下,通过该网站的权限执行恶意操作的攻击方式。 1.1 基本概念 攻击者诱骗受害者浏览器发送伪造请求 利用受害者在目标网站的已认证状态 可执行如修改密码、删除数据等恶意操作 1.2 危害程度 危害范围从轻微到严重不等 高级利用案例:内网穿透、RCE(如phpstudy漏洞) 但部分厂商在众测中可能不接受CSRF或轻微危害的CSRF报告 2. CSRF攻击原理 2.1 攻击流程 用户登录并保持目标网站会话 用户访问恶意网站或点击恶意链接 恶意代码构造并发送伪造请求 目标网站服务器误认为是用户合法请求并执行 2.2 浏览器Cookie策略 自2021年起,Chrome默认应用SameSite=Lax策略 示例: Set-Cookie: session=0F8tgdOhi9ynR1M9wa3ODa; SameSite=Lax Lax策略影响: 允许跨站点GET请求携带Cookie 阻止跨站点POST请求携带Cookie 3. CSRF漏洞检测 3.1 检测方法 检查请求中是否存在防护机制: Token验证 Referer检查 验证码 测试步骤: 对于GET请求:直接构造URL测试 对于POST请求: 尝试去掉Referer头重新提交 使用不同浏览器测试(因SameSite策略实现可能不同) 3.2 检测工具 Burp Suite:可生成CSRF PoC CSRFTester CSRF Request Builder XSRFProbe(GitHub项目) 4. CSRF攻击构造 4.1 基本攻击方式 构造恶意HTML表单自动提交 使用img标签触发GET请求 使用iframe隐藏操作 4.2 JSON CSRF示例 4.3 漏洞挖掘思路 重点关注可提交数据的功能点,特别是: 上传图片功能 可自由构建URL的接口 检查关键操作(如密码修改、数据删除)是否缺乏防护 5. CSRF防御措施 5.1 主要防御方法 Token验证 在请求中加入随机生成的token 服务器端验证token有效性 推荐使用同步器令牌模式 验证码 关键操作要求输入验证码 有效阻断自动化CSRF攻击 Referer检查 验证请求来源是否为合法域名 但可能被绕过(如某些浏览器隐私模式) SameSite Cookie属性 设置 SameSite=Strict 或 SameSite=Lax Strict最严格,完全禁止跨站携带Cookie 自定义HTTP头 添加并验证自定义头(X-Requested-With等) 因为浏览器同源策略限制跨域自定义头 5.2 进阶防御 双重提交Cookie token同时存在于Cookie和请求参数中 服务器比较两者是否一致 用户交互验证 关键操作前要求重新输入密码 增加攻击难度 操作延时 敏感操作设置执行延时 提供撤销操作的时间窗口 6. 开发注意事项 不要依赖单一防御机制 :采用多层次防御 GET请求安全 :确保GET请求不修改数据(遵循REST规范) 关键操作防护 :对修改密码、转账等操作特别加强防护 定期审计 :检查防护机制是否被绕过 7. 进阶学习资源 CSRF进阶知识 OWASP CSRF防护指南 各语言框架的CSRF防护模块文档 8. 总结 CSRF是一种常见但危害可大可小的Web安全漏洞。随着浏览器安全策略的演进(如SameSite Cookie),部分传统的CSRF攻击方式已失效,但攻击者也在不断寻找新的绕过方法。开发者应当理解CSRF原理,实施多层次防御,并定期检查防护措施的有效性。