Portswigger Labs — CSRF
字数 2473 2025-08-18 11:36:53

CSRF攻击技术全面解析与防御绕过方法

1. CSRF基础概念

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

基本攻击原理

  • 攻击者构造恶意请求
  • 诱骗已认证用户访问包含恶意请求的页面
  • 用户浏览器自动携带认证信息(如cookie)发送请求
  • 服务器误认为是用户自愿操作

2. CSRF攻击场景分类与绕过技术

2.1 无任何防护的CSRF

场景特征

  • 请求中没有CSRF token等防护机制
  • 仅依赖会话cookie进行身份验证

攻击步骤

  1. 登录目标网站
  2. 点击"update email"功能并抓包
  3. 确认请求中没有csrf-token等防护
  4. 使用工具(如Burp Suite)生成CSRF POC
  5. 将HTML复制到exploit server
  6. 发送给受害者(deliver exploit to victim)

防御建议

  • 实现CSRF token机制
  • 检查请求来源(Referer)

2.2 更改请求方法绕过验证

场景特征

  • POST请求中包含CSRF token验证
  • 但服务器仅对POST方法验证token

攻击步骤

  1. 抓取更新邮件的POST请求,确认body中有csrf-token
  2. 修改csrf token后重放请求,确认会提示"invalid csrf token"
  3. 将POST方法改为GET方法
  4. 确认不再验证token,攻击成功
  5. 生成相应payload并利用

防御建议

  • 对所有敏感操作强制使用POST方法
  • 对所有HTTP方法都进行CSRF token验证

2.3 删除csrf-token绕过验证

场景特征

  • 请求中存在csrf-token
  • 但服务器不强制要求token存在

攻击步骤

  1. 抓包确认存在csrf-token
  2. 尝试修改token后重放请求失败
  3. 尝试更改请求方法也失败
  4. 直接删除csrf-token参数
  5. 确认请求成功

防御建议

  • 强制要求所有敏感请求必须包含有效CSRF token
  • 对缺失token的请求直接拒绝

2.4 未绑定用户session的csrf-token

场景特征

  • 存在CSRF token机制
  • 但token不与用户session绑定

攻击步骤

  1. 点击update抓包,复制csrf token
  2. 新开浏览器,同样操作获取另一个token
  3. 将前一步的token替换到新请求中
  4. 确认可以成功修改
  5. 生成CSRF POC时,只需使用一个未利用过的有效token即可

防御建议

  • 将CSRF token与用户session绑定
  • 每个token只能使用一次(或短时间有效)

2.5 与非会话cookie绑定的csrf-token

场景特征

  • 需要同时验证csrfKey(存储在cookie)和csrf(在请求体中)
  • 但csrfKey可通过其他途径注入

攻击步骤

  1. 登录两个账号,分别抓包
  2. 确认需要同时替换csrfKey和csrf才能完成请求
  3. 发现搜索功能没有CSRF防护
  4. 利用搜索功能注入csrfKey到受害者浏览器:
    
    
  5. 生成包含对应csrf的POC
  6. 受害者访问时会先被注入csrfKey,然后执行CSRF攻击

防御建议

  • 确保csrfKey是HttpOnly和Secure的
  • 对设置cookie的操作进行严格限制
  • 实现SameSite cookie属性

2.6 cookie和body中重复的csrf-token

场景特征

  • 在cookie和body中同时存在csrf参数
  • 单独修改任一处都会报错
  • 需要两处同时修改为相同值

攻击步骤

  1. 确认需要同时修改cookie和body中的csrf
  2. 通过搜索功能注入cookie中的csrf:
    
    
  3. 生成POC时在body中也包含相同的csrf值:
    <form action="https://target.com/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="attacker@example.com" />
      <input type="hidden" name="csrf" value="attacker_value" />
    </form>
    

防御建议

  • 避免在cookie和body中重复相同token
  • 实现严格的token绑定机制

2.7 删除referer绕过验证

场景特征

  • 没有CSRF token
  • 但验证Referer头
  • 允许缺失Referer的请求

