url中的unicode漏洞引发的域名安全问题

2019-08-26 约 217 字 预计阅读 2 分钟

声明:本文 【url中的unicode漏洞引发的域名安全问题】 由作者 knigh**** 于 2019-08-26 08:51:00 首发 先知社区 曾经 浏览数 1006 次

感谢 knigh**** 的辛苦付出!

url中的unicode漏洞引发的域名安全问题

在今年的blackhat中微软安全研究员Jonathan Birch,向大家介绍了一个unicode漏洞,此漏洞影响了现在的大部分的软件,语言,浏览器,产生了数个CVE漏洞。跟随着大佬大脚步,我也想去了解这个漏洞。为了记录自己的学习成果,于是写下了这篇博客。

0x00基础知识

在理解漏洞之前,现了解下unicode和ascii编码,IDNA吧

unicode编码

Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。

​ Unicode 伴随着通用字符集的标准而发展,同时也以书本的形式对外发表。Unicode 至今仍在不断增修,每个新版本都加入更多新的字符。当前最新的版本为2019年5月公布的12.1.0,已经收录超过13万个字符(第十万个字符在2005年获采纳)。Unicode涵盖的数据除了视觉上的字形、编码方法、标准的字符编码外,还包含了字符特性,如大小写字母。

ascii编码

​ ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。

​ ASCII 由电报码发展而来。第一版标准发布于1963年,1967年经历了一次主要修订,最后一次更新则是在1986年,至今为止共定义了128个字符;其中33个字符无法显示(一些终端提供了扩展,使得这些字符可显示为诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符。控制字符的用途主要是用来操控已经处理过的文字。在33个字符之外的是95个可显示的字符。用键盘敲下空白键所产生的空白字符也算1个可显示字符(显示为空白)。

​ ASCII码大致由三部分组成:ASCII 打印字符ASCII 非打印控制字符扩展 ASCII 打印字符

IDNA(Internationalizing Domain Names in Applications)应用程序国际化域名

​ IDNA是一种以标准方式处理ASCII以外字符的一种机制,它从unicode中提取字符,并允许非ASCII码字符以允许使用的ASCII字符表示。

​ 国际化域名(IDN)最初是由马丁·杜斯特于1996年12月提出。1998年在新加坡国立大学教授陈定炜的指导下,Tan Juay Kwang和Leong Kok Yong将其付诸实施。经过许多讨论和对比各种提案后,应用程序国际化域名(IDNA)被采纳为正式标准,并被用在许多顶级域名中。在IDNA中,“国际化域名”特指可以成功将IDNA转化为十进位制ASCII的域名。

0x01漏洞分析

1、域名欺骗

​ 先看一个有趣的东西,访问此网站http://Вaidu.com(其中的В是unicode U+0412)

​ 它是不是跳转到了http://xn--aidu-f4d.com/

当然,你也可以试试使用其他特殊的unicode编码。

​ 下面,看下整个过程吧

​ 先讲下跳转的url的含义

http://xn--aidu-f4d.com/

xn:ACE(这是一个国际化域名编码)

aidu:ASCII码

f4d:状态机指令

​ 现在,我们来看看具体过程

​ 当我们访问http://Вaidu.com时,浏览器会将我们访问的url交给域名系统(DNS)解析url为ip地址,在解析url的过程中采用递归查询和迭代查询,即先递归搜索浏览器自己的的dns缓存,然后搜索操作系统的dns缓存,接着搜索hosts文件缓存,搜索本地域名服务器,然后迭代搜索根域名服务器……,知道找到ip地址为止,找不到就返回404notfound,而在DNS中,国际化域名(IDNA)使用Punycode转写并以美国信息交换标准代码(ASCII)字符串储存。在本地DNS中,因为遇见特殊字符В,而无法将此url正常转化为ASCII,因此就直接在本地转化为http://xn--aidu-f4d.com/这种形式的url。

下面是burpsuite抓取的本地解析完成后的截图。


而IDNA转写ASCII的过程又分为两步

1. Normalization

Convert characters to a “standardized form”.

第一步:正常化,将字符转化为标准形式

例如:Å (U+00C5),Å (U+212B),Å (U+0041, U+030A)将会被标准化为å (U+00E5)

2. Punycoding
Turn Unicode into ASCII.

第二步:用punycode编码将unicode编码成ASCII码

​ 现在我们已经知道,在我们访问域名http://Вaidu.com时,浏览器会将此unicode转化为ASCII码,然后访问http://xn--aidu-f4d.com/,如果我们注册了http://xn--aidu-f4d.com/这个域名,那么我们就可以将访问http://Вaidu.com的受害者转到这个域名下,从而实现钓鱼攻击。


2、域名分割

​ 如果你再尝试下访问http://evil.c℀a.aaa.com

​ 这个时候你会发现你的浏览器会访问http://evil.ca/ca.aaa.com

​ 在unicode中还有一种字符(U+2100),当IDNA处理此字符时,会将变成a/c,因此当你访问此url时,dns服务器会自动将url重定向到另一个网站。如果服务器引用前端url时,只对域名做了限制,那么通过这种方法,我们就可以轻松绕过服务器对域名的限制了。

但是为什么同样是unicode字符,但是会产生不同结果呢?

​ 首先我们要明确一点就是,IDNA并不是所有unicode都可以以ASCII码呈现的

​ unicode转ASCII发生在IDNA中的TOASCII操作中。如果能通过TOASCII转换时,将会以正常的字符呈现。而如果不能通过TOASCII转换时,就会使用“ACE标签”,“ACE”标签使输入的域名能转化为ASCII码。

那还有其他可以利用的unicode字符吗?

U+2100, U+2101, U+2105, U+2106, U+FF0F, U+2047, U+2048, U+2049,

U+FE16, U+FE56, U+FF1F, U+FE5F, U+FF03, U+FE6B, U+FF20,


3、漏洞IDNA版本

IDNA2008阻断了分割域名的字符

IDNA2003IDNA2008 + UTS46存在漏洞

0x03关联CVE

• CVE-2019-0654 Microsoft Browser Spoofing Vulnerability

• CVE-2019-0657 .NET Framework and Visual Studio Spoofing Vulnerability

• CVE-2019-9636 Python, urlsplit does not handle NFKC normalization

• CVE-2019-10160 Python, urlsplit NFKD normalization vulnerability in user:password@

• CVE-2019-2816 Oracle Java SE/Java SE Embedded, “Normalize normalization”

• CVE-2019-12290 LibIDN2, “Perform A-Label roundtrip for lookup functions by default”

0x04参考

此文章来源于对2019blackhat HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization议程的理解。

https://i.blackhat.com/USA-19/Thursday/us-19-Birch-HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization.pdf

https://tools.ietf.org/html/rfc3490

https://zh.wikipedia.org/wiki/国际化域名

https://blog.csdn.net/kexiuyi/article/details/81125588

https://blog.csdn.net/qq_21993785/article/details/81188253

关键词:[‘安全技术’, ‘WEB安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now