作者:
呆子不開口
·
2014/01/23 10:57
0x00 背景
隨著水瓶月的到來,在祖國繁榮昌盛的今天,web系統的瀏覽器端也越來越重,很多的功能邏輯都放在了js中,前端的漏洞也越來越多。 我今天就說說location.href跳轉的一些問題。
前端跳轉常見的程式碼形式是:
#!javascript
location.href = 'http://www.baidu.com';
在前端js中有可能是這樣:
#!javascript
var hash = location.hash;
if(hash)
{
var url = hash.substring(1);
location.href = url;
}
0x01 常見的跳轉漏洞
什麼是跳轉漏洞?突破了系統預期的跳轉,就是跳轉漏洞。大多數系統的預期是跳轉到當前域url的http訪問。
以上面的程式碼為例,hash值為攻擊者可控,常見的漏洞形式可以為:
http://yigezangpao.com/test.html#http://jiajiba.taobao.com
這個地址會利用信任關係跳轉到釣魚網站
http://yigezangpao.com/test.html#javascript:alert(document.cookie)
這個會跳轉到瀏覽器端的javascript協議而執行js,成了一個反射的xss,而且瀏覽器端的xssfilter對它無效
0x02 跳轉漏洞的危害
可能的危害場景如下:
受害使用者被騙點選進入了釣魚站,可導致家破人亡妻離子散被網友拉黑……
在一些sns網站中,點選第三方網站時,可能會有安全提示,惡意網址則可利用信任域的身份,繞過了檢查。
很多app帶有二維碼掃描功能,對本域或白名單域會不做提示,直接跳轉訪問。
當你掃描一個二維碼的時候,你可能已經點選了一個惡意或含有某種攻擊程式碼的網頁javascript為協議的反射型xss。
一般的社群發表連結時,不會自動識別瀏覽器的偽協議,不會形成可點選的連結,但是利用跳轉漏洞,則可以欺騙目標使用者開啟某個瀏覽器偽協議……
0x03 目前的防護的一些問題
我見到的常見的有防護有:
給變數前加"/"或者只有"/"開頭的才跳轉
替換變數中的":"
替換"http://"
匹配域名白名單
……
這幾類或多或少有些問題,如下:
對於在變數前加/的,或者/開頭才跳轉的,他們預期的是控制在本域下。但當
#!javascript
location.href = "//diaoyuwangzhan.com"
時,瀏覽器會把後面的識別成一個標準的url來跳轉,而不是一個絕對路徑。
對於允許第三方跳轉的,匹配域名白名單的,一定要寫好正則的邏輯嚴格匹配url的標準格式,否則可能會被
http://yigezangpao.com.jiajiba.taobao.com
http:[email protected]
http://jiajiba.taobao.com/yigezangpao.com
等繞過
對於替換”:“的防護:
twitter曾經犯過這樣的錯,twitter的程式設計師是這樣改的:
#!javascript
var c = location.href.split("#!")[1];
if (c) {
window.location = c.replace(":", "");
} else {
return true;
}
結果又被如下連結幹:
http://twitter.com/#!javascript::alert(document.domain);
比第一次多了個:
因為replace()函式的第一個引數,按照規範中的方式,是要用正則寫的。如果第一個引數是一個字串,javascript預設只會替換掉他找到的第一個字元
0x04 比楊冪還神奇
對於上面的替換":"的方案,如果完全替換,是不是就沒有問題了呢?
如果你曾覺得你的女友不可理喻,那麼當我告訴你有一個東西的不可理喻程度已經達到你女友的50%時,你一定會驚呼,”天吶,竟然還有這麼變態的東西!!!“ 不錯,你猜的非常對,這個不可理喻的東西就是ie瀏覽器
如前文的例子,如果對方已經完全替換":",你試試在ie中訪問如下連結
http://yigezangpao.com/test.html#javascript:alert(1)
也就是
#!javascript
location.href = "javascript:alert(1)"
你會驚奇的發現彈了,':'是':'
的html編碼,至於為什麼會這樣我不知道,我的是ie11,其他版本沒測
0x05 解決方案
對於不允許跳轉到第三方的,可以使用location.pathname來跳轉,用這個跳轉絕對靠譜。
有句成語”path就不是共產黨員“就是修飾這個屬性的,既然不是共產黨員,說明path是靠譜的。
對於允許跳轉到第三方的,做好白名單的檢查規則。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!