原文链接:UXSS on Microsoft Edge – Adventures in a Domainless World (无域世界大冒险)
原作者:Manuel Caballero
译:Holic (知道创宇404安全实验室)
注:相关文件可在此下载。
今天,我们来讨论设计上的问题,配合这些问题,我们最终在 Microsoft Edge 浏览器上实现了通用跨站脚本攻击(UXSS)。如果你不是安全研究员,但还是想了解此漏洞,你可以这样理解:访问恶意网页,攻击者就能读取你的 Cookie,更改客户端的网页内容,获取个人信息等。此外,由于 Microsoft Edge 使用 受保护的内部资源执行特殊操作,攻击者可能会访问这些资源,并可能设置 Edge 的配置选项,打开 IE 等。
我们有段视频展示了针对 bing cookie 的攻击,另一段视频显示 nature.com 的内容。但请记住,这些网站本身没有任何问题:而该漏洞来自 Microsoft Edge 浏览器。下面我们来看看这是怎么做到的。
about:blank 是个非常特殊的 URL,有时会使人感到困惑,不知道属于哪里。思考一下:如果我们位于 www.magicmac.com/dom/index.html ,document.domain 显然是 www.magicmac.com,但是 about:blank 的域属于什么呢?这就视情况而定了。理论上,它应该匹配 referrer 的域,即设置其网址的网页。例如,如果我们在 www.magicmac.com 点击一个 about:blank 链接,那么该 about:blank 就将 www.magicmac.com 作为它的域。
另一个例子是 iframe,其来源指向 about:blank,或者根本没有源(浏览器默认为 about:blank)。
所以,从 goodfellas.com 加载 about:blank 看起来和从 evil.com 加载差不多,因为两个 URL 是相同的,但他们有不同的 document.domain ,所以它们之间不能互相访问。
那么问题来了:我们手动输入到地址栏中的 about:blank 的域是什么?要的就是这个!答案如此重要,所以我把 Devtools 放大了看。
是空的,如我们所见,它有巨大的力量,但是为了确保我们是在同一页面,我们调用一个没有域的“无域名”(domainless)和“有域”的(domained)的 URL,链接至有 document.domain 的网站。
Bug hunter,本篇文章以下便是重要的东西了。
(无域的 about:blank 能够访问任何有域的 about:blank)
换句话说,一个无域的 about:blank 可以无限制访问有域的 about:blank 。我们在此投机取巧,直接在调试控制台操作,快速添加一个 bing.com 的 iframe 到这个页面。
document.body.innerHTML = '<iframe src="http://www.bing.com/images/search?q=microsoft+edge"></iframe>'
很好!我们在顶层无域的 blank 中有一个 bing.com 的 frame,但是我们的目标是找到 bing 中的一个空白的 iframe,如我所述,一个无域的 blank (main windows)将能够访问任何有域的 blank(bing.com 中的 iframe)。
这种情况下很容易实现,因为我们使用的 bing.com 已经有 blank 的 iframe 了。但让我们继续尝试一下吧!即使来自调试器,下面的这条指令通常拒绝访问,但由于页面的顶层是无域的,它可以运行。那么让我们来一探究竟!
window[0][0].location.href = "javascript:alert(parent.document.domain)";
Bang!我知道这不会深入你脑海,因为我们是从 DevTool 获得了结果,对吧?但是对我来说,这是我所做的最重要的事情,因为如果我们能够掌握这一理念,接下来发现新的 UXSS 将在一定程度上变得轻松不少。从现在起,每找到一种访问无域的 blank 的方法(一般是 about:blank ,但我们也可以用其他的),我们将得到一个 UXSS。现在是使用 DevTools 的情况,我想确认一下我们完全了解所正在做的,当然我们不需要 DevTools。
现在来动真格的吧。我们需要找到一种方法,创建一个可以从普通网页访问的无域网站,更快的方法是使用 data: URI 而不是 about:blank 。同理,至少协议不同。而如果我们在 iframe 内部加载 data: URI ,则其域将与其引用的域相同(就像我们在开头看到的 about:blank 一样),而且如果尝试在顶层加载 data:uri 的数据,Edge 会拒绝将我们送至错误页面。
然而,我们有几个小技巧,可以做到获取无域数据的 data:uri ,现在我们来探索 Flash 版的 PoC,因为它及其简单。事实上,我从 2005 年以来一直在使用这个 Flash,它只设置了一个来自查询字符串的 URL,赶快利用它!
<iframe src="geturl.swf?target=_top&redir=data:,[html/script goes here]"></iframe>
看到了吗?仅需将你想加载的 URL 添加到 redir 参数中即可。在这种情况下,我们使用了一个 data:uri ,并将其加载在无域的顶层。此外,为了欺骗 Edge 浏览器,我们需要在 iframe 内部加载 swf ,否则将无法达成效果(错误页面)。你可以自己试一下。
顺便说一下,别忘了我们可以找到实现同样效果的替代品。我刚刚使用它是因为它是首先被发现的,Adobe 的人可能会将 data:uri 列入黑名单,以便帮助我的 @Edge 朋友摆脱此 bug。然而,有很多方法实现相同的事情而无需 flash 文件。提出你自己的想法,找到自己的方式!
OK,现在我们在无域的窗口中,我们可以注入一个指向 bing.com 的 iframe,但是 Edge 处于不能正确渲染页面元素的状态。如果我们尝试使用 createElement/insertAdjacentHtml/etc 它将不能生效。我的意思是,Edge 会绘制一个“死”的 iframe,就像没有引擎的汽车一样:它根本无法正常运行。为了解决此难题,我们使用 document.write 写入自身,强制浏览器再次进行渲染。而且因为我们在无域的 URL 中,document.write 将使我们完全位于同一地址/域之中。
document.write('<iframe src="http://www.bing.com/images"></iframe>');
完美!现在我们可以访问 bing 的空白 iframe,但是记得我们这回属于比较幸运,因为并不是所有的站点里面都会有 “free blank iframes”。
window[0][0].location.href = "javascript:alert(parent.document.cookie)";
我很兴奋,这次在没有 DevTools 的情况下利用生效了。Oh,no,我知道你在想什么,多疑的 bug hunter:Bing 白白给我们提供了一对空的 iframe,这太简单了!是的,但我只是稍微庆祝一下!从现在开始我会叫你 killjoy!不再是 “bug hunter”。?
我们继续,killjoy。我知道网站不会喜欢给我们提供空 iframe 的主意,所以我们需要找到自己的方式。
拿下非合作站点
想想一下,我们在第二步顶层是无域的 data: ,而我们的 iframe 正确呈现,但指向 nature.com 而不是 bing.com (因为 nature 有一个非空的 iframe)。如果我们尝试更改 iframe 的地址,Edge 会拒绝打开一个新窗口。换句话说,这种事情是无效的。
// We are inside a domainless data: so Edge will open a new
// window instead of changing nature-iframe's location
window[0][0].location.href = "about:blank";
这不会生效的。也行它可以绕过,但我已经进行了足够的尝试。这是在无域的情况下发生的问题,因此我们可以打开一个带有真实 URL 的新窗口,然后从那里再进行处理。这正是我们将要做的:
window.open(“javascript:alert(document.domain)”, “DAVID_COPPERFIELD”);
再次享受,但这次在房子里欢呼雀跃。Yes!Opsss,我的妻子问我发现了什么。她明白这些尖叫意味着什么。?
killjoy 先生,我们又做到了。PoC 是交互式的,因此我们可以实时了解我们正在做什么,但请阅读代码的具体细节,我确定有改进的余地。如果你提出这些想法,那么你很可能会发现能够实现类似事情的变通方法。研究,学习,学到了!很有趣。
在没有 Flash 的情况下,你能找到自己的方法设置无域 URL 的方法吗?是的,你可以的。此外,只要有我们在此一起探讨代码,我们可以创建多种多样的 UXSS 场景,比如在 iframe 访问其顶层。那可能吗?假设我是由 Facebook 呈现的横幅广告。可不可以访问我们的顶层,并获取就像用户好友列表这样的东西?当然!访问不喜欢在框架中呈现的 XFO 站点怎么办?iframe 是唯一能够呈现 HTML 元素的吗?最后,完全没有 iframe 的网站又怎么办?我给你保证,我们甚至能够接触到编制这些代码的人。坐下来探索一下吧!这里有你需要的文件。
Have a nice day! Manuel.