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