在谷歌財(cái)經(jīng)發(fā)現(xiàn)一個XSS漏洞,拿5千美元獎勵
我們在6月13日發(fā)了一篇資訊, 說“Google調(diào)整漏洞獎勵計(jì)劃,單個漏洞***獎勵7,500美元”。7月30日看到 Michele Spagnuolo 發(fā)的博文稱“他在 Google Finance 上發(fā)現(xiàn)并提交了一個 XSS 漏洞,谷歌安全團(tuán)隊(duì)確認(rèn)并修復(fù)了該漏洞。Michele 因此拿到了 5K 美元獎勵。” 以下是 Michele 博文的譯文。
這個問題出現(xiàn)在Google Finance中(google.com/finance)。它能欺騙Javascript的走勢圖應(yīng)用(源文件為/finance/f/sfe- opt.js),讓其載入一個托管在外部域上的文件,然后通過eval()方法將該文件內(nèi)容轉(zhuǎn)換成Javascript代碼并執(zhí)行。
這個過程不需要用戶交互,只要點(diǎn)擊一下URL就可以了。
復(fù)現(xiàn)步驟:
1)點(diǎn)擊該URL(目前已修復(fù)):
文件x.js包含下列驗(yàn)證代碼用來演示:
- alert(document.domain);
該文件必須通過https來托管。
2)遠(yuǎn)程Javascript被執(zhí)行。
工作原理
以下是 /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參數(shù),更確切的說是ntrssurl參數(shù)(用戶RSS源的地址)被獲取并進(jìn)行了連接。
- 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
- }
- };
第二段代碼負(fù)責(zé)在外部域中查詢新聞源以將內(nèi)容顯示在走勢圖中。
它生成一個回調(diào)函數(shù)名,以字串 “?_CALLBACK_”結(jié)尾。函數(shù)Wi對URL中的ntrssurl參數(shù)中的域名執(zhí)行xmlhttprequest操作。
然后,返回了一段簡單的Javascript代碼,并且通過eval()方法將其執(zhí)行。
觸發(fā)XSS漏洞的截圖
callback 請求截圖
有漏洞的代碼片段
這個安全隱患很快就被修復(fù)了,我因此得到了5000美元的獎勵。
非常感謝,Google安全小組!