<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址: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是靠譜的。

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

    97av