Web安全
首页 > 安全文摘 > Web安全> 正文

UXSS on Microsoft Edge – Adventures in a Domainless World

今天,我们来讨论设计上的问题,配合这些问题,我们最终在 Microsoft Edge 浏览器上实现了通用跨站脚本攻击(UXSS)。

作者:kong来源:paper.seebug.org|2016-12-15 16:43:17

今天,我们来讨论设计上的问题,配合这些问题,我们最终在 Microsoft Edge 浏览器上实现了通用跨站脚本攻击(UXSS)。如果你不是安全研究员,但还是想了解此漏洞,你可以这样理解:访问恶意网页,攻击者就能读取你的 Cookie,更改客户端的网页内容,获取个人信息等。此外,由于 Microsoft Edge 使用 受保护的内部资源执行特殊操作,攻击者可能会访问这些资源,并可能设置 Edge 的配置选项,打开 IE 等。

我们有段视频展示了针对 bing cookie 的攻击,另一段视频显示 nature.com 的内容。但请记住,这些网站本身没有任何问题:而该漏洞来自 Microsoft Edge 浏览器。下面我们来看看这是怎么做到的。

Domainless World

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,本篇文章以下便是重要的东西了。

“A domainless about:blank is capable of accessing any domained about:blank”

(无域的 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。

独立 PoC, 无须 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)";  


MS Edge 的线上 PoC 在此

我很兴奋,这次在没有 DevTools 的情况下利用生效了。Oh,no,我知道你在想什么,多疑的 bug hunter:Bing 白白给我们提供了一对空的 iframe,这太简单了!是的,但我只是稍微庆祝一下!从现在开始我会叫你 killjoy!不再是 “bug hunter”。🙂

我们继续,killjoy。我知道网站不会喜欢给我们提供空 iframe 的主意,所以我们需要找到自己的方式。

Owning non-cooperative sites

拿下非合作站点

想想一下,我们在第二步顶层是无域的 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 的新窗口,然后从那里再进行处理。这正是我们将要做的:

打开一个内有 nature.com iframe 的新窗口。[现在我们在新窗口里面有了一个常规 URL]
将 nature 的内部 iframe 的地址更改为 about:blank ,这样我们可以给它一个名称。是的我们希望 iframe 有一个名称。
将名称设为 about:blank,那么我们的无域 opener 就能通过 window.open 访问到它了。别忘了我们现在窗口内有一个常规的 URL,它是我们强大的 opener。我们将向这个 iframe 命名,就像这样:window.name = "DAVID_COPPERFIELD" ,以纪念这位继续带着激情学习的魔术师。
现在我们应该将 about:blank (属于我们的域)的地址设置为 nature 的地址。为此,我们将使用 meta-refresh 将地址更改为 about:blank 。轻而易举。这个技巧确保 about:blank 恢复至其父域的域。
让 opener 知道一切就绪,所以它可以访问了,就像这样:

window.open(“javascript:alert(document.domain)”, “DAVID_COPPERFIELD”);


MS Edge 的线上 PoC 在此

再次享受,但这次在房子里欢呼雀跃。Yes!Opsss,我的妻子问我发现了什么。她明白这些尖叫意味着什么。😉

killjoy 先生,我们又做到了。PoC 是交互式的,因此我们可以实时了解我们正在做什么,但请阅读代码的具体细节,我确定有改进的余地。如果你提出这些想法,那么你很可能会发现能够实现类似事情的变通方法。研究,学习,学到了!很有趣。

在没有 Flash 的情况下,你能找到自己的方法设置无域 URL 的方法吗?是的,你可以的。此外,只要有我们在此一起探讨代码,我们可以创建多种多样的 UXSS 场景,比如在 iframe 访问其顶层。那可能吗?假设我是由 Facebook 呈现的横幅广告。可不可以访问我们的顶层,并获取就像用户好友列表这样的东西?当然!访问不喜欢在框架中呈现的 XFO 站点怎么办?iframe 是唯一能够呈现 HTML 元素的吗?最后,完全没有 iframe 的网站又怎么办?我给你保证,我们甚至能够接触到编制这些代码的人。坐下来探索一下吧!这里有你需要的文件。

【责任编辑:kong 】

分享:

安全快讯+更多

湖南青年杨某沉迷“黑客”技术,利用国外网络攻击网站的攻击服务,花钱请人开发成软件后,通过QQ群推销,并发展代理商销售,8个月内获利数万元。
6月13日,由赛可达实验室、国家计算机病毒应急处理中心、国家网络与信息系统安全产品质量监督检验中心、首都创新大联盟共同举办的第五届中国网络安全大会(NSC2017)在北京国家会议中心隆重举行。
《中华人民共和国网络安全法》已于6月1日正式实施并成为我国网络空间法治建设的重要里程碑,在确立安全在整个信息系统建设中的核心和关键地位的同时,也对保护公众个人信息安全起到了积极作用。
Shadow Brokers(影子经纪人)回应想哭勒索蠕虫事件,同时公布了一个月度销售计划,称自6月开始,每个月都有高危0day、黑客工具、机密数据售卖。
勒索病毒“WannaCry”(永恒之蓝)在全球范围内的爆发,恐怕是这几天影响力最大的公共安全事件了。