骇极干货 | Firefox:网站如何窃取Cookie

在2020年中,我开始检查Android浏览器是否存在多种类型的漏洞。在查看android Firefox 的v68.9.0版本时,我注意到它在浏览content://URI时显示奇怪的行为。

在android应用中,其他组件可以通过Content URIs的方式来访问provider,Content URIs可以表示多种形式的信息,例如访问文件或数据库信息。

大多数浏览器支持的解析和处理file://与content://URI方案。如果尝试在浏览器中打开本地HTML文件,则很可能会使用content://打开文件时使用的文件浏览器创建的URI。

测试Content://URI

当我测试Firefox对contentURI的使用时,我注意到在渲染URI时地址栏正在更改,重定向到了file://URI。看来Firefox将内容保存到文件中,然后将我重定向到创建的文件,文件保存在内部临时文件夹/data/data/org.mozilla/firefox/cache/contentUri/中。

我还注意到,创建的文件与provider返回的文件具有相同的名称,而且Firefox不会更改名称,所以如果文件已存在的话就会覆盖掉该文件。

权限

通常,应用程序需要特定的URI权限才能从其他应用程序的provider获取内容。这可以防止应用程序访问其他provider中的文件,除非已明确授予它们许可(在点击“打开方式”或“共享方式”并选择一个应用程序来访问文件时就是这种情况)。但是,从自己的内容提供者访问URI时,应用程序无需遵循此路线。

Firefox中的一个file provider的权限为org.mozilla.firefox.fileprovider,并且具有以下配置:

由于使用了根路径配置,因此只要我们可以访问的话,几乎可以在Firefox中打开任何文件。

现在我们知道可以打开任何文件了,让我们尝试将文件内容公开到外部。

利用SOP的file://

Firefox使用file://的方式处理跨域请求可以参考。就此漏洞利用而言,您唯一需要了解的是文件可以访问其自身的内容(例如,通过new ().open("GET", window.location, true)),因为其来源是相同的。

现在,如果一个文件可以请求自己的内容,并且可以替换这些内容,那么我也许可以用另一个使用相同名称的文件来欺骗一个文件的内容。

我开始进行一个简单的测试,首先我需要通过从外部目录打开文件来检索私有文件的内容。我选择了/data/user/0/org.mozilla.firefox/files/mozilla/profiles.ini; 该文件包含有关cookie数据库在设备中存储位置的信息。此文件,我需要创建一个同名文件,并将其保存在:/sdcard/Download/profiles.ini

像在第一段中一样,我将使用来检索window.location。

要加载此脚本,我们还将在同一文件中创建一个iframe,该iframe加载一个content://指向我们实际尝试读取的文件的URI;通过使用content://URI打开,我们将利用Firefox将文件复制到另一个位置并通过进行访问file://。

总结一下,通过打开我们创建的文件:

1.Firefox打开:

content://org.mozilla.firefox.fileprovider/root/sdcard/Download/profiles.ini

它是文件/sdcard/Download/profiles.ini的URI表示形式。

2.Firefox提取provider提供的内容并将其保存在 /data/data/org.mozilla.firefox/cache/contentUri/profiles.ini中。

3.Firefox重定向用户访问步骤2中的文件,并以file://URI作为前缀。

4.只要访问HTML页面,iframe就会请求content://URI的链接,该URI与当前打开的文件具有相同的名称(尽管位置不同):

content://org.mozilla.firefox.fileprovider/root/data/user/0/org.mozilla.firefox/files/mozilla/profiles.ini

5.Firefox将步骤3中打开的文件内容替换为步骤4中的文件内容。

6.短暂的延迟后,页面将alert其自己的内容(现在已在步骤4中将其更改为另一个文件的内容)。

现在,我们我们有了跨域问题,如果文件共享相同的名称,则可以使用file://URI的方式访问另一个file://URI的内容。此外,由于我们使用的是Firefox的provider,该提供商的root-path配置意味着我们可以利用它来访问设备上的任何文件。

升级到远程

下一个问题是检查是否有可能使用URL Scheml的方式将此漏洞转换为可远程执行的POC。

我将设置一个Python服务器来分配下一个漏洞。我们需要的第一件事是需要一个和窃取的文件名称相同的文件。在这种情况下,我们的远程网页应该能够触发下载profiles.ini文件的请求。

下载文件后,我们需要将其打开。我们使用Firefox将下载的文件移动到其内部目录:

这应该和以前一样;它将使用action为android.intent.action.VIEW的方式去打开如下contentURI:

content://org.mozilla.firefox.fileprovider/root/sdcard/Download/profiles.ini

然后将内容下载到:

URI/data/data/org.mozilla.firefox/cache/contentUri/profiles.ini中并使用file://URI的方式打开。

如图所示,应用已经将敏感数据打印出来了。

总结

如上所示,仅通过让受害者访问网页就可以从设备窃取文件。在实际的攻击情形中,恶意文件会将读取的内容发送到攻击者控制的服务器,而不是以警报方式输出内容。

当我提交该漏洞时,我提出的概念证明强调了窃取Firefox cookie数据库的能力,该cookie数据库是一个sqlite数据库,其中包含来自所访问域的所有cookie。

本文是翻译文章,原文链接:https://medium.com/bugbountywriteup/firefox-and-how-a-website-could-steal-all-of-your-cookies-581fe4648e8d返回搜狐,查看更多

阅读 ()
平台声明
该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。