原文:Edge – SOP bypass courtesy of the reading mode
原作者: Manuel Caballero
译:Holic (知道创宇404安全实验室)

Microsoft Edge 团队近期发了篇关于阅读模式的推特,这项功能可以消除网页上的一些混乱元素,以便专心阅读。这对我来说不是新鲜事,但直到这封推文提醒我,我去了解伪协议在 Edge 上如何运行的时候才去学了相关知识。你若想赶紧看结果,请看 PoC 视频,不然继续往下读吧。

要查看阅读模式,请加载网站,点击阅读视图按钮(像是一本书的图标)。

该项功能还可以保护视力。

然而,这个页面的真实地址是什么呢?打开开发者工具(F12)并在控制台中输入 location.href。显然,Edge 在 URL 前面添加了 read: 伪协议。

以下漏洞适用于所有的 Edge 版本,但 PoC 本身是针对 Edge 15 (创意者更新之后)构造的。要想在旧版本上运行,需要修改一下以便阅读模式下能够顺利进行渲染。

阅读模式是一种内部资源

阅读模式与真实网站无关。如果我们看源码的话(按下 CTRL U),我们看到并没有追溯到原始页面。实际上,这是个托管在文件系统的内部资源。

C:\Windows\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\Assets\ReadingView

Edge 解析原始页面的内容,删除 iframe/scripts 以及其他 html 标签,最后将其在内部阅读视图 html 中托管的 iframe 中进行渲染。但所有的这些细节都会在后台发生,用户会有一种还在原始网站上的错觉,因为地址栏并没有发生改变。

但是,如果 Edge 通过在 URL 之前设置 "read:" 协议的方法实现在阅读页面下渲染页面,这一点能利用脚本实现吗?我们可以在阅读模式下加载任意网址吗?

强制进入阅读模式

我们看看能不能用添加前置 read: 协议的方法,强制将任意 URL 渲染为阅读模式。

location.href = "read:http://www.cracking.com.ar"; // prepending read: does the trick

效果拔群,而有件事却引起了我的注意:地址栏中的 URL 是 crack.com.ar 而渲染的内容来自 brokenbrowser.com。什么情况?如果我们访问 crack.com.ar 我们会看到 location.replace 将其跳转至 brokenbrowser.com ,而 Edge 并没有更新其地址栏!

漏洞 #1 - 当脚本或 http 重定向发生时,Edge 并不会更新地址栏。

找出有趣的重定向

这意味着我们可以使用开放的重定向欺骗任何网站,甚至更好的情况是,这些网站已经重定向至我们可控的站点。比如,如果我们可以使 google.com 重定向到一个恶意的页面,那么用户将会认为内容来自 google,而实际上是来自 evil.com。

顺带一提,考虑到所有搜索结果都是重定向至目标的形式,在 google 上进行欺骗并不困难。例如,google 从 cracking.com.ar 索引了 "cracking-01.html" 页面,如果我们找到重定向至该页面的原始链接,一切便尽在掌握之中。因为这是我自己的服务器,我能随意改变它!这能行得通吗?我打开了 Chrome,鼠标在链接上悬停一会儿,在 google 上找到重定向到我服务器(crack.com.ar)的链接。请记住:我们的目标是找到重定向至 crack.com.ar 的 Google URL,该网站受我所控。

阅读模式下的重定向

现在 google.com.ar 上有了重定向到 crack.com.ar 的 URL。在 crack.com.car 中有一段文字:" Not really Google" ,因此我们能够轻易分辨出内容的来源所在。以下是使用前缀 read:协议的 google 重定向,在 Edge 中打开的话显示如下:

read:https://www.google.com.ar/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiRx_eksaTTAhURl5AKHcrxCuoQFgggMAA&url=http%3A%2F%2Fwww.cracking.com.ar%2Fcracking-01.html&usg=AFQjCNGa3PACMDlI6RdBOnoEfySVh1C2ZQ

