Bug Bounty:通过Google Voice扩展程序在accounts.google.com上触发基于DOM的XSS。
字数 1560 2025-08-25 22:59:02

基于DOM的XSS漏洞分析:Google Voice扩展程序在accounts.google.com上的漏洞利用

漏洞概述

本教学文档详细分析了一个通过Google Voice扩展程序在accounts.google.com上触发的基于DOM的XSS漏洞。该漏洞允许攻击者在特定条件下执行任意JavaScript代码,影响范围涉及安装了Google Voice扩展程序的用户。

漏洞发现背景

该漏洞由安全研究人员偶然发现,其触发与Google Ads的customer ID和美国电话号码格式的相似性有关。当用户在Gmail中查看包含特定格式文本的收件箱时,漏洞可能被触发。

漏洞触发条件

  1. 必要条件:用户必须安装Google Voice扩展程序
  2. 攻击向量:收件箱中包含特定格式的文本消息,例如:'444-555-4455 '

技术原理分析

漏洞核心代码

漏洞存在于Google Voice扩展程序的contentscript.js文件中,具体是Wg()函数:

function Wg(a) {
    for (var b = /(^|\s)((\+1\d{10})|((\+1[ \.])?$?\d{3}$?[ \-\.\/]{1,3}\d{3}[ \-\.]{1,2}\d{4}))(\s|$)/m, 
         c = document.evaluate('.//text()[normalize-space(.) != ""]', a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null), 
         d = 0; d < c.snapshotLength; d++) {
        a = c.snapshotItem(d);
        var f = b.exec(a.textContent);
        if (f && f.length) {
            f = f[2];
            var g = "gc-number-" + Ug,
                h = '<span id="' + g + '" class="gc-cs-link"title="Call with Google Voice">' + f + "</span>",
                k;
            // ...后续代码省略...
        }
    }
}

漏洞触发流程

  1. 电话号码匹配

    • 使用正则表达式匹配美国电话号码格式:/(^|\s)((\+1\d{10})|((\+1[ \.])?$?\d{3}$?[ \-\.\/]{1,3}\d{3}[ \-\.]{1,2}\d{4}))(\s|$)/m
    • 通过document.evaluate遍历body元素中的所有文本节点
  2. DOM操作

    • 当找到匹配的电话号码时,创建一个包含电话号码的span元素
    • 使用innerHTMLinsertBefore将新创建的span元素插入DOM
  3. XSS触发点

    • 由于直接将匹配到的文本(包含电话号码和HTML标签)插入DOM,导致``这样的恶意代码被执行

