绕过 CSP 从而产生 UXSS 漏洞

web安全 2019-11-10

本文作者:国勇(信安之路特约作者) 原文地址:https://thehackerblog.com/video-download-uxss-exploit-detailed/ 注意:此帖与先前的 Chrome 扩展漏洞报导略有不同。 我将实际与你一起浏览代码并向你展示如何跟踪一个扩展程序的步骤。 所以整个事情的描述会较长。

当通过 tarnish 扫描大量 Chrome 扩展程序时,我发现了两款流行的 Chrome 扩展程序 Video Downloader for Chrome version 5.0.012 (820万用户) 和 Video Downloader Plus(730 万用户) 在浏览器的操作页中存在 XSS 漏洞,而利用这些扩展程序只要让受害者导航到攻击者控制的页面。

导致此漏洞的原因是使用字符串拼接生成 HTML,该 HTML 通过 jQuery 动态添加到 DOM。 攻击者可以创建一个特定的链接,这将导致在扩展的上下文中执行任意 JavaScript。 使用此漏洞,以下是攻击者可以滥用此扩展程序的访问权限:

"permissions": [
   "alarms",
   "contextMenus",
   "privacy",
   "storage",
   "cookies",
   "tabs",
   "unlimitedStorage",
   "webNavigation",
   "webRequest",
   "webRequestBlocking",
   "http://*/*",
   "https://*/*",
   "notifications"
],

使用上述权限,攻击者可以 dump 所有浏览器 cookie,拦截所有浏览器请求,向各类已经获取到身份认证的站点发起请求并通信。就像它所获得的扩展程序一样强大。

漏洞

此漏洞的核心是以下代码:

img

这是一个相当于教科书式的跨站脚本 (xss) 漏洞代码示例, 扩展程序从攻击者控制的页面中提取这些视频链接,所以利用它应该是直截了当的。 然而,就像教科书中的例子一样,现实世界的情况要复杂得多。 这篇文章将介绍沿途遇到的阻力,并展示它们是如何被绕过的。 我们将从数据输入的位置开始,并一直跟寻到最终触发的函数。

胜利的道路

该扩展程序使用 Content Script从页面链接( 标签)和视频( 标签)收集视频 URL。 Content Script 是 JavaScript 代码片段,运行在用户浏览器被访问过的页面上(在这种情况下,用户访问的每个页面)。

以下代码来自扩展程序的Content Script

img

从上面的代码中可以看出迭代链接和视频元素,并在返回之前将信息收集到 videoLinks 数组中。 我们控制的videoLinks 元素属性是 url(从 href 属性中提取)和 fileName(通过获取 title 属性,alt 属性或节点的内部文本来获取)。

此函数被 vd.findVideoLinks 调用:

img

此调用发生在每个页面的页面加载开始时:

vd.init=function() {
   vd.findVideoLinks(document.body);
};
vd.init();

抓取到所有这些链接后,它们将通过 vd.sendVideoLinks 函数发送到扩展程序的后台页面。 以下是在扩展的后台页面中声明的消息侦听器:

img

我们进入的 caseadd-video-links,我们的 send.tab 不是 undefined,所以通过带上之前抓取的链接数据调用 ad.addVideoLinks 函数。 以下是 addVideoLinks 的代码:

img

上面的代码检查它之前是否已经存储了此 tabId 的链接数据。 如果不是则会创建一个新对象。 每条链接数据的 fileName 属性通过 vd.getFileName 函数获得,该函数代码如下:

img

上述函数破坏了通过链接数据的 fileName 属性来构造 DOM-XSS 的机会。它将删除任何与正则表达式 [A-Za-z0-9()_ -] 不匹配的字符,遗憾的是包括了如 " 字符,这些字符可以在 HTML 字符拼接时用于属性截断。

这只给我们留下了 url 属性来绕过,所以继续找。

videoLink 被发送到 vd.addVideoLinkToTab 函数,该函数如下:

img

该脚本检查链接数据是否具有 size 属性。 在未设置大小的情况下,它通过 vd.getVideoDataFromServer 函数获取链接文件的大小。

img

上面的代码只是触发 XMLHTTPRequest 请求以获取指定链接上的 http 头,并提取 Content-Type 和 Content-Length 头。返回此数据,Content-Length 头的值用于设置 videoLinks 元素的 size 属性。 完成此操作后,结果将传递给 vd.addVideoLinkToTabFinalStep

img

这里开始遇到一些障碍。 我们希望将 URL 附加到 vd.tabsData[tabId].videoLinks 数组,但必须满足如下条件:


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论