基于 DOM 的 XSS
基于 DOM 的 XSS 是什么?
基于 DOM 的 XSS一种 XSS 变体,注入和执行完全发生在浏览器中,因为客户端 JavaScript 未经净化就将不可信数据写入接收器。
基于 DOM 的 XSS(Type-0)是一种跨站脚本缺陷,其根本原因完全位于客户端代码之中。这一术语由 Amit Klein 于 2005 年在论文 "DOM Based Cross Site Scripting or XSS of the Third Kind" 中提出。一个可信的源(source)——location.hash、location.search、document.referrer、window.name、postMessage 或 localStorage——未经净化便流入危险的接收器(sink),例如 innerHTML、document.write、eval、setTimeout 或 jQuery.html()。由于恶意载荷往往藏在 URL 片段中(# 之后),它从不会被发送到服务器,使得该缺陷对 WAF、服务器日志以及大多数反射型 XSS 扫描器都不可见。
其现实影响巨大:DOM XSS 曾反复出现在广告与分析标签中、在信任跨源数据的 postMessage 处理程序中,以及在老旧的 jQuery 选择器($(location.hash),已在 CVE-2011-4969 中针对 1.6.3 之前的版本修复)中。Google 自身的分析发现,其产品中的多数 XSS 都属于基于 DOM 的类型,这促成了 Trusted Types 的诞生。防御措施:优先使用 textContent、setAttribute 等惰性接收器;使用 DOMPurify 或内置的 Sanitizer API 进行净化;强制启用 Trusted Types 并配合严格的 Content Security Policy;并在代码审查过程中运行可追踪从源到接收器数据流的污点追踪工具。
flowchart LR
A["源<br/>location.hash / postMessage"] --> B[客户端 JS<br/>读取值]
B --> C{是否已净化?}
C -->|"textContent / DOMPurify"| D[安全渲染]
C -->|"原始字符串传入 innerHTML、<br/>eval、document.write"| E[接收器执行载荷]
E --> F[攻击者脚本<br/>在受害者会话中运行]
F --> G[窃取 Cookie、账户<br/>接管、键盘记录]
E -.->|Trusted Types 阻断| H[TypeError,不执行]● 示例
- 01
document.getElementById('out').innerHTML = location.hash.substring(1);
- 02
SPA 路由器使用 window.location 将未净化的 HTML 渲染到模板槽位。
● 常见问题
基于 DOM 的 XSS 是什么?
一种 XSS 变体,注入和执行完全发生在浏览器中,因为客户端 JavaScript 未经净化就将不可信数据写入接收器。 它属于网络安全的 攻击与威胁 分类。
基于 DOM 的 XSS 是什么意思?
一种 XSS 变体,注入和执行完全发生在浏览器中,因为客户端 JavaScript 未经净化就将不可信数据写入接收器。
如何防御 基于 DOM 的 XSS?
针对 基于 DOM 的 XSS 的防御通常结合技术控制与运营实践,详见上方完整定义。
基于 DOM 的 XSS 还有哪些其他名称?
常见的别称包括: Type-0 XSS, 客户端 XSS。