[Web安全-CSRF漏洞]
字数 2322 2025-08-11 22:57:21

CSRF漏洞详解与防御指南

1. CSRF基础概念

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种严重的Web安全漏洞,攻击者利用受害者已登录的身份,在受害者不知情的情况下执行非预期的操作。

1.1 CSRF攻击原理

  • 攻击者盗用用户身份,以用户名义发送恶意请求
  • 对服务器来说请求完全合法,因为携带了用户的合法凭证
  • 可执行的操作包括:发送邮件、发消息、账号盗取、添加管理员、购买商品、转账等

2. CSRF攻击类型

2.1 GET型CSRF

攻击场景

  • 网站功能通过GET请求实现(如修改邮箱)
  • 示例URL:/user.php?id=1&email=123@163.com
  • 攻击者构造恶意URL:/user.php?id=1&email=abc@163.com
  • 诱导用户点击后,用户邮箱被修改

特点

  • 利用简单,只需诱导用户点击链接
  • 适用于通过GET请求修改数据的场景

2.2 POST型CSRF

攻击场景

  • 网站功能通过POST表单提交实现(如购买视频)
  • 攻击者构造自动提交表单的恶意页面:
<form action=/coures/user/handler/25332/buy method=POST>
  <input type="text" name="xx" value="xx" />
</form>
<script>document.forms[0].submit();</script>
  • 用户访问后表单自动提交,完成非预期操作(如扣除余额购买视频)

特点

  • 需要构造包含表单的页面
  • 利用JavaScript自动提交表单
  • 适用于通过POST请求执行操作的场景

3. CSRF攻击实例分析

银行转账案例

  1. 正常流程

    • Bob登录银行网站
    • 发送请求:http://bank.example/withdraw?account=bob&amount=1000000&for=bob2
    • 服务器验证session后执行转账
  2. 攻击流程

    • 黑客Mallory构造恶意页面包含:``
    • 诱使Bob访问该页面
    • 若Bob刚登录银行且session未过期,请求会附带cookie发送
    • 服务器验证通过,执行转账
  3. 攻击特点

    • 受害者完全不知情
    • 日志中显示为合法请求
    • 难以追踪攻击者

4. CSRF防御措施

4.1 验证HTTP Referer字段

原理

  • 检查请求头中的Referer字段
  • 只允许来自同域名的请求

实现

  • 拦截器检查Referer是否以bank.example开头
  • 非本域请求视为CSRF攻击并拒绝

优缺点

  • 优点:实现简单,无需修改现有逻辑
  • 缺点
    • 浏览器Referer实现不一致
    • IE6/FF2等浏览器可篡改Referer
    • 用户可能禁用Referer导致误判
    • 隐私泄露风险

4.2 Anti-CSRF Token

原理

  • 在请求中添加不可伪造的token
  • token不存储在cookie中
  • 服务器验证token有效性

实现方式

  1. GET请求:URL后附加token
    http://url?csrftoken=tokenvalue
  2. POST请求:表单中添加隐藏字段
    <input type="hidden" name="csrftoken" value="tokenvalue">

增强措施

  • 页面加载时JavaScript自动为所有a/form标签添加token
  • 动态生成内容需手动添加token
  • 外链不加token防止泄露

优缺点

  • 优点:比Referer更安全
  • 缺点
    • 实现复杂,容易遗漏
    • token可能通过Referer泄露
    • 动态内容处理困难

4.3 自定义HTTP头验证

原理

  • 将token放入自定义HTTP头(如X-CSRFToken)
  • 通过XMLHttpRequest发送

实现

// 设置全局AJAX头
$.ajaxSetup({
    headers: {
        'X-CSRFToken': getCookie('csrftoken')
    }
});

优缺点

  • 优点
    • token不会通过URL泄露
    • 不受Referer限制
  • 缺点
    • 仅适用于AJAX请求
    • 需重写前端代码
    • 浏览器功能(前进/后退)受限

5. CSRF漏洞挖掘方法

5.1 手工测试

  1. 抓取正常请求数据包
    • 无Referer和token → 极可能存在CSRF
  2. 测试Referer检查
    • 去掉Referer后提交仍有效 → 存在CSRF
  3. 检查token机制
    • 修改/删除token后请求仍有效 → 存在CSRF

5.2 工具测试

  1. CSRFTester
    • 抓取浏览器所有链接和表单
    • 修改表单数据重新提交
    • 成功则存在漏洞
  2. CSRF Request Builder
    • 专门用于CSRF检测
    • 可生成攻击POC

6. 使用Burp Suite生成CSRF POC

6.1 攻击流程

  1. 目标:192.168.61.1
  2. 攻击机:192.168.61.132
  3. 步骤:
    • 登录目标网站抓取修改信息的包
    • Burp中:Engagement tools → Generate CSRF PoC
    • 复制HTML代码到攻击机
    • 发送恶意链接给目标:http://192.168.61.132/1.html
    • 目标点击后信息被修改

6.2 Burp操作详解

  1. 拦截目标请求
  2. 右键选择"Engagement tools" → "Generate CSRF PoC"
  3. 调整POC选项(自动提交/表单样式等)
  4. 复制生成的HTML代码
  5. 在攻击服务器上托管该页面
  6. 通过钓鱼等方式诱导目标访问

