前端全局变量劫持

前端全局变量劫持

最近看了wonderkun师傅的一篇文章,觉得还挺有意思的,收获颇丰。决定自己复现研究一下,原文地址:前端中存在的变量劫持漏洞

先说一下鸡肋的点,这个变量的劫持也只能是把变量劫持为正常页面的window对象,并不能随意修改变量的值

子页面获取

首先kun师傅介绍了三种父页面获取子页面windows对象的方式:

document.getElementById("iframe1").contentWindow;
window.frames[0]; 
window[0] ;

id值是一个全局变量,下例中test这个”id值”就代表iframe标签。也可以通过直接调用iframe内的name属性值获取该iframe的window对象
image_1df3psct91n0slcp85prp177u9.png-60.3kB

利用filter模式删除变量

无论是javascript还是调用标签,都无法覆盖已经定义的变量,但是却可以定义新的变量。

怎么让页面中出现未定义的全局变量呢?kun师傅提到chrome74之后,默认的xss auditor 从block模式编程了filter模式,可以利用这个删除掉页面中的代码。也就是说我们用一段xss代码触发chrome xss auditor删除xss引用的变量,从而达到替我们删除正常变量的目的。

这里简单介绍一下xss auditor

XSS-Auditor

XSS-Auditor是chrome默认开启的,也可以选择在header中关闭Auditor

X-XSS-Protection: 0

它的检测机制如文档中的描述
image_1df3ue0v61s3a1dcr1spb1dmt12ia1g.png-126.6kB

XSS Auditor采用黑名单方法来识别请求参数中提供的危险字符和标签。它还将查询参数与内容进行匹配以识别注入点。如果查询参数无法与响应中的内容匹配,则不会触发Auditor。

不过文档也有提到,基于上下文的检测的局限性使Auditor无法预防一些针对应用层的payload,这里不做深究。

删除变量demo

<script>var hpdoger = "remove me";</script>

当访问的参数以危险标签的形式出现在response中时,就会触发xss-auditor,成功删除自定义的hpdoger变量。下图可以看到变量被成功删除

http://localhost/iframe.html?xss=%3Cscript%3E%0A%20%20%20%20%20var%20hpdoger%20=%20%22remove%22;%0A%3C/script%3E

image_1df3uoatdojsl0fksa1e3b1nb21t.png-112.7kB

bypass同源之iframe

众所周知,用iframe去加载子页面会被同源限制(除非是cors配置的白名单)
image_1df3vq1ivipk1qo3a383ao1lnd2n.png-93.8kB

如果儿子页面也存在iframe(划重点),先通过操纵孙子c页面window对象来设置location,使其指向父页面a,这样父页面a和子页面b就同源了。之后再修改孙子页面c中window对象的name,其作用结果是:name作用域在子页面b的全局变量。

漏洞场景

这里不重复造轮子了,引用kun师傅的文章:https://xz.aliyun.com/t/5565#toc-4

孙子页面c

任意的页面

子页面b

image_1df5h2g811eg76b3bdo1v0b18dqm.png-53.8kB

父页面a

第一步很关键的一点就是修改c页面的location指向a。之后a页面就可以调用b的变量,同时通过iframe触发b页面的xss auditor
image_1df5grfcl16f71ejc1j5upqr10re9.png-127.5kB

第二步修改孙子页面c的name,从而帮b页面注册一个全局变量名为”hpdoger”
image_1df5h8abti9j1bptl671to1e3213.png-72.1kB

这样就成功替换掉b页面的hpdoger变量,同时a页面也可以访问b页面这个全局变量hpdoger(但是不能访问b的其他变量。因为我们通过c页面做跳板,只能访问c的属性间接访问到b的变量,我叫他”同名法则”)。不过前文也提到了这个鸡肋的地方,就是一个变量替换成window对象,受用面很有限。。

not found!