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/

技术原理

  1. 浏览器将URL交给DNS解析时,遇到Unicode字符В
  2. DNS无法直接将其转化为ASCII,于是使用Punycode转写为xn--aidu-f4d.com
  3. 攻击者可注册xn--aidu-f4d.com域名实施钓鱼攻击

IDNA转ASCII过程

  1. 标准化:将字符转化为标准形式
    • 例如:Å (U+00C5), Å (U+212B), Å (U+0041, U+030A) → å (U+00E5)
  2. 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:阻断了分割域名的字符
  • IDNA2003IDNA2008 + 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 防御建议

  1. 升级到支持IDNA2008标准的系统和库
  2. 在域名验证时进行严格的Unicode标准化检查
  3. 实现URL解析时进行多级验证
  4. 对用户输入的URL进行规范化处理

0x04 参考资源

  1. Black Hat USA 2019演讲《HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization》
  2. RFC 3490标准文档
  3. 国际化域名维基百科
  4. 相关技术博客分析文章
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字符 : 3. IDNA版本差异 IDNA2008 :阻断了分割域名的字符 IDNA2003 和 IDNA2008 + UTS46 :存在漏洞 0x02 关联CVE漏洞 0x03 防御建议 升级到支持IDNA2008标准的系统和库 在域名验证时进行严格的Unicode标准化检查 实现URL解析时进行多级验证 对用户输入的URL进行规范化处理 0x04 参考资源 Black Hat USA 2019演讲《HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization》 RFC 3490标准文档 国际化域名维基百科 相关技术博客分析文章