<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/892

            0x00 背景


            隨著水瓶月的到來,在祖國繁榮昌盛的今天,web系統的瀏覽器端也越來越重,很多的功能邏輯都放在了js中,前端的漏洞也越來越多。 我今天就說說location.href跳轉的一些問題。

            前端跳轉常見的代碼形式是:

            #!javascript
            location.;
            

            在前端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.
            

            時,瀏覽器會把后面的識別成一個標準的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&#x3A;alert(1)
            

            也就是

            #!javascript
            location.href = "javascript&#x3A;alert(1)"
            

            你會驚奇的發現彈了,'&#x3A;'是':'的html編碼,至于為什么會這樣我不知道,我的是ie11,其他版本沒測

            0x05 解決方案


            對于不允許跳轉到第三方的,可以使用location.pathname來跳轉,用這個跳轉絕對靠譜。

            有句成語”path就不是共產黨員“就是修飾這個屬性的,既然不是共產黨員,說明path是靠譜的。

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

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线