程序员必知:【转载】短域名进化史

本文涉及的产品
.cn 域名,1个 12个月
简介: 程序员必知:【转载】短域名进化史

转自乌云

一个短的域名一直都是很多人所推崇的。因为对于大部分人来说,域名越短就会越好记忆。但是,还存在一部分人,他们不在乎域名是否好记,但是他们巴不得自己的域名只有三位,两位甚至是没有长度。他们,就是XSSer。

0x00 男人为什么要比短

正常的男人都喜欢比谁长,而狂热的XSSer都喜欢比谁短。因为在真实的世界里,我们往往都会遇见字符长度限制。其中的部分问题,是可以通过Short Talk Of XSS中提到的方法进行解决的。但还有一部分极端的场景,是没有办法靠那些硬技术去解决的。比如,我的好友@/fd最近出的prompt.ml这个XSS系列挑战当中就有这样的一道题:

function escape(input) {

// make sure the script belongs to own site

// sample script:

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呢?答案是,有的。这里和大家分享一个生成短网址的网站:

借助这个网站,就可以让我们拥有一个和xxx.xx一样长度的域名来调用远程JS了。^_^

得到生成的链接:

but,wait!那个看上去不怎么可爱的韩文字符长度真的是1么?

让我们打开浏览器验证一下:

看上去Javascript确实认为”?”的长度为1.但,如果验证长度的是Javascript还需要整这么麻烦?直接抓包改包,不就过去了么?是的,所以让我们在PHP里再做一下验证。php当中判断字符串长度的函数有两个,分别是strlen和mb_strlen。后者,与前者最大的不同就是就是可以在参数中定义字符集。我们来写一个简单的脚本:

<?php

echo 'strlen is:'.strlen($_GET【"str"】).'

';

echo ' mb_strlen is:'.mb_strlen($_GET【"str"】).'

';

echo 'utf-8 mb_strlen is:'.mb_strlen($_GET【"str"】, 'utf-8').'

';

echo 'gbk mb_strlen //代码效果参考:http://www.zidongmutanji.com/bxxx/262136.html

is:'.mb_strlen($_GET【"str"】, 'gbk').'

';

echo 'gb2312 mb_strlen is:'.mb_strlen($_GET【"str"】, 'gb2312').'

';

echo 'gb18030 mb_strlen is:'.mb_strlen($_GET【"str"】, 'gb18030').'

';

echo 'big5 mb_strlen is:'.mb_strlen($_GET【"str"】, 'big5').'

';

?>

通过脚本来观察一下,不同函数和字符集设定的情况下”?”长度分别会是多少:

可以看到当我们使用更为规范的mb_strlen并将字符集设定为比较常见的utf-8和gb18030时,该字符长度只有1.也就是说,在面对懂得规范输写的码农时,这种方法是成立的。我们并没有花一分钱就得到了一个和三位域名在长度上等效的URL。awesome! PS:由于mb_strlen在字符集为utf-8的情况下,长度结果和控制台是一样的,所以下面都使用控制台截图代替。

但是还不够短,因为后面还有路径。既然韩国人的玩意儿字符长度可以是1,那中文可以么?答案自然是可以的。我们只需要购买一个后缀为两位的中文域名(如果你看明白了,就该懂其实中文,韩文什么的一点都不重要)。而且已经有人这么去做了。比如我们的小伙伴,0x_Jin已经入坑。

靖.pw

0×02 Unicode黑魔法

回顾一下,我们从收费的xxx.xx进化到了免费的x.xx/x,再进一步进化到了x.xx。我们已经将域名缩短到了传说中的4位。还能再短么?如果不能就真的没有必要写这个文章了。在这里,需要先感谢@shafigullin教会了我们这个技巧。

靖.?

看上去pw有些奇怪?没错,因为这并不是p和w,而是unicode字符?(U+33BA)。这个也能访问?点一下链接不就知道喽。这是个即神奇但又不陌生的现//代码效果参考:http://www.zidongmutanji.com/bxxx/181672.html

象。为什么这么说呢,因为我们经常会碰到这样的情况。当我们在忘记切换输入法,拿着中文输入法就在URL敲入:

并按下回车时,会发现还是会正常跳入这个问题其实就已经证明了在hostname中,这种事情是有在发生的。但需要尊重的是,我们谁都没有想过可以借助这种现象来缩短我们的域名长度。所以技术一直都在于创新度而不在于难度。在这里再次表示我对@shafigullin的respect.故事讲到这里,我们的域名已经进化到x.x也就是三位的长度了。但是,我们不可能停留在pw上面,让我们来开始疯狂的fuzzing吧。下面是我的小伙伴@/fd写的一个hostname的fuzzer:

然后我们得到了一些非常有趣的结果。由于内容比较多在这里只显示部分结果。首先是一些可以作为域名后缀的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的域名的。所以,我们的小伙伴就抢占先机,拿下了:

Ⅷ.? 和 ?.? 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位!当然,我们已经这么去做了。这是我们的战利品:

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位之间了。

//兼容所有浏览器

//兼容Firefox和IE

这真是非常激动人心的。在将域名长度缩短到了两位之后,让我们再来看看另外一部分的结果:

? : a/c // path

? : a/s // path

℅ : c/o // path

? : c/u // path

在这部分结果当中,发现有些unicode字符最终会被解释称 字符/字符。此外,我们之前提到的会带”.”的结果作为二级域名提供给用户,也将会是一个很不错的选择。比如:

//兼容IE和FF

0×03 写在最后

这就是,我们在这些日子里不停的fuzzing,思考,调查所得到的结果。

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

我们讨论了很多。讨论了如果在这些知识基础上开放一个XSS平台会如何,是否会被山寨?我觉得山寨是肯定会有的。因为trick都已经放出来了,所以对于效仿者来说只需要照着用就可以了。但是,好的技术支持和功能模块也许真的不是ctrl+c就能带走的。所以我相信我们会做出来一个不会被复制的平台。

最后,让我们再次以长度的话题结尾。那么,1位是可能的么?也许对于土豪来说买个tld就是可能的。

你需要做的就是买一个可以用单个unicode字符代替的tld。

Thanks for your time.

相关文章
|
3月前
|
域名解析 网络协议 程序员
程序员必知:【转】adns解析库——域名解析实例(C++、linux)
程序员必知:【转】adns解析库——域名解析实例(C++、linux)
47 0
|
4月前
|
域名解析 弹性计算 Linux
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
本文为大家介绍了2024年购买阿里云服务器和注册域名,绑定以及备案的教程,适合需要在阿里云购买云服务器、注册域名并备案的用户参考,新手用户可通过此文您了解在从购买云服务器到完成备案的流程。
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
|
17天前
|
域名解析 运维
阿里云日常运维-购买域名
这篇文章是关于如何在阿里云进行日常运维,包括购买域名的详细步骤和一些推荐阅读资源。
38 4
阿里云域名购买注册流程_创建信息模板_域名实名认证全流程
阿里云域名注册指南:访问[阿里云域名注册入口,查询并注册心仪域名,选择后缀,加入清单后结算。价格因后缀而异,如.com首年78元。创建域名信息模板完成实名认证,首次需上传资料。获取优惠口令并使用可享折扣
|
4月前
|
运维 JavaScript Java
Serverless 应用引擎产品使用之在阿里云函数计算中想为两个不同的服务分别开通自定义域名如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
27天前
|
安全 数据建模 网络安全
阿里云SSL证书价格多少钱一年?单域名和通配符收费明细整理
阿里云提供多样化的SSL证书服务,包括免费及付费选项。免费版由DigiCert提供,适合基本需求,有效期为3个月。付费证书品牌涵盖WoSign、DigiCert、GlobalSign等,价格从238元/年起。不同品牌与类型的证书(如DV、OV、EV)费用各异,满足各类安全需求。详情及最新价格请访问阿里云官方页面。
|
1月前
|
人工智能 网络协议 小程序
重磅升级!阿里云推出首个域名AI大模型应用
重磅升级!阿里云推出首个域名AI大模型应用
235 1
|
2月前
公安部备案域名证书怎么获得?阿里云域名证书申请下载方法
在阿里云获取域名证书,需登录域名管理控制台,点击“域名列表”,选择域名后点击“管理”,再点击左侧的“域名证书下载”。过程免费且快速。
183 3
|
3月前
|
敏捷开发 Kubernetes 持续交付
阿里云云效产品使用问题之Ingress想配置多个域名,该怎么操作
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
域名解析 网络协议 安全
【域名解析DNS专栏】云服务中的DNS解析服务比较:阿里云、AWS、Azure大PK
【5月更文挑战第23天】此对比分析探讨了阿里云DNS、AWS Route 53和Azure DNS的服务特点。阿里云DNS以其智能解析和IPv6支持脱颖而出,适合中国地区用户;AWS Route 53凭借其强大的路由策略和与AWS生态的深度集成吸引高级用户;Azure DNS则以简洁管理和DNSSEC安全支持见长,与Azure平台集成良好。选择取决于具体需求,如功能、易用性、性能、安全性和成本。
223 1
【域名解析DNS专栏】云服务中的DNS解析服务比较:阿里云、AWS、Azure大PK

热门文章

最新文章