短域名進化史

mramydnei · 2014/08/20 10:52php

一個短的域名一直都是不少人所推崇的。由於對於大部分人來講,域名越短就會越好記憶。可是,還存在一部分人,他們不在意域名是否好記,可是他們恨不得本身的域名只有三位,兩位甚至是沒有長度。他們,就是XSSer。web

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當中給出的解決方案,對於這種場景來講是無能爲力的。咱們須要關注的是如何讓本身的域名變短。dom

0×01 短域名之初體驗


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

既然靠錢能夠解決,那咱們爲何不買兩位的呢?問題是兩位域名價格相對較高並且很難能找到沒有被註冊。網站

enter image description here

並且做爲有Hack精神的羣體,咱們更但願用技術來解決問題。因此讓咱們先回到購買3位域名的問題。有沒有辦法不花錢就弄到和三位域名同樣效果的URL呢?答案是,有的。這裏和你們分享一個生成短網址的網站:spa

http://xn--hqd.ws/
複製代碼

enter image description here

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

獲得生成的連接:code

enter image description here

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

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

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 : 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 : fi  //valid domain ext
ſt : st //valid domain ext
st : 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.

相關文章
相關標籤/搜索