<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/tips/2839

                    一個短的域名一直都是很多人所推崇的。因為對于大部分人來說,域名越短就會越好記憶。但是,還存在一部分人,他們不在乎域名是否好記,但是他們巴不得自己的域名只有三位,兩位甚至是沒有長度。他們,就是XSSer。

                    0x00 男人為什么要比短


                    正常的男人都喜歡比誰長,而狂熱的XSSer都喜歡比誰短。因為在真實的世界里,我們往往都會遇見字符長度限制。其中的部分問題,是可以通過Short Talk Of XSS中提到的方法進行解決的。但還有一部分極端的場景,是沒有辦法靠那些硬技術去解決的。比如,我的好友@/fd最近出的prompt.ml這個XSS系列挑戰當中就有這樣的一道題:

                    function escape(input) {
                        // make sure the script belongs to own site
                        // sample script: http://prompt.ml/js/test.js
                        if (/^(?:https?:)?\/\/prompt\.ml\//i.test(decodeURIComponent(input))) {
                            var script = document.createElement('script');
                            script.src = input;
                            return script.outerHTML;
                        } else {
                            return 'Invalid resource.';
                        }
                    }
                    

                    由于挑戰還沒有結束,所以在這篇文章中我們會避免一些可能會透露答案的信息。但是,可以確定的是我們是沒有辦法從src跳出來的。也就是說,故事會圍繞怎么在這個場景下調用遠程JS文件這個話題進行下去。所以,那些Short Talk Of XSS當中給出的解決方案,對于這種場景來說是無能為力的。我們需要關注的是如何讓自己的域名變短。

                    0×01 短域名之初體驗


                    一個即簡單又直接的方法就是買。通常三位的域名,基本上都是XSSer人手一個。比如,我在不久前就買了x55.me.看上去很丑,但是起碼算總長度的話,它還是6位的。有了一個短的域名不但能幫助你繞過一些長度限制,還可以讓你在與大牛同臺競技時,不會輸在非技術性的細節上。

                    既然靠錢可以解決,那我們為什么不買兩位的呢?問題是兩位域名價格相對較高而且很難能找到沒有被注冊。

                    enter image description here

                    而且作為有Hack精神的群體,我們更希望用技術來解決問題。所以讓我們先回到購買3位域名的問題。有沒有辦法不花錢就弄到和三位域名一樣效果的URL呢?答案是,有的。這里和大家分享一個生成短網址的網站:

                    http://xn--hqd.ws/
                    

                    enter image description here

                    借助這個網站,就可以讓我們擁有一個和xxx.xx一樣長度的域名來調用遠程JS了。^_^

                    得到生成的鏈接:

                    enter image description here

                    but,wait!那個看上去不怎么可愛的韓文字符長度真的是1么?

                    讓我們打開瀏覽器驗證一下:

                    enter image description here

                    看上去Javascript確實認為”?”的長度為1.但,如果驗證長度的是Javascript還需要整這么麻煩?直接抓包改包,不就過去了么?是的,所以讓我們在PHP里再做一下驗證。php當中判斷字符串長度的函數有兩個,分別是strlen和mb_strlen。后者,與前者最大的不同就是就是可以在參數中定義字符集。我們來寫一個簡單的腳本:

                    <?php
                    echo 'strlen is:'.strlen($_GET["str"]).'<br>';
                    echo ' mb_strlen is:'.mb_strlen($_GET["str"]).'<br>';
                    echo 'utf-8 mb_strlen is:'.mb_strlen($_GET["str"], 'utf-8').'<br>';
                    echo 'gbk mb_strlen is:'.mb_strlen($_GET["str"], 'gbk').'<br>';
                    echo 'gb2312 mb_strlen is:'.mb_strlen($_GET["str"], 'gb2312').'<br>';
                    echo 'gb18030 mb_strlen is:'.mb_strlen($_GET["str"], 'gb18030').'<br>';
                    echo 'big5 mb_strlen is:'.mb_strlen($_GET["str"], 'big5').'<br>';
                    ?>
                    

                    通過腳本來觀察一下,不同函數和字符集設定的情況下”?”長度分別會是多少:

                    enter image description here

                    可以看到當我們使用更為規范的mb_strlen并將字符集設定為比較常見的utf-8和gb18030時,該字符長度只有1.也就是說,在面對懂得規范輸寫的碼農時,這種方法是成立的。我們并沒有花一分錢就得到了一個和三位域名在長度上等效的URL。awesome! PS:由于mb_strlen在字符集為utf-8的情況下,長度結果和控制臺是一樣的,所以下面都使用控制臺截圖代替。

                    enter image description here

                    但是還不夠短,因為后面還有路徑。既然韓國人的玩意兒字符長度可以是1,那中文可以么?答案自然是可以的。我們只需要購買一個后綴為兩位的中文域名(如果你看明白了,就該懂其實中文,韓文什么的一點都不重要)。而且已經有人這么去做了。比如我們的小伙伴,0x_Jin已經入坑。

                    http://靖.pw

                    enter image description here

                    0×02 Unicode黑魔法


                    回顧一下,我們從收費的xxx.xx進化到了免費的x.xx/x,再進一步進化到了x.xx。我們已經將域名縮短到了傳說中的4位。還能再短么?如果不能就真的沒有必要寫這個文章了。在這里,[email protected]

                    http://靖.?

                    enter image description here

                    看上去pw有些奇怪?沒錯,因為這并不是p和w,而是unicode字符?(U+33BA)。這個也能訪問?點一下鏈接不就知道嘍。這是個即神奇但又不陌生的現象。為什么這么說呢,因為我們經常會碰到這樣的情況。當我們在忘記切換輸入法,拿著中文輸入法就在URL敲入:

                    http://www。baidu。com
                    

                    并按下回車時,會發現還是會正常跳入www.baidu.com,這個問題其實就已經證明了在hostname中,這種事情是有在發生的。但需要尊重的是,我們誰都沒有想過可以借助這種現象來縮短我們的域名長度。所以技術一直都在于創新度而不在于難[email protected]到這里,我們的域名已經進化到x.x也就是三位的長度了。但是,我們不可能停留在pw上面,[email protected]/fd寫的一個hostname的fuzzer:

                    enter image description here

                    然后我們得到了一些非常有趣的結果。由于內容比較多在這里只顯示部分結果。首先是一些可以作為域名后綴的unicode字符:

                    ? : dz     //valid domain ext
                    ? : rs     //valid domain ext
                    № : no     //valid domain ext
                    ? : sm     //valid domain ext
                    ℡ : tel    //valid domain ext
                    ? : tm     //valid domain ext
                    ? : na    // valid domain ext
                    U+3377 : dm   //valid domain ext
                    ? : ma  // valid domain ext
                    ? : nf  //valid domain ext
                    ? : ml  //valid domain ext
                    ? : fm  //valid domain ext
                    ㎝ : cm  //valid domain ext
                    ? : ps  //valid domain ext
                    ? : ms  //valid domain ext
                    ? : pw  //valid domain ext
                    ? : mw  //valid domain ext
                    ㏄ : cc  //valid domain ext
                    ? : cd  //valid domain ext
                    ? : gy  //valid domain ext
                    ? : in  //valid domain ext
                    ? : ph //valid domain ext
                    ? : pr  //valid domain ext
                    ? : sr  //valid domain ext
                    ? : fi  //valid domain ext
                    ? : st //valid domain ext
                    ? : st //valid domain ext
                    

                    這樣一來,我們能夠買的就不單是pw結尾的域名了。不過需要說一下的是,在我們現在的比價結果中,pw是最便宜的。一個漢字.pw的域名在XX互聯只需要18元就能拿下了。讓我們繼續來看其它的一些有趣的結果。這次,讓我們繼續回到免費這個話題上面。

                    Ⅷ : viii ? : kcal 可以看到在這次的結果中。我們列出來了兩個可以用一個unicode字符代替4個字符的結果。然而.ml結尾的域名,是可以免費注冊到長度大于等于4的域名的。所以,我們的小伙伴就搶占先機,拿下了:

                    enter image description here

                    Ⅷ.? 和 ?.? 4 這樣,兩個免費的3位域名(總長度)就到手了。但是三位還是有點長。我們能做到2位么?讓我們再來看看另一部分的fuzz結果:

                    ⒈ : 1.   //use one unicode char instead of 2 chars and include dot
                    ⒉ : 2.   //use one unicode char instead of 2 chars and include dot
                    ⒊ : 3.   //use one unicode char instead of 2 chars and include dot
                    ⒋ : 4.   //use one unicode char instead of 2 chars and include dot
                    ⒌ : 5.   //use one unicode char instead of 2 chars and include dot
                    ⒍ : 6.   //use one unicode char instead of 2 chars and include dot
                    ⒎ : 7.   //use one unicode char instead of 2 chars and include dot
                    ⒏ : 8.   //use one unicode char instead of 2 chars and include dot
                    ⒐ : 9.   //use one unicode char instead of 2 chars and include dot
                    ⒑ : 10.   //use one unicode char instead of 3 chars and include dot
                    ⒒ : 11.   //use one unicode char instead of 3 chars and include dot
                    ⒓ : 12.   //use one unicode char instead of 3 chars and include dot
                    ⒔ : 13.   //use one unicode char instead of 3 chars and include dot
                    ⒕ : 14.   //use one unicode char instead of 3 chars and include dot
                    ⒖ : 15.   //use one unicode char instead of 3 chars and include dot
                    ⒗ : 16.   //use one unicode char instead of 3 chars and include dot
                    ⒘ : 17.   //use one unicode char instead of 3 chars and include dot
                    ⒙ : 18.   //use one unicode char instead of 3 chars and include dot
                    ⒚ : 19.   //use one unicode char instead of 3 chars and include dot
                    ⒛ : 20.   //use one unicode char instead of 3 chars and include dot
                    ? : p.m. //include dot
                    ? : a.m. //include dot
                    ? : co. //valid domain ext and also include dot
                    
                    這部分結果,非常的有趣。因為這些unicode字符最后會被解釋為帶”.”的字符。也就是說,如果我們購買了20.xx,然而這個xx又正好是可以用一個unicode字符可以代替的后綴的話,我們的長度就會變成?2位!當然,我們已經這么去做了。這是我們的戰利品:
                    
                    http://⒛?
                    

                    PS:當然這不是免費的。如果你有辦法注冊2位的免費域名也希望你能告訴我

                    enter image description here

                    不過機智的你,可能會發現在webkit下面當你點擊上面的鏈接時,會跳轉到about:blank。也就是說這種使用帶dot的unicode字符的方法在webkit下面是不適用的。那這樣一來,如果使用20.?的話,長度不就又變成3+1了么?我們還有別的輔助:

                    ⑩ : 10   //use one unicode char instead of 2 chars
                    ? : 11   //use one unicode char instead of 2 chars
                    ? : 12   //use one unicode char instead of 2 chars
                    ? : 13   //use one unicode char instead of 2 chars
                    ? : 14   //use one unicode char instead of 2 chars
                    ? : 15   //use one unicode char instead of 2 chars
                    ? : 16   //use one unicode char instead of 2 chars
                    ? : 17   //use one unicode char instead of 2 chars
                    ? : 18   //use one unicode char instead of 2 chars
                    ? : 19   //use one unicode char instead of 2 chars
                    ? : 20   //use one unicode char instead of 2 chars
                    

                    原來20也是可以通過單個字符來代替的。這樣一來,我們就可以通過靈活的切換游走在2位和3位之間了。

                    http://?.?  //兼容所有瀏覽器
                    http://⒛?  //兼容Firefox和IE
                    

                    enter image description here

                    這真是非常激動人心的。在將域名長度縮短到了兩位之后,讓我們再來看看另外一部分的結果:

                    ? : a/c    // path
                    ? : a/s    // path
                    ℅ : c/o    // path
                    ? : c/u    // path
                    

                    在這部分結果當中,發現有些unicode字符最終會被解釋稱 字符/字符。此外,我們之前提到的會帶”.”的結果作為二級域名提供給用戶,也將會是一個很不錯的選擇。比如:

                    http://⒛⒛?  //兼容IE和FF
                    

                    enter image description here

                    0×03 寫在最后


                    這就是,我們在這些日子里不停的fuzzing,思考,調查所得到的結果。

                    x55.me(6位)->20.rs(5位)->靖.pw(4位)->?.?(3位)->⒛?(2位)->? 
                    

                    我們討論了很多。討論了如果在這些知識基礎上開放一個XSS平臺會如何,是否會被山寨?我覺得山寨是肯定會有的。因為trick都已經放出來了,所以對于效仿者來說只需要照著用就可以了。但是,好的技術支持和功能模塊也許真的不是ctrl+c就能帶走的。所以我相信我們會做出來一個不會被復制的平臺。

                    最后,讓我們再次以長度的話題結尾。那么,1位是可能的么?也許對于土豪來說買個tld就是可能的。

                    http://ai
                    

                    你需要做的就是買一個可以用單個unicode字符代替的tld。

                    Thanks for your time.

                      <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>

                                      这里只有精品视频