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