7. 最佳防御实践

  1. 关键操作防护

    • 重要操作(如转账、改密)使用POST
    • 结合token和Referer检查
    • 增加二次验证(短信/邮件确认)
  2. token设计原则

    • 足够随机,不可预测
    • 绑定用户session
    • 设置合理有效期
    • 每个表单独立token
  3. 架构层面

    • 敏感操作使用专用接口
    • 限制关键接口的调用频率
    • 记录完整操作日志
  4. 补充措施

    • 设置SameSite cookie属性
    • 重要操作验证原始密码
    • 实施操作确认机制

通过综合运用以上防御措施,可有效防范CSRF攻击,保护Web应用和用户数据安全。

CSRF漏洞详解与防御指南 1. CSRF基础概念 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种严重的Web安全漏洞,攻击者利用受害者已登录的身份,在受害者不知情的情况下执行非预期的操作。 1.1 CSRF攻击原理 攻击者盗用用户身份,以用户名义发送恶意请求 对服务器来说请求完全合法,因为携带了用户的合法凭证 可执行的操作包括:发送邮件、发消息、账号盗取、添加管理员、购买商品、转账等 2. CSRF攻击类型 2.1 GET型CSRF 攻击场景 : 网站功能通过GET请求实现(如修改邮箱) 示例URL: /user.php?id=1&email=123@163.com 攻击者构造恶意URL: /user.php?id=1&email=abc@163.com 诱导用户点击后,用户邮箱被修改 特点 : 利用简单,只需诱导用户点击链接 适用于通过GET请求修改数据的场景 2.2 POST型CSRF 攻击场景 : 网站功能通过POST表单提交实现(如购买视频) 攻击者构造自动提交表单的恶意页面: 用户访问后表单自动提交,完成非预期操作(如扣除余额购买视频) 特点 : 需要构造包含表单的页面 利用JavaScript自动提交表单 适用于通过POST请求执行操作的场景 3. CSRF攻击实例分析 银行转账案例 正常流程 : Bob登录银行网站 发送请求: http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 服务器验证session后执行转账 攻击流程 : 黑客Mallory构造恶意页面包含: `` 诱使Bob访问该页面 若Bob刚登录银行且session未过期,请求会附带cookie发送 服务器验证通过,执行转账 攻击特点 : 受害者完全不知情 日志中显示为合法请求 难以追踪攻击者 4. CSRF防御措施 4.1 验证HTTP Referer字段 原理 : 检查请求头中的Referer字段 只允许来自同域名的请求 实现 : 拦截器检查Referer是否以 bank.example 开头 非本域请求视为CSRF攻击并拒绝 优缺点 : 优点 :实现简单,无需修改现有逻辑 缺点 : 浏览器Referer实现不一致 IE6/FF2等浏览器可篡改Referer 用户可能禁用Referer导致误判 隐私泄露风险 4.2 Anti-CSRF Token 原理 : 在请求中添加不可伪造的token token不存储在cookie中 服务器验证token有效性 实现方式 : GET请求 :URL后附加token http://url?csrftoken=tokenvalue POST请求 :表单中添加隐藏字段 <input type="hidden" name="csrftoken" value="tokenvalue"> 增强措施 : 页面加载时JavaScript自动为所有a/form标签添加token 动态生成内容需手动添加token 外链不加token防止泄露 优缺点 : 优点 :比Referer更安全 缺点 : 实现复杂,容易遗漏 token可能通过Referer泄露 动态内容处理困难 4.3 自定义HTTP头验证 原理 : 将token放入自定义HTTP头(如X-CSRFToken) 通过XMLHttpRequest发送 实现 : 优缺点 : 优点 : token不会通过URL泄露 不受Referer限制 缺点 : 仅适用于AJAX请求 需重写前端代码 浏览器功能(前进/后退)受限 5. CSRF漏洞挖掘方法 5.1 手工测试 抓取正常请求数据包 无Referer和token → 极可能存在CSRF 测试Referer检查 去掉Referer后提交仍有效 → 存在CSRF 检查token机制 修改/删除token后请求仍有效 → 存在CSRF 5.2 工具测试 CSRFTester : 抓取浏览器所有链接和表单 修改表单数据重新提交 成功则存在漏洞 CSRF Request Builder : 专门用于CSRF检测 可生成攻击POC 6. 使用Burp Suite生成CSRF POC 6.1 攻击流程 目标: 192.168.61.1 攻击机: 192.168.61.132 步骤: 登录目标网站抓取修改信息的包 Burp中:Engagement tools → Generate CSRF PoC 复制HTML代码到攻击机 发送恶意链接给目标: http://192.168.61.132/1.html 目标点击后信息被修改 6.2 Burp操作详解 拦截目标请求 右键选择"Engagement tools" → "Generate CSRF PoC" 调整POC选项(自动提交/表单样式等) 复制生成的HTML代码 在攻击服务器上托管该页面 通过钓鱼等方式诱导目标访问 7. 最佳防御实践 关键操作防护 : 重要操作(如转账、改密)使用POST 结合token和Referer检查 增加二次验证(短信/邮件确认) token设计原则 : 足够随机,不可预测 绑定用户session 设置合理有效期 每个表单独立token 架构层面 : 敏感操作使用专用接口 限制关键接口的调用频率 记录完整操作日志 补充措施 : 设置SameSite cookie属性 重要操作验证原始密码 实施操作确认机制 通过综合运用以上防御措施,可有效防范CSRF攻击,保护Web应用和用户数据安全。