利用Googleplex.com的盲XSS访问谷歌内网
众所周知,谷歌是一家非常庞大的科技公司,它依赖于数千家供应商来维持其运营。为了跟踪和支付这些供应商,谷歌提供了一个公共在线工具,供应商可以通过它将他们的发票上传到谷歌。
这就是被称为Google Invoice Submission Portal的谷歌票据提交系统,你可以在gist-uploadmyinvoice.appspot.com上找到。
你首先可能注意到的是网站被托管在appspot.com域上,该域多用于托管Google App Engine项目。
Google经常使用它来构建他们的一些网站,并最终将生产版本转移到google.com或其他某些域上。
在当前这种情况下,他们很可能忘记将appspot.com上托管的Invoice Upload网站发布到google.com上了。
上传发票
首先,它要求我们输入是采购订单编号。输入的内容并不重要,只需键入随机数并单击“搜索”按钮即可。
然后,是选择与发票相关的组织。这决定了处理发票的国家/地区。同样,我们只需随便选择一个并单击“提交”就行。
现在,我们可以看到一个文字表格要求供应商输入电子邮件信件、发票编号、日期、档案类型,然后以PDF格式上传实际发票。
漏洞发现
我尝试使用了各种XSS payload来填充这些文本字段,希望它们的发票仪表板中的某个位置没有正确地对输入进行转义,这会触发盲XSS并会向我发送通知。但实际情况并非我想的那么简单。我没有收到任何的内容,因此这说明它正确处理了文本字段。
除文本输入外,输入还可选择PDF文件。但其配置只允许选择上传PDF格式的文件。
但由于这只是一个前端的验证,因此它不会阻止我们在发送上传POST请求时更改文件的类型。
我们只需选择一个任意的PDF文件,就会触发上传请求。我们可以使用Web代理拦截请求,并将文件名和内容从.pdf更改为.html。
首先,我们将filename属性更改为test.html,将Content-Type更改为text/html,将body更改为XSS payload。
在payload中,我将使用一个<script>标记,其中src指向我域上的端点,每次加载时都会向我发送一封电子邮件。我当前使用的是ezXSS来记录这些盲XSS请求。
现在,HTML文件已附加到表单,我们可以单击Submit Invoices按钮发送表单。
执行盲 XSS
几天后,我收到了一条通知,告知我googleplex.com域上已执行了盲XSS。
Google使用googleplex.com托管内部网站和应用。如果你尝试访问该域,你将被重定向到Google Corp登录页面(也被称为MOMA登录页面)- 这需要身份验证(有效的google.com帐户)。这意味着只有Google员工才能访问它。
页面的DOM与替代PDF文件的XSS payload匹配。我们可以看到该URL用于显示PDF文件。但由于上传文件的Content-Type已从application/pdf被更改为了text/html,因此它显示的是XSS payload而不是PDF文件。
影响
在googleplex.com子域上执行自定义JavaScript代码,攻击者可以访问Google的发票以及其他一些敏感信息。
由于Google员工使用其公司帐户登录,因此应该可以代表他们访问其他内部网站。
更新:对于访问其他内部网站这里做个更正。我收到了来自Google安全小组的更多信息:
访问单个googleplex.com应用不会让你访问到任何其他应用
googleplex.com应用程序,它们彼此独立
并且凭据和cookie无法被盗或用于其他网站。
这意味着攻击者仍然可以访问处理发票的子域,但由于CORS,而无法访问googleplex.com上的其他应用程序。
漏洞修复
我已向Google发送了有关此漏洞的详细信息。四天后我收到了报告已被接受的更新。
大约一个月后,我确认它已被修复。
虽然在修复之后XSS仍然存在,但它不是在googleplex.com上,而是在storage.googleapis.com上 – 它充当沙箱域并且也用于存储上传的用户(也像googleusercontent.com一样) 内容。
XSS现位于沙箱域中,XSS不会对用户造成任何安全风险。
时间线
2019 02.21:报告了漏洞
2019 02.22:优先级被更改为P2
2019 02.22:添加了更多信息
2019 02.25:接受并将优先级改为P1
2019 03.06:发放奖励
2019 03.26:实施修复
2019 04.11:问题被标记为已修复