主页 > 网络知识 > 由Google Voice插件触发的DOM

由Google Voice插件触发的DOM

 

由Google Voice插件触发的DOM

 

本文讲述了作者在安装了Google Voice插件的环境中,通过Gmail接收邮件时偶尔发现的一个DOM XSS漏洞,经对Google Voice插件的源代码分析,最终找到了漏洞根源。漏洞获得了谷歌$3,133.7的奖励。

漏洞端倪

该全局性DOM XSS漏洞的发现也纯属偶然,当我构造了oneerror=alert(1)的XSS Payload进行发送测试,打开了Gmail邮箱收取Google Ads的信件时,突然在Gmail收件箱中跳出了以下弹窗:

 

由Google Voice插件触发的DOM

 

当时我的反应是,这是一个Google Ads规则触发的存在于Gmail中的存储型XSS,所以立马就想着上报,但仔细一分析,事情没这么简单。

漏洞分析

这里存在两方面的因素:我的系统中安装了Google Voice插件、XSS Payload-’444-555-4455 <img src=http://www.52bug.cn/hkjs/x onerror=alert(1)>’是显示在收件箱中的文本字段。

经过分析,我发现该XSS漏洞是由Google Voice插件引发的,在谷歌本身的用户相关网站accounts.google.com和其它第三方注册网站如facebook.com,都能有效触发并执行javascript代码。如下:

 

 

Y1qEs87.png

OJsMuco.png

于是乎,我把Google Voice的源代码提取出来进行了一番分析,果然在其中的文件contentscript.js中,存在一个方法函数Wg(),就是它导致了DOM XSS。该函数如下:

 

function Wg(a) {

 

    for (var b = /(^|s)((+1d{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 = '<spanhljs-string">'"title="Call with Google Voice">' + f + "</span>",

 

                k;

 

            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");

 

            if (k) try {

 

                if (!document.evaluate('ancestor-or-self::*[@googlevoice = "nolinks"]', a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null)

 

                    .snapshotLength) {

 

                    if (0 == a.parentNode.childElementCount) {

 

                        var w = a.parentNode.innerHTML,

 

                            y = w.replace(f, h);

 

                        a.parentNode.innerHTML = y

 

                    } else {

 

                        w = a.data;

 

                        y = w.replace(f, h);

 

                        var u = Qc("SPAN");

 

                        u.innerHTML = y;

 

                        h = u;

 

                        k = a;

 

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!