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当中给出的办理方案,对付这种场景来说是无能为力的。
我们须要关注的是如何让自己的域名变短。

php判读字符长度短域名进化史 SQL

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。
后者,与前者最大的不同便是便是可以在参数中定义字符集。
我们来写一个大略的脚本:

<?phpecho 'strlen is:'.strlen($_GET[\公众str\"大众]).'<br&gt;';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位。
还能再短么?如果不能就真的没有必要写这个文章了。
在这里,须要先感谢@shafigullin教会了我们这个技巧。
http://靖.㎺

看上去pw有些奇怪?没错,由于这并不是p和w,而是unicode字符㎺(U+33BA)。
这个也能访问?点一下链接不就知道喽。
这是个即神奇但又不陌生的征象。
为什么这么说呢,由于我们常常会碰到这样的情形。
当我们在忘却切换输入法,拿着中文输入法就在URL敲入:

http://www。
baidu。
com

并按下回车时,会创造还是会正常跳入www.baidu.com,这个问题实在就已经证明了在hostname中,这种事情是有在发生的。
但须要尊重的是,我们谁都没有想过可以借助这种征象来缩短我们的域名长度。
以是技能一贯都在于创新度而不在于难度。
在这里再次表示我对@shafigullin的respect.故事讲到这里,我们的域名已经进化到x.x也便是三位的长度了。
但是,我们不可能勾留在pw上面,让我们来开始猖獗的fuzzing吧。
下面是我的小伙伴@/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 extU+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 extfi : fi //valid domain extſt : st //valid domain extst : 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.

本文作者:Drops,转载自:http://www.mottoin.com/detail/3602.html