現(xiàn)在,許多主流的互聯(lián)網(wǎng)服務(wù)提供商都會(huì)在網(wǎng)頁(yè)的鏈接地址中加入target=”_blank”屬性,而這絕對(duì)是一種非常不安全的行為。不僅如此,target=”_blank”屬性還將會(huì)使廣大互聯(lián)網(wǎng)用戶暴露在釣魚(yú)攻擊的風(fēng)險(xiǎn)之下。
早在2014年,就已經(jīng)有很多安全研究專(zhuān)家表示,target=”_blank”屬性是非常不安全的一個(gè)屬性。而且當(dāng)初有些關(guān)于該屬性的安全報(bào)告為了引起人們的注意,還特地將標(biāo)題設(shè)置得非常醒目。我印象中最深的就是那篇標(biāo)題為《Target=”_blank”–有史以來(lái)最被人們低估的漏洞》的報(bào)告,感興趣的同學(xué)可以看一下這份報(bào)告[傳送門(mén)]。
漏洞實(shí)現(xiàn)機(jī)制
當(dāng)用戶點(diǎn)擊了某個(gè)網(wǎng)站中帶有target=”_blank”屬性的超鏈接后,瀏覽器會(huì)單獨(dú)新建一個(gè)標(biāo)簽頁(yè)來(lái)顯示該鏈接所指向的內(nèi)容。但是請(qǐng)注意,在這一瞬間,瀏覽器會(huì)允許新建的標(biāo)簽頁(yè)通過(guò)一個(gè)名為“window.opener”的瀏覽器API來(lái)與之前的網(wǎng)頁(yè)進(jìn)行短暫通信。
此時(shí),攻擊者就可以將惡意代碼嵌入在新打開(kāi)的網(wǎng)站中,然后檢測(cè)用戶是從哪一個(gè)網(wǎng)站跳轉(zhuǎn)過(guò)來(lái)的,最后再利用window.opener接口來(lái)迫使原始網(wǎng)頁(yè)打開(kāi)一個(gè)新的URL地址。
比如說(shuō),如果用戶點(diǎn)擊了Facebook網(wǎng)站中一個(gè)帶有target=”_blank”屬性的鏈接,那么攻擊者就可以利用一個(gè)偽造的Facebook頁(yè)面來(lái)替換原始的Facebook網(wǎng)頁(yè),然后要求用戶重新輸入用戶名和密碼。這樣一來(lái),攻擊者便成功獲取到了目標(biāo)用戶的憑證數(shù)據(jù)。
下方這張GIF動(dòng)態(tài)圖演示了攻擊的實(shí)現(xiàn)過(guò)程和效果:
影響范圍
可怕的是,Instagram、Facebook、以及Twitter等大型社交網(wǎng)站都會(huì)受到這種攻擊的影響。
在上述這三大社交網(wǎng)站中,只有Instagram徹底修復(fù)了這個(gè)問(wèn)題。而對(duì)于Twitter而言,只有當(dāng)用戶使用Safari瀏覽器來(lái)訪問(wèn)Twitter網(wǎng)站時(shí)才有可能出現(xiàn)這種問(wèn)題。但是谷歌卻早已公開(kāi)表示,他們并不關(guān)心這個(gè)問(wèn)題…
如何修復(fù)這個(gè)問(wèn)題呢?
這也就意味著,修復(fù)該問(wèn)題的重?fù)?dān)將落在網(wǎng)站管理員的身上了。實(shí)際上,修復(fù)該問(wèn)題最簡(jiǎn)單的方法就是在網(wǎng)站所有的鏈接中加入rel=”noopener”屬性。對(duì)于火狐瀏覽器而言,由于它并不完全支持該屬性,所以開(kāi)發(fā)人員應(yīng)該使用rel=”noopenernoreferrer”屬性作為代替。
請(qǐng)記住,當(dāng)你每次使用window.open()接口來(lái)打開(kāi)一個(gè)新的網(wǎng)頁(yè)窗口時(shí),你的安全性很有可能會(huì)受到這一API的影響,所以別忘了重置“opener”屬性。
var newWnd = window.open();
newWnd.opener = null;
我個(gè)人認(rèn)為T(mén)witter解決這一問(wèn)題的方法應(yīng)該是最有效的。Twitter的開(kāi)發(fā)人員使用了一個(gè)腳本來(lái)自動(dòng)向網(wǎng)站中的鏈接添加該屬性。而安全研究人員也表示,攻擊者之所以仍然能夠通過(guò)Safari瀏覽器來(lái)利用Twitter的這一漏洞,很有可能是因?yàn)樗麄兯玫哪_本中存在問(wèn)題。
* 參考來(lái)源:Softpedia,本文由Alpha_h4ck編譯,轉(zhuǎn)載請(qǐng)注明來(lái)自FreeBuf(Freebuf.COM)