<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

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

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

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频