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中查看包含特定格式文本的收件箱时,漏洞可能被触发。
漏洞触发条件
- 必要条件:用户必须安装Google Voice扩展程序
- 攻击向量:收件箱中包含特定格式的文本消息,例如:
'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;
// ...后续代码省略...
}
}
}
漏洞触发流程
-
电话号码匹配:
- 使用正则表达式匹配美国电话号码格式:
/(^|\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,导致``这样的恶意代码被执行
安全防护机制及其绕过
-
标签名称检查:
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类名
-
googlevoice属性检查:
if (!document.evaluate('ancestor-or-self::*[@googlevoice = "nolinks"]', a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength)- 检查祖先节点是否有
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的操作方式
- 验证所有输入处理路径的安全性