短域名进化史

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.

相关文章
相关标签/搜索