安全防护机制及其绕过

  1. 标签名称检查

    if (k = a.parentNode && !(a.parentNode.nodeName in Og)) 
      k = a.parentNode.className,
      k = "string" === typeof k && k.match(/\S+/g) || [], 
      k = !Fa(k, "gc-cs-link");
    
    • Og包含不允许的标签:Script, Style, Head, Object, TEXTAREA, INPUT, SELECT和A
    • 检查父节点是否已有gc-cs-link类名
  2. googlevoice属性检查

    if (!document.evaluate('ancestor-or-self::*[@googlevoice = "nolinks"]', a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength)
    
    • 检查祖先节点是否有googlevoice="nolinks"属性

漏洞修复方案

  1. 根本原因

    • 直接在接收器(innerHTML, insertBefore)上执行包含用户输入的变量f
  2. 修复建议

    • 对电话号码进行严格验证,确保只包含数字和合法分隔符
    • 在插入DOM前对用户输入进行HTML实体编码
    • 使用textContent而非innerHTML来插入电话号码
    • 实现更严格的输入过滤机制

漏洞影响范围

  1. 受影响网站

    • accounts.google.com
    • facebook.com
  2. 影响后果

    • 在受害者浏览器中执行任意JavaScript代码
    • 可能导致会话劫持、敏感信息泄露等

漏洞奖励

该漏洞获得了Google漏洞奖励计划$3,133.7的奖金。

教学总结

  1. 关键学习点

    • DOM型XSS可能通过浏览器扩展程序引入
    • 即使有部分防护措施,不完整的输入处理仍可能导致漏洞
    • 正则表达式匹配后应对结果进行严格验证
  2. 防御建议

    • 对所有用户输入进行严格的验证和转义
    • 避免使用innerHTML插入用户可控内容
    • 浏览器扩展应实施严格的内容安全策略
    • 对DOM操作进行安全审计,特别是涉及用户输入的部分
  3. 测试方法

    • 在包含电话号码格式的文本中尝试插入HTML/JavaScript代码
    • 检查扩展程序对DOM的操作方式
    • 验证所有输入处理路径的安全性

参考资源

基于DOM的XSS漏洞分析:Google Voice扩展程序在accounts.google.com上的漏洞利用 漏洞概述 本教学文档详细分析了一个通过Google Voice扩展程序在accounts.google.com上触发的基于DOM的XSS漏洞。该漏洞允许攻击者在特定条件下执行任意JavaScript代码,影响范围涉及安装了Google Voice扩展程序的用户。 漏洞发现背景 该漏洞由安全研究人员偶然发现,其触发与Google Ads的customer ID和美国电话号码格式的相似性有关。当用户在Gmail中查看包含特定格式文本的收件箱时,漏洞可能被触发。 漏洞触发条件 必要条件 :用户必须安装Google Voice扩展程序 攻击向量 :收件箱中包含特定格式的文本消息,例如: '444-555-4455 ' 技术原理分析 漏洞核心代码 漏洞存在于Google Voice扩展程序的 contentscript.js 文件中,具体是 Wg() 函数: 漏洞触发流程 电话号码匹配 : 使用正则表达式匹配美国电话号码格式: /(^|\s)((\+1\d{10})|((\+1[ \.])?\(?\d{3}\)?[ \-\.\/]{1,3}\d{3}[ \-\.]{1,2}\d{4}))(\s|$)/m 通过 document.evaluate 遍历body元素中的所有文本节点 DOM操作 : 当找到匹配的电话号码时,创建一个包含电话号码的span元素 使用 innerHTML 或 insertBefore 将新创建的span元素插入DOM XSS触发点 : 由于直接将匹配到的文本(包含电话号码和HTML标签)插入DOM,导致 `` 这样的恶意代码被执行 安全防护机制及其绕过 标签名称检查 : Og 包含不允许的标签: Script, Style, Head, Object, TEXTAREA, INPUT, SELECT和A 检查父节点是否已有 gc-cs-link 类名 googlevoice属性检查 : 检查祖先节点是否有 googlevoice="nolinks" 属性 漏洞修复方案 根本原因 : 直接在接收器( innerHTML , insertBefore )上执行包含用户输入的变量 f 修复建议 : 对电话号码进行严格验证,确保只包含数字和合法分隔符 在插入DOM前对用户输入进行HTML实体编码 使用 textContent 而非 innerHTML 来插入电话号码 实现更严格的输入过滤机制 漏洞影响范围 受影响网站 : accounts.google.com facebook.com 影响后果 : 在受害者浏览器中执行任意JavaScript代码 可能导致会话劫持、敏感信息泄露等 漏洞奖励 该漏洞获得了Google漏洞奖励计划$3,133.7的奖金。 教学总结 关键学习点 : DOM型XSS可能通过浏览器扩展程序引入 即使有部分防护措施,不完整的输入处理仍可能导致漏洞 正则表达式匹配后应对结果进行严格验证 防御建议 : 对所有用户输入进行严格的验证和转义 避免使用 innerHTML 插入用户可控内容 浏览器扩展应实施严格的内容安全策略 对DOM操作进行安全审计,特别是涉及用户输入的部分 测试方法 : 在包含电话号码格式的文本中尝试插入HTML/JavaScript代码 检查扩展程序对DOM的操作方式 验证所有输入处理路径的安全性 参考资源 原文链接: http://www.missoumsai.com/google-accounts-xss.html Google漏洞奖励计划: https://bughunters.google.com/