DOM Clobbering
我刚开始以为是DOM型XSS,结果发现完全不一样
靶场:DOM clobbering | Web Security Academy
参考文章:使用 Dom Clobbering 扩展 XSS-先知社区
定义
DOM Clobbering就是通过在页面中插入HTML代码,改变javascript中全局变量或者对象属性的含义,从而永久改变javascript执行结果的一种技术。其中的“clobbering”就是指我们破坏了原本的全局变量或对象属性。
不想看前置知识可以直接跳到靶场
举个例子
|
|
我们定义id和name属性
然后通过这种办法,来覆盖原有的值
先创建一个div,然后把这个div插入到body中,再获取cookie时 不再获取js原先提供的cookie 而是把img获取到了。
document.cookie 已经被我们用img 标签给覆盖了
这里相当与我们把前面定义的name的值从y改成了cookie,document.y获取到<img name = "y">
,那么document.cookie不就获取到了<img name = "cookie">
前置知识
既然我们可以通过这种方式去创建或者覆盖 document 或者 window 对象的某些值,但是看起来我们举的例子只是利用标签创建或者覆盖最终得到的也是标签,是一个HTMLElment
对象。
但是对于大多数情况来说,我们可能更需要将其转换为一个可控的字符串类型,以便我们进行操作。
toString
我们可以通过以下代码来进行 fuzz 得到可以通过toString
方法将其转换成字符串类型的标签
|
|
然后返回了两个函数
第一个标签其实就是area,跟br那些一样,是空元素,利用不了,第二个是a标签,可以用href来进行字符串转换
HTMLCollection
但是如果我们需要的是x.y 这种形式呢?两层结构我们应该怎么办呢?我们可以尝试上述的办法:
|
|
这里无论第一个标签怎么组合,得到的结果都只是undefined
。但是我们可以通过另一种方法加入引入 name 属性就会有其他的效果。
HTMLCollection
是一个element
的“集合”类,值得注意的是我们可以通过collection[name]
的形式来调用其中的元素,所以我们似乎可以通过先构建一个HTMLCollection
,再通过collection[name]
的形式来调用。
也就是说把上面代码改成
|
|
HTML Relationships
我们也可以通过利用 HTML 标签之间存在的关系来构建层级关系。
|
|
以上代码测试了现在 HTML5 基本上所有的标签,使用两层的层级关系进行 fuzz ,注意这里只使用了id
,并没有使用name
,与上文的HTMLCollection
并不是一种方法。
我们可以得到的是以下关系:
|
|
如果我们想要构建x.y
的形式,我们可以这么构建:
|
|
三级关系x.y.z的写法
|
|
自定义属性构造
以上我们都是通过 id 或者 name 来利用,那我们能不能通过自定义属性来构造呢?
|
|
很明显,这意味着任何未定义的属性都不会具有 DOM 属性,所以就返回了 undefined
我们可以尝试一下 fuzz 所有标签的有没有字符串类型的属性可供我们使用:
|
|
我们可以得到一系列的标签以及其属性名称,例如我们可以利用其中的a:title
来进行组合
|
|
其中在我们第一步得到的属性中比较有意思的是 a 标签的username
跟password
属性,虽然我们不能直接通过title
这种形式利用,但是我们可以通过href
的形式来进行利用:
|
|
bp靶场练习
bp官方说这个漏洞的利用点在于
如果有全局变量定义为
|
|
我们可以尝试以下代码覆盖
|
|
甚至注入外部js脚本
|
|
Exploiting DOM clobbering to enable XSS
上来是一个博客界面,随便点一个进去可以看到评论界面,查看源码看到两个js
第一个domPurify-2.0.15.js是用来防御xss的,而第二个js可能就是我们利用漏洞的地方了
在它的displayComments函数我们看到了熟悉的全局变量
|
|
我们可以用 Dom Clobbering 来控制 window.defaultAvatar
.只要我们原来没有头像就可以用一个构造一个defaultAvatar.avatar
进行 XSS 了。
根据前面我们学的,这是一个二级关系,我们可以用htmlcollection
|
|
这里的"
要转成html实体编码
改变完defaultAvatar的值之后,只要随便评论就能触发恶意代码导致xss
可以看到我们已经插入了恶意代码,然后我们随意评论aaa,返回的时候直接触发了
这里我很奇怪为什么这个href只能是cid开头,而别的不行,然后看了官方题解说是cid协议,它不使用url编码双引号,就能用html实体编码来注入,使得下一次的全局变量avatar为恶意代码
Clobbering DOM attributes to bypass HTML filters
这里就要用到上面二级关系的第二种办法,form标签与其他标签的层级关系
例如
|
|
这里点进去依旧看源码
这题比上题安全多了,没有直接用windows这种来调用全局变量
|
|
我们可以构造一个包含有name=attributes
的子节点的 payload 绕过属性的 check ,这里给定的白名单标签也比较明显,我们可以通过 HTML Relationships 来构造我们的 payload
|
|
接着就是构造 XSS 了,根据题目要求,需要用户访问触发,所以我们可以利用tabindex
属性,配合form
的onfocus
时间来 XSS 。
|
|
但是如果直接交给用户点击的话是不会触发的,因为评论是由 aJax 请求拿到的,直接访问的话,Dom 树是还没有评论的,得需要等待 JS 执行完成才会有评论,所以这里我们需要一个延时或者阻塞的操作。比较简单的是利用iframe
进行setTimeout
|
|
这里要注意一定要得等评论加载完毕再用#x
选择form
,所以这里的 500ms 需要根据自己的网络情况适当调整。
一些著名的利用漏洞
CVE-2017-0928 Bypassing sanitization using DOM clobbering
html-janitor 也就是我们上文用到的 HTML filters,在 v2.0.2 当中,janitor 在循环中有这么几行代码:
|
|
用_sanitized
作为标志位来标志是否已经进行标准化,但是这里,由我们上个例子可以得出,我们可以利用与上个例子类似的 payload 绕过第一个 if 就可以绕过标准化过滤了。
|
|
修复方案是删除了这些判断,对子树利用递归形式进行标准化过滤。
XSS in GMail’s AMP4Email via DOM Clobbering
这个就不细说了,感兴趣师傅可以去搜搜