谷歌有一个项目信任许多人或许都没听过,那便是谷歌危机地图(Google Crisis Map)。
该项目旨在协助人们能够快速的查找和运用一些要害的应急信息(来历)。
尽管它现在仍在运用,但它好像运用的人并不多。
由于这是一个较老的项目(创立于2012年)且很长一段时间没有更新,因而能够说这是一个查找缝隙的绝佳方针。
它被保管在google.org域,该域的严峻程度虽不如google.com(针对客户端缝隙),但它依然是Google所具有的域名。
登录
假如你翻开项目的主页(google.org/crisi *** ap),你将被重定向到默许地图“气候和事情”。这对咱们来说含义不大,由于咱们仅有能做的便是查看地图。
这里有一种能够办理和创立新地图的办法。假如咱们在网址结尾添加.maps后缀,如:google.org/crisi *** ap/.maps
翻开此页面后,你需求运用自己的Google帐户登录才干持续。现在,你应该能够看到一个带有地图列表的仪表板。每个帐户都有三个默许地图。
出于某种原因,假如你在自己的域上发布其间的一个地图,则所有人都能在仪表板的“已发布地图”字段下看到该地图。
创立地图
假如单击赤色的“Create Map”按钮,你会看到一条音讯显现,gmail.com域不能用于创立新地图。
这意味着咱们需求运用包括咱们自定义域的电子邮件进行登录。咱们能够经过运用GSuite帐户,或运用gmail.com以外域的电子邮件登录来履行该操作。之后,咱们就能够创立一个新地图了。
单击“Continue”按钮后,咱们将被重定向到咱们能够修正新创立地图的页面。
查找 XSS
首要,咱们将向地图添加一个新图层。
将会弹出用于创立新图层的弹框。
输入恣意内容作为“Title”。
现在,假如咱们在“Source URL”字段中输入javascript:alert(document.domain),它将显现一个过错:
Invalid URL – please include a protocol (e.g. http:// or https://)
这意味着它会在答应你保存新图层之前查看URL是否有用。验证URL的反混杂javascript代码如下所示:
if (url && !url.toLowerCase().match("^s*(http://|https://|docs://|$)")) {
showError("Invalid URL - please include a protocol (e.g. http:// or https://)");
}
但这只是在将实践保存恳求发送到后端之前的客户端验证。
修正恳求
咱们能够运用像Fiddler或Burp Suite这样的Web调试署理,来修正恳求并发送修正后的版别。
首要,咱们需求将“Source URL”更改为有用的URL,例如https://example.com。
咱们单击“OK”按钮并单击“Save”以发送保存恳求。然后咱们将修正恳求。恳求如下:
POST https://google.org/crisi *** ap/.api/maps/1234
{
"id": "1234",
"title": "Untitled map",
"base_map_type": "GOOGLE_ROADMAP",
"layers": [{
"id": "1",
"title": "Test layer",
"visibility": "DEFAULT_ON",
"type": "KML",
"source": {
"kml": {
"url": "https://example.com"
}
}
}]
}
咱们将用javascript:alert(document.domain)替换https://example.com,并发送修正后的恳求。
测验 XSS
现在恳求已发送并保存,因而让咱们从头加载页面。
翻开“Layers”,然后单击“Download KML”。
点击下载链接后,XSS将被触发,并弹出带有域的正告框!
怎么修正
为什么会这样?URL验证仅发作在前端而不是后端。这意味着能够经过验证后端的URL来处理这个问题。
但谷歌并没有这么做。而是在URL保存到后端时查看URL,显现在DOM中前URL已被验证。
因而,假如URL无效,则不会将其用作链接,并将运用一个无含义的值,如:about:invalid替代。
a href="about:invalid#zClosurez">Download KMLa>
影响
好的,现在咱们有一个包括payload指向javascript: URI的链接。该链接坐落用于办理地图的页面上。你有必要登录才干获取该页面的拜访权限。
明显这是self-XSS,由于只要咱们能够履行该XSS。
现在,咱们要做的便是怎么将self-XSS变成真实的有影响的XSS?
添加严峻性
咱们创立的每张地图都能够发布供公众查看。假如你经过包括域example.com的电子邮件登录,则能够将地图发布到:http://google.org/crisi *** ap/example.com/test。
这样,任何人都能够翻开此URL并查看咱们创立的地图。想要使XSS正常作业,用户需求翻开或导航到此页面,翻开“Layers”并单击“Download KML”链接。
这意味着它已不再是self-XSS,但缺陷是这需求用户操作的过程过多。
点击绑架
假如咱们查看HTTP呼应头,能够看到google.org并未发送X-Frame-Options标头。
X-Frame-Options HTTP 呼应头是用来给浏览器指示答应一个页面可否在e>, , 或许 中展示的符号。站点能够经过保证网站没有被嵌入到他人的站点里边,然后防止clickjacking进犯。
google.org上短少该标头,则意味着咱们能够将已发布的地图嵌入到咱们自己网站上的iframe中。
iframe src="https://google.org/crisi *** ap/example.com/test">iframe>
如下所示。用户现在乃至不需求脱离咱们的站点。但仍需求用户点击iframe中的两个方位(“layers”>“download kml”)。
iframe在咱们的网站上被加载 – 这意味着咱们能够运用CSS和JavaScript来操作它。
我想到的榜首件事,便是将黑色的DIV放置在咱们期望用户点击的方位。然后检测单击事情并将DIV移动到第二个点。
这很有用,但仍需求用户点击两个不同的方位。
但有个更好的方案便是肯定定位iframe,这样用户就不用移动光标了。
以下演示咱们将iframe缩放了50倍,并将其移动了到咱们期望用户单击的方位。首要转到“Layers”选项卡。点击后,它会在带有payload的链路上移动。
你能够经过鄙人面的iframe中单击两次来测验该示例:
总结
不要信任用户输入。在运用它之前一定要验证/转义它,乃至在保存它之前更好查看它是否有用。
经过正确设置X-Frame-Options标头,不答应其他域将你的网站嵌入iframe。
在查找缝隙时,请测验找到该缝隙或许的更高严峻性。
例如,假如你找到一个XSS,请测验经过查找过错装备的Cookie或端点接收帐户。
寻觅依然合适bug奖赏方案规模的旧项目。我在谷歌危机地图上发现了别的两个缝隙,后续我也会发布有关它们的文章。