調皮的location.href

wyzsk發表於2020-08-19
作者: 呆子不開口 · 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是靠譜的。

對於允許跳轉到第三方的,做好白名單的檢查規則。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章