2016-10-31 15:00:12
来源:安全客 作者:sinensis
阅读:1121次
点赞(0)
收藏
翻译:sinensis
预估稿费:100RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
在2015年10月,我在在谷歌电子表单有关的API接口中发现了JSON + CSRF(跨站伪造请求)点击劫持漏洞。攻击者可以利用这个漏洞在未授权访问Google Drive文件的情况下,获取用户的电子表单信息。
漏洞影响
在网络上利用这个漏洞攻击的时候,攻击者需要绕过Google Drive电子表单共享设置的ACL策略。首先说明下,攻击者在未授权访问Google Drive文件的情况下(如下图所示),可以利用该漏洞绕过Google安全设置:
漏洞产生的根本原因
这不是第一个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 接口下线,使用新的接口来解决安全问题。这需要使用这些接口的开发者更新代码。漏洞攻击场景(众多利用中的一个)
公司的一个电子表格里面有机密信息。电子表格只共享给授权的公司职员。
一名职员离职之后,他的授权帐号被取消,同时被分享的文件里面密码/PIN也改变。
新的共享如下图所示,可以看到离职的员工权限已经被取消。
原力与你同在
现在被取消授权的员工非常想要获得电子表单的数据,他知道Mr.admin.assist@example.com喜欢经常去一个网站,而这个网站允许任何人使用HTML格式留言。这就是众所周知的水坑攻击,攻击者只需要等待。
下图是受害者访问的网站截屏
在完全不知道受害者(不管是谁是文档的拥有者)的情况下,攻击者就可以收到电子表格的数据。
下图是攻击者偷取到的数据(受害者完全看不到)
攻击者看到的数据如下:
这是如何成为可能的呢?
Google Drive的API接口在不需要OAuth token的情况下,允许其他网站跨域发起请求。这种情况下,只要用户登录Google Drive之后,其他任何网站就可以通过调用API接口获取用户的电子表格数据。
因为返回数据是JSON格式,所以可以利用javascript解析之后发送到攻击者的服务器。
简单的漏洞证明代码如下:
simpleCapture.php- 从受害者浏览器获取数据的脚本
google_drive_smuggle.html- 这个HTML代码用来偷取目标数据
下面是一个JSON劫持代码例子:vargoogle=newObject(); google.visualization=newObject(); google.visualization.Query=newObject(); 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将会失效。
最终的修复确认
我最终确认这个Bug在2016年9月15号被修复。最终章
在花费几个月和Google的联系之后,见证了问题修复并且电子表单又一次安全加固。曾经从Google得到回复是很困难的,但是我感觉相比施压披露出来,修复才是更好的选择。在影响较小的范围内完整修复,是一件繁琐的事情。由此我被Google加入到了他们的赏金榜单。你可以在这里找到我的资料
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://www.rodneybeede.com/Google_Spreadsheet_Vuln_-_CSRF_and_JSON_Hijacking_allows_data_theft.html