【技术分享】谷歌电子表单CSRF+JSON劫持漏洞

阅读量165063

|

发布时间 : 2016-10-31 15:00:12

x
译文声明

本文是翻译文章,文章来源:rodneybeede

原文地址:https://www.rodneybeede.com/Google_Spreadsheet_Vuln_-_CSRF_and_JSON_Hijacking_allows_data_theft.html

译文仅供参考,具体内容表达以及含义原文为准。

http://p5.qhimg.com/t01fda5753efb9daed6.jpg

翻译:sinensis

稿费:150RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

在2015年10月,我在在谷歌电子表单有关的API接口中发现了JSON + CSRF(跨站伪造请求)点击劫持漏洞。攻击者可以利用这个漏洞在未授权访问Google Drive文件的情况下,获取用户的电子表单信息。


漏洞影响

在网络上利用这个漏洞攻击的时候,攻击者需要绕过Google Drive电子表单共享设置的ACL策略。首先说明下,攻击者在未授权访问Google Drive文件的情况下(如下图所示),可以利用该漏洞绕过Google安全设置:

http://p7.qhimg.com/t01e038ae43f58714ea.png


漏洞产生的根本原因

这不是第一个Google存在JSON数据劫持,从而导致用户数据泄漏的漏洞。

漏洞的根源是Google Drive API接口的数据流设计,由此造成OWASP TOP(2013)-A8-Cross-site Request Forgery(CSRF)漏洞从而导致JSON数据劫持。

漏洞的攻击并不难,曾经的Google Gmail就存在CSRF+JSON劫持漏洞。

2016.01.27 — 对Gmail攻击的高级技巧

2008.11.20 — JSON攻击的风骚姿势

2010.10.14 — Gmail的JSON劫持攻击技术

JSON劫持攻击,谷歌是这样修复的:在JSON里面添加一个while()循环,如果攻击发生就会使受害者的浏览器崩溃,从而导致攻击失效。

但是,对于Google Drive的JSON劫持漏洞来说,仅仅添加一个循环是远远不够的。为了不影响Google Drive的产品功能,必要的修复需要复杂的变更。

Google选择了让旧API 接口下线,使用新的接口来解决安全问题。这需要使用这些接口的开发者更新代码。

漏洞攻击场景(众多利用中的一个)

公司的一个电子表格里面有机密信息。

http://p5.qhimg.com/t019c5d1427fdccb7c4.png

电子表格只共享给授权的公司职员。

http://p0.qhimg.com/t01bc48f8b27c842bcf.png

一名职员离职之后,他的授权帐号被取消,同时被分享的文件里面密码/PIN也改变。

http://p8.qhimg.com/t019ff09e2b73845b7a.png

新的共享如下图所示,可以看到离职的员工权限已经被取消。

http://p9.qhimg.com/t01fd4f96bdbddeeb7e.png


原力与你同在

现在被取消授权的员工非常想要获得电子表单的数据,他知道Mr.admin.assist@example.com喜欢经常去一个网站,而这个网站允许任何人使用HTML格式留言。这就是众所周知的水坑攻击,攻击者只需要等待。

下图是受害者访问的网站截屏

http://p2.qhimg.com/t013903961f7f43c5f6.png

在完全不知道受害者(不管是谁是文档的拥有者)的情况下,攻击者就可以收到电子表格的数据。

http://p1.qhimg.com/t01712a91b6969be253.png

下图是攻击者偷取到的数据(受害者完全看不到)

http://p9.qhimg.com/t010326647c7ac993ff.png

攻击者看到的数据如下:

http://p5.qhimg.com/t019061b8847a26c63a.png


这是如何成为可能的呢?

Google Drive的API接口在不需要OAuth token的情况下,允许其他网站跨域发起请求。这种情况下,只要用户登录Google Drive之后,其他任何网站就可以通过调用API接口获取用户的电子表格数据。

因为返回数据是JSON格式,所以可以利用JavaScript解析之后发送到攻击者的服务器。

简单的漏洞证明代码如下:

simpleCapture.php – 从受害者浏览器获取数据的脚本

google_drive_smuggle.html – 这个HTML代码用来偷取目标数据

下面是一个JSON劫持代码例子:

var google = new Object();
  google.visualization = new Object();
  google.visualization.Query = new Object();
        
  google.visualization.Query.setResponse = function(goods) {
          google.response = JSON.stringify(goods, undefined, 2);
            
        }

Google Drive的API接口返回的数据是JSON格式的Javascript对象,这个数据我们可以在跨域的页面获取到,只需要简单发送到自己的服务器即可。

时间线

日期 事件
2015.10.29 报告给Google
2015.10.30 Google确认漏洞,同时询问了Google的修复时间
2015.11.6 Google回复:产品组希望他们最终的改变不会占用下一年用户的大量时间。正如你所说的,这个问题需要小心处理,因为众多用户在使用这个功能。但是我很高兴他们已经有些进展,并且很快就会修复。
2016.1.5   询问Google修复时间
2016.1.6   Google回复修复时间无法确定
2016.1.14  询问Google大致修复时间
2016.1.27  90天内不会修复
2016.2.5  Google回复更新(距离漏洞报告已经99天,距离上次联系Google 30天)
2016.2.15  谷歌无法确定修复时间
2016.2.25  询问谷歌的Bug编号
2016.2.25  谷歌回应相应的Bug编号
2016.3.17 询问谷歌修复时间
2016.4.1 Google回复:“抱歉,我们暂时没有修复的时间线,修复之后会第一时间通知您”
2016.4.26   180天未修复
2016.5.31 215天未修复,询问修复时间
2016.6.3  Google回复他们正在修复问题,并且正在转变产品以避免影响大量用户
2016.8.17     询问修复时间
2016.8.17  Google在同一天回复,他们已经向用户打开警告信息,告诉用户API正在改变
2016.9.13     已经确认警告信息上线
2016.9.15 322天之后漏洞最终修复完成。

最新的修复

在对这个问题进行深入了解之后,Google确认以前的那种修复方式不是最好的选择。他们选择把旧的API下线并且使用新的代替。这个是最有效的解决方法,从我的观点来看,对旧的API进行边边角角的修复还有可能存在安全问题。

现在如果使用旧的API,Google就会弹窗提醒用户旧的API将会失效。

http://p5.qhimg.com/t011fce06c759af612a.png

http://p3.qhimg.com/t01e1ccf5842e6bf15a.png


最终的修复确认

我最终确认这个Bug在2016年9月15号被修复。

http://p0.qhimg.com/t01d24674e16924aa53.png


最终章

在花费几个月和Google的联系之后,见证了问题修复并且电子表单又一次安全加固。曾经从Google得到回复是很困难的,但是我感觉相比施压披露出来,修复才是更好的选择。在影响较小的范围内完整修复,是一件繁琐的事情。

由此我被Google加入到了他们的赏金榜单。你可以在这里找到我的资料

http://p5.qhimg.com/t01774a97906b7256c8.png

http://p0.qhimg.com/t0108ef3e598595e0a4.png

本文翻译自rodneybeede 原文链接。如若转载请注明出处。
分享到:微信
+10赞
收藏
sinensis
分享到:微信

发表评论

内容需知
  • 投稿须知
  • 转载须知
  • 官网QQ群8:819797106
  • 官网QQ群3:830462644(已满)
  • 官网QQ群2:814450983(已满)
  • 官网QQ群1:702511263(已满)
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 360网络攻防实验室 安全客 All Rights Reserved 京ICP备08010314号-66