攻击步骤

  1. 确认请求没有csrf token但验证Referer
  2. 尝试删除Referer头,确认请求成功
  3. 修改POC,添加禁止referer的meta标签:
    <meta name="referrer" content="no-referrer">
    
  4. 完整POC示例:
    <html>
    <body>
      <form action="https://target.com/my-account/change-email" method="POST">
        <input type="hidden" name="email" value="attacker@example.com" />
      </form>
      <meta name="referrer" content="no-referrer">
      <script>history.pushState(document.forms[0].submit();</script>
    </body>
    </html>
    

防御建议

  • 实现CSRF token而非仅依赖Referer检查
  • 对缺失Referer的敏感请求保持警惕

3. 综合防御策略

  1. 使用CSRF Token

    • 每个表单/请求包含唯一token
    • Token与用户session绑定
    • 存储在隐藏字段而非cookie
  2. 检查Referer头

    • 验证请求来自合法源
    • 但不能作为唯一防护措施
  3. SameSite Cookie属性

    • 设置SameSite=StrictLax
    • 防止CSRF攻击自动发送认证cookie
  4. 敏感操作要求重新认证

    • 如密码修改等关键操作要求输入当前密码
  5. 限制HTTP方法

    • 敏感操作只允许POST方法
    • 避免GET请求修改状态
  6. 双重提交Cookie

    • 在cookie和请求中都包含token
    • 但需确保两者匹配且难以伪造
  7. 自定义请求头

    • 通过JavaScript添加自定义头
    • 服务器验证头是否存在

4. 自动化工具使用

Burp Suite Professional的CSRF POC生成器使用流程:

  1. 拦截目标请求
  2. 右键选择"Engagement tools" > "Generate CSRF PoC"
  3. 根据需要修改生成的HTML
  4. 测试PoC有效性
  5. 部署到exploit server

5. 总结

CSRF攻击方式多样,防御需要多层防护。关键点包括:

  1. 理解每种绕过技术的原理
  2. 识别目标应用的防护机制
  3. 针对特定防护选择合适的绕过方法
  4. 组合利用多种技术(如cookie注入+CSRF POC)
  5. 防御时应采用纵深防御策略,不依赖单一机制

通过全面了解这些攻击技术和防御方法,安全人员可以更好地评估和加固Web应用的安全性。

CSRF攻击技术全面解析与防御绕过方法 1. CSRF基础概念 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用受害者已登录的身份,在受害者不知情的情况下执行非预期操作的攻击方式。 基本攻击原理 攻击者构造恶意请求 诱骗已认证用户访问包含恶意请求的页面 用户浏览器自动携带认证信息(如cookie)发送请求 服务器误认为是用户自愿操作 2. CSRF攻击场景分类与绕过技术 2.1 无任何防护的CSRF 场景特征 : 请求中没有CSRF token等防护机制 仅依赖会话cookie进行身份验证 攻击步骤 : 登录目标网站 点击"update email"功能并抓包 确认请求中没有csrf-token等防护 使用工具(如Burp Suite)生成CSRF POC 将HTML复制到exploit server 发送给受害者(deliver exploit to victim) 防御建议 : 实现CSRF token机制 检查请求来源(Referer) 2.2 更改请求方法绕过验证 场景特征 : POST请求中包含CSRF token验证 但服务器仅对POST方法验证token 攻击步骤 : 抓取更新邮件的POST请求,确认body中有csrf-token 修改csrf token后重放请求,确认会提示"invalid csrf token" 将POST方法改为GET方法 确认不再验证token,攻击成功 生成相应payload并利用 防御建议 : 对所有敏感操作强制使用POST方法 对所有HTTP方法都进行CSRF token验证 2.3 删除csrf-token绕过验证 场景特征 : 请求中存在csrf-token 但服务器不强制要求token存在 攻击步骤 : 抓包确认存在csrf-token 尝试修改token后重放请求失败 尝试更改请求方法也失败 直接删除csrf-token参数 确认请求成功 防御建议 : 强制要求所有敏感请求必须包含有效CSRF token 对缺失token的请求直接拒绝 2.4 未绑定用户session的csrf-token 场景特征 : 存在CSRF token机制 但token不与用户session绑定 攻击步骤 : 点击update抓包,复制csrf token 新开浏览器,同样操作获取另一个token 将前一步的token替换到新请求中 确认可以成功修改 生成CSRF POC时,只需使用一个未利用过的有效token即可 防御建议 : 将CSRF token与用户session绑定 每个token只能使用一次(或短时间有效) 2.5 与非会话cookie绑定的csrf-token 场景特征 : 需要同时验证csrfKey(存储在cookie)和csrf(在请求体中) 但csrfKey可通过其他途径注入 攻击步骤 : 登录两个账号,分别抓包 确认需要同时替换csrfKey和csrf才能完成请求 发现搜索功能没有CSRF防护 利用搜索功能注入csrfKey到受害者浏览器: 生成包含对应csrf的POC 受害者访问时会先被注入csrfKey,然后执行CSRF攻击 防御建议 : 确保csrfKey是HttpOnly和Secure的 对设置cookie的操作进行严格限制 实现SameSite cookie属性 2.6 cookie和body中重复的csrf-token 场景特征 : 在cookie和body中同时存在csrf参数 单独修改任一处都会报错 需要两处同时修改为相同值 攻击步骤 : 确认需要同时修改cookie和body中的csrf 通过搜索功能注入cookie中的csrf: 生成POC时在body中也包含相同的csrf值: 防御建议 : 避免在cookie和body中重复相同token 实现严格的token绑定机制 2.7 删除referer绕过验证 场景特征 : 没有CSRF token 但验证Referer头 允许缺失Referer的请求 攻击步骤 : 确认请求没有csrf token但验证Referer 尝试删除Referer头,确认请求成功 修改POC,添加禁止referer的meta标签: 完整POC示例: 防御建议 : 实现CSRF token而非仅依赖Referer检查 对缺失Referer的敏感请求保持警惕 3. 综合防御策略 使用CSRF Token : 每个表单/请求包含唯一token Token与用户session绑定 存储在隐藏字段而非cookie 检查Referer头 : 验证请求来自合法源 但不能作为唯一防护措施 SameSite Cookie属性 : 设置 SameSite=Strict 或 Lax 防止CSRF攻击自动发送认证cookie 敏感操作要求重新认证 : 如密码修改等关键操作要求输入当前密码 限制HTTP方法 : 敏感操作只允许POST方法 避免GET请求修改状态 双重提交Cookie : 在cookie和请求中都包含token 但需确保两者匹配且难以伪造 自定义请求头 : 通过JavaScript添加自定义头 服务器验证头是否存在 4. 自动化工具使用 Burp Suite Professional的CSRF POC生成器使用流程: 拦截目标请求 右键选择"Engagement tools" > "Generate CSRF PoC" 根据需要修改生成的HTML 测试PoC有效性 部署到exploit server 5. 总结 CSRF攻击方式多样,防御需要多层防护。关键点包括: 理解每种绕过技术的原理 识别目标应用的防护机制 针对特定防护选择合适的绕过方法 组合利用多种技术(如cookie注入+CSRF POC) 防御时应采用纵深防御策略,不依赖单一机制 通过全面了解这些攻击技术和防御方法,安全人员可以更好地评估和加固Web应用的安全性。