短域名進化史
一個短的域名一直都是很多人所推崇的。因為對於大部分人來說,域名越短就會越好記憶。但是,還存在一部分人,他們不在乎域名是否好記,但是他們巴不得自己的域名只有三位,兩位甚至是沒有長度。他們,就是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位的。有了一個短的域名不但能幫助你繞過一些長度限制,還可以讓你在與大牛同臺競技時,不會輸在非技術性的細節上。
既然靠錢可以解決,那我們為什麼不買兩位的呢?問題是兩位域名價格相對較高而且很難能找到沒有被註冊。
而且作為有Hack精神的群體,我們更希望用技術來解決問題。所以讓我們先回到購買3位域名的問題。有沒有辦法不花錢就弄到和三位域名一樣效果的URL呢?答案是,有的。這裡和大家分享一個生成短網址的網站:
http://xn--hqd.ws/
藉助這個網站,就可以讓我們擁有一個和xxx.xx一樣長度的域名來呼叫遠端JS了。^_^
得到生成的連結:
but,wait!那個看上去不怎麼可愛的韓文字元長度真的是1麼?
讓我們開啟瀏覽器驗證一下:
看上去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>';
?>
透過指令碼來觀察一下,不同函式和字符集設定的情況下”ᄒ”長度分別會是多少:
可以看到當我們使用更為規範的mb_strlen並將字符集設定為比較常見的utf-8和gb18030時,該字元長度只有1.也就是說,在面對懂得規範輸寫的碼農時,這種方法是成立的。我們並沒有花一分錢就得到了一個和三位域名在長度上等效的URL。awesome! PS:由於mb_strlen在字符集為utf-8的情況下,長度結果和控制檯是一樣的,所以下面都使用控制檯截圖代替。
但是還不夠短,因為後面還有路徑。既然韓國人的玩意兒字元長度可以是1,那中文可以麼?答案自然是可以的。我們只需要購買一個字尾為兩位的中文域名(如果你看明白了,就該懂其實中文,韓文什麼的一點都不重要)。而且已經有人這麼去做了。比如我們的小夥伴,0x_Jin已經入坑。
http://靖.pw
0×02 Unicode黑魔法
回顧一下,我們從收費的xxx.xx進化到了免費的x.xx/x,再進一步進化到了x.xx。我們已經將域名縮短到了傳說中的4位。還能再短麼?如果不能就真的沒有必要寫這個文章了。在這裡,[email protected]
http://靖.㎺
看上去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:
然後我們得到了一些非常有趣的結果。由於內容比較多在這裡只顯示部分結果。首先是一些可以作為域名字尾的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的域名的。所以,我們的小夥伴就搶佔先機,拿下了:
Ⅷ.㎖ 和 ㎉.㎖ 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位的免費域名也希望你能告訴我
不過機智的你,可能會發現在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
這真是非常激動人心的。在將域名長度縮短到了兩位之後,讓我們再來看看另外一部分的結果:
℀ : a/c // path
℁ : a/s // path
℅ : c/o // path
℆ : c/u // path
在這部分結果當中,發現有些unicode字元最終會被解釋稱 字元/字元。此外,我們之前提到的會帶”.”的結果作為二級域名提供給使用者,也將會是一個很不錯的選擇。比如:
http://⒛⒛₨ //相容IE和FF
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.
相關文章
- CNN進化史2019-10-11CNN
- 國內MMORPG進化史2021-03-12
- 硬碟介面進化簡史2018-10-22硬碟
- 現代CSS進化史2018-04-09CSS
- 密碼管理器進化史2020-03-26密碼
- cat 命令的原始碼進化史2019-01-03原始碼
- 支付渠道路由系統進化史2019-05-11路由
- 遊戲中最邊緣化的物件——梯子進化史2019-12-12遊戲物件
- 密碼管理器進化史(1/4)2020-03-03密碼
- 密碼管理器進化史(2/4)2020-03-03密碼
- 密碼管理器進化史(3/4)2020-03-03密碼
- 密碼管理器進化史(4/4)2020-03-03密碼
- 你應該知道的快取進化史2018-08-16快取
- 四圖盤點Xbox主機效能進化史2020-02-25
- 遊戲中“血條”設計的進化史2019-12-18遊戲
- FE.ES-非同步程式設計進化史2018-12-15非同步程式設計
- 從紅白機到手遊,遊戲BGM進化史2020-07-13遊戲
- 影像分類丨Inception家族進化史「GoogleNet、Inception、Xception」2019-05-24Go
- 微信域名連結防封短連結是如何生成的,微信域名防封短連結程式碼實現示例2020-02-18
- 軟體自動化測試工具的歷史演進2020-06-23
- 燈塔之上:vivo X70背後的影像進化史2021-09-11
- 付費模式“進化史”——中國遊戲的“氪金”之路2019-10-12模式遊戲
- 【乾貨分享】大話團隊的GIT分支策略進化史2019-06-04Git
- 從 RAID 到 Hadoop Hdfs 『大資料儲存的進化史』2018-12-18AIHadoop大資料
- 什麼是域名解析?如何進行域名解析設定?2022-11-07
- 一個故事看懂計算機作業系統的進化史2021-05-10計算機作業系統
- 動作與射擊漫談:格鬥遊戲進化簡史2019-11-04遊戲
- 探索Redis設計與實現15:Redis分散式鎖進化史2019-11-17Redis分散式
- 詳解百度ERNIE進化史及典型應用場景2020-04-28
- CES 2019 前夕 | 萬字長文回顧智慧駕駛進化史2019-01-08
- 為域名管理進行RAM授權2018-11-11
- 程式猿進階之路“內網域名”2018-08-31內網
- 短視訊seo優化,短視訊seo排名2022-05-09優化
- 走進資料的歷史2022-12-08
- Angular Universal 的演進歷史2022-01-09Angular
- [譯] 簡短而又完全精確的程式語言歷史2018-04-02
- 站在第三視角看直播簡史-《英雄聯盟》直播進化論2019-11-28
- 賦予遊戲永恆的生命!全球"創造型遊戲"進化史2019-05-30遊戲