Wow!不错的内容欺骗,可惜是在阅读模式!这说明我们不能够完全控制页面的外观。还要记得:Edge 在渲染我们的小把戏之前会去除大量的 html 内容。例如,iframe 和 script 都会被移除,JavaScript 链接也不奏效(多亏了渲染正文之前的 META CSP 标签)。那么如何自定义页面,并摆脱那个淡黄色的背景呢?又怎么在其中运行脚本呢?

在阅读模式中运行脚本

处于阅读模式之际, Edge 会尽量把内容保持成静态的,即不允许运行脚本,iframe 也会被去除,诸如此类。换而言之,最终的内容看起来像是一本书,而不是一个网页。而我们将尝试打破这种静态阅读模式的障碍,这种像是一切都被冻住的状态。

我来助你一臂之力,捉虫猎手:我手工测试了几个 html 标签,比如 iframe/script/meta ,但是这些都被正确地移除了。然后我尝试了 object/html 标签,我很惊讶,竟然可以的!比想象中的更容易,object/html 标签类似 iframe :他们都是可以运行 script 的 html 容器。

漏洞 #2 - Microsoft Edge 在阅读模式下没有移除 object 标签。

那么,如果在 crack.com.ar 中的页面中添加一个 object 标签,然后弹出一个提示,那么它应该会令人信服。

<!-- prompt.html does a window.prompt with the hard coded "google.com needs..." message -->
<object data="http://www.cracking.com.ar/prompt.html"></object>

现在,Edge 认为首页的源是 google.com.ar(实际上是 crack.com.ar),object/html 的源是 crack.com.ar(这个是真实情况)。那么问题来了,捉虫猎手,我们被困在这个小盒子中,我们可以抛出 prompt/alert,但是无法访问顶部。

假如想把顶部的背景更改为白色,或者其它更有说服力的攻击手段,我们需要绕过同源策略,或者不更改地址栏就能设置顶部的 URL。试试前者的 SOP 绕过吧。

<object> 盒子之外的思考

如何代表顶部的域来渲染任意 html 代码,以真正访问到它呢?data uri 这里是可控的。与在 cracking.com.ar 上托管内容不同,使用 data uri 渲染 html,就像这样:

<!-- object rendering a data uri -->
<object data="data:,<script>alert(top.location)</script>"></object>
<!-- ACCESS DENIED data uris have their own unique origin -->

Oppss!没那么顺利。Edge 不允许我们利用 data uri 访问其他文档,这种做法很好!所有浏览器都把 data uri 作为与创建者不同的独立源进行渲染。但是在 Edge 上这个限制很容易绕过:在加载页面之后使用一个 self-document.write 就能匹配父页面的域了。

<object data="data:,<script>
window.onload = function()
{ // Executing a document.write in a data uri after the onload
  // changes the location of the object to its parent URL.
  document.write('<script>alert(top.location.href)<\/script>');
  document.close();
}
</script>"></object>
<!-- Now we have the same location as our top -->

Yes,捉虫猎手!这回是真正访问 Google 的顶级域名了。此时,我们完全可以访问渲染阅读模式的内部 html 代码,而不用其改变任何东西,用 top.document.write 即可摆脱淡黄色的背景。

<object data="data:,<script>
window.onload = function()
{
  document.write(
    '<script>'+
        'top.document.write(\'Trust me, we are on Google =)\');'+
        'top.document.close()'+
    '<\/script>');
  document.close();
}
</script>"></object>

[ Test the PoC Live on Edge ]

[ Video in YouTube ]

所需离线文件点此下载

以我之见,贵在坚持,但这次很幸运,要感谢原推文,以及初始重定向。我确信继续探索会发现更多的东西,我的读者朋友,很多时候我不会深入这些 bug,所以它们还有更多的扩展空间,要把它变成自己的!下面传授一些人生经验吧 - 就像身经百战的 Richard Feynman - the pleasure of finding things out。我不是科学家,但这本书深深地打动了我:

Why do we do science? Beyond altruistic and self-aggrandizing motivations, many of our best scientists work long hours seeking the electric thrill that comes only from learning something that nobody knew before.

此致。除了好奇心和坚持,没有什么比得上『electric thrill』了,探索,研究,学习,更重要的是开心!

Have a nice day! ?


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/281/