url中的unicode漏洞引发的域名安全问题
字数 1138 2025-08-26 22:12:02
Unicode漏洞引发的域名安全风险分析
0x00 基础知识
Unicode编码
Unicode(万国码、国际码)是计算机科学领域的业界标准,对世界上大部分文字系统进行整理编码。最新版本12.1.0已收录超过13万个字符,涵盖字形、编码方法和字符特性。
ASCII编码
ASCII(美国信息交换标准代码)是基于拉丁字母的编码系统,主要用于显示现代英语。标准ASCII定义了128个字符,其中95个可显示字符,33个控制字符。
IDNA(国际化域名)
IDNA是一种处理非ASCII字符的标准机制,允许非ASCII字符以ASCII形式表示。国际化域名(IDN)最初由Martin Dürst于1996年提出,1998年由Tan Juay Kwang和Leong Kok Yong实现。
0x01 漏洞分析
1. 域名欺骗攻击
攻击示例:
访问 http://Вaidu.com(其中В是Unicode U+0412)会跳转到 http://xn--aidu-f4d.com/
技术原理:
- 浏览器将URL交给DNS解析时,遇到Unicode字符В
- DNS无法直接将其转化为ASCII,于是使用Punycode转写为
xn--aidu-f4d.com - 攻击者可注册
xn--aidu-f4d.com域名实施钓鱼攻击
IDNA转ASCII过程:
- 标准化:将字符转化为标准形式
- 例如:Å (U+00C5), Å (U+212B), Å (U+0041, U+030A) → å (U+00E5)
- Punycode编码:将Unicode转为ASCII
2. 域名分割攻击
攻击示例:
访问 http://evil.c℀℀a.aaa.com 会被重定向到 http://evil.ca/ca.aaa.com
技术原理:
- Unicode字符℀℀ (U+2100)在IDNA处理时会被转换为a/c
- 导致URL被错误分割,可能绕过服务器对域名的限制
可利用的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:阻断了分割域名的字符
- IDNA2003和IDNA2008 + UTS46:存在漏洞
0x02 关联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-1226 Oracle Java SE/Java SE Embedded, "Normalize normalization"
CVE-2019-12290 LibIDN2, "Perform A-Label roundtrip for lookup functions by default"
0x03 防御建议
- 升级到支持IDNA2008标准的系统和库
- 在域名验证时进行严格的Unicode标准化检查
- 实现URL解析时进行多级验证
- 对用户输入的URL进行规范化处理
0x04 参考资源
- Black Hat USA 2019演讲《HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization》
- RFC 3490标准文档
- 国际化域名维基百科
- 相关技术博客分析文章