国际化域名(IDN)同形异义词攻击,利用的是不同语言中外观几乎完全相同的字符进行欺诈,例如拉丁语的字母 a 和西里尔语的字母 а。从表面上看,这样的域名或邮箱地址与正常地址毫无差别,但背后实则是用外观相似但技术层面完全不同的Unicode字符做了替换。
举个例子:
- Unicode编码邮箱:
аdmin@example.com(西里尔语а)
- Punycode编码格式:
xn--dmin-7cd@example.com
当邮件服务商、身份验证流程等系统无法正确区分这些视觉相似的字符时,就会引发严重的安全漏洞。这可能导致在用户注册、密码重置环节发生账号劫持,甚至能绕过二次验证保护机制,若未妥善修复,将带来极高的安全风险。
Punycode编码与IDN同形异义词攻击的区别
什么是Punycode编码?
Punycode编码是一种仅通过ASCII字符集表示Unicode字符的方式,能让不直接支持Unicode的系统(如域名系统)也实现兼容。
示例:
Unicode编码邮箱аdmin@example.com(含西里尔语а)转换为Punycode编码后为:
xn--dmin-7cd@example.com
对大多数系统而言,这只是另一个合法的邮箱地址。
什么是IDN同形异义词攻击?
这类攻击会欺骗系统(有时也会欺骗用户),让其认为两个视觉相似的字符序列完全相同,但实际上二者在底层逻辑中截然不同。
示例:
“admin@example.com”与“аdmin@example.com”(含西里尔语а)
看起来是不是一模一样?正是这种视觉欺骗性,使其成为安全测试中需要重点关注的攻击向量。
实验环境搭建与所需工具
- 渗透测试工具Burp Suite:用于拦截和修改HTTP请求。
- Burp Collaborator:搭建专属的简单邮件传输协议/邮件回调服务器。
- Punycode编码生成器:实现Unicode字符的编码转换。
本漏洞验证实验无需准备国际化域名或简单邮件传输协议服务器,仅使用Burp Suite即可模拟完整攻击流程。
漏洞利用步骤全解析
以下将结合Voorivex团队搭建的实验环境,从简单的用户注册到完成完整的账号劫持,为大家分步拆解攻击流程。
步骤一:使用正常邮箱完成注册
进入任意支持邮箱注册的目标网站(任意登录页面均可),使用常规邮箱注册新账号。为接收邮件回调信息,我们将使用Burp Collaborator作为伪造的简单邮件传输协议服务器,示例邮箱地址如下:
security@gmail.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com

验证账号功能可用性
注册完成后,使用该账号信息登录,确认账号功能正常,随后退出账号。

步骤二:在邮箱中植入Punycode编码字符,重新注册
再次进行注册操作,此次需在邮箱地址中加入Punycode编码字符。你可以使用我开发的脚本,该脚本会展示所有可用的Punycode编码字符及其对应编码值,只需输入需要转换的字母,即可自动生成对应的Punycode编码。脚本地址:
https://github.com/coffinxp/scripts/blob/main/punycode_gen.py

我在实验中仅通过自研的Punycode编码生成器,将邮箱域名中的字母 a 替换为了 à。你也可以通过Punycode在线解码工具(如 https://www.punycoder.com/ )验证转换结果。
步骤三:通过Burp Suite拦截请求并替换为Punycode编码内容
这里有个关键要点:Chrome等浏览器会自动对特殊字符进行编码,导致攻击手段失效。因此需要通过Burp Suite拦截注册请求,手动将请求中的邮箱字段替换为Punycode编码后的邮箱地址,再转发该请求。

查看重复邮箱的响应结果
若服务器返回“邮箱已存在”这类提示,说明应用系统经过标准化处理后,将原始邮箱与Punycode编码的邮箱判定为同一个地址。这是系统配置错误的明确信号,也意味着该系统存在潜在的安全漏洞。

步骤四:通过Punycode编码邮箱触发密码重置流程
进入目标网站的“忘记密码”或密码重置页面,输入Punycode编码后的邮箱地址。此操作仍需通过Burp Suite完成,避免字符被浏览器自动编码,示例地址如下:
security@gmàil.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com

步骤五:完成账号劫持
转发上述请求后,你会在Burp Collaborator中收到包含密码重置链接的邮件回调信息。复制该链接并在浏览器中打开,完成密码重置操作。


随后尝试使用原始的非Punycode编码邮箱,搭配刚重置的新密码登录。


至此,账号劫持成功。这是不是你见过的最简洁且最具破坏性的账号劫持手段?整个过程无需用户交互、无需钓鱼诱导、无需用户点击任何链接,仅通过巧妙利用Punycode编码的邮箱地址即可实现。也正因如此,该漏洞被评定为高危漏洞,一旦在主流网站中被发现,提交者通常能获得高额的漏洞赏金。
进阶手段:在邮箱用户名段植入Punycode编码
前文我们探讨了域名段的邮箱标准化处理不当引发的账号劫持问题,而如果漏洞出现在邮箱的用户名段,攻击手段会更加隐蔽。
多数开发人员不会对邮箱的本地用户名部分做完善的Unicode字符清洗处理,这就给了攻击者可乘之机。
攻击原理与步骤
- 使用经Punycode编码修改后的用户名注册账号,示例地址:
ṡecurity@gmail.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com
- 依旧通过Burp Suite拦截并修改注册请求(浏览器会默认对Unicode字符编码,需手动干预)。
- 若服务器接受该邮箱地址并完成账号注册,说明第一步攻击成功。
- 进入“忘记密码”页面,此次输入用户名段为非Punycode编码的原始邮箱地址:
security@gmail.com.bcrkly6yl8ke552nzjt7jtu52w8nwdk2.oastify.com
- 若能在Burp Collaborator中收到密码重置邮件,即可确认服务器将两个邮箱判定为同一个账号。
通过收到的重置链接完成密码修改后,就能使用原始邮箱登录目标账号。这一通过邮箱本地用户名段实现的零点击账号劫持,同样具有极强的破坏性。
小技巧:绕过二次验证
如果目标网站开启了二次验证,但对邮箱的标准化处理存在漏洞(例如将 gmáil.com 判定为 gmail.com),攻击者可注册 victim@gmáil.com 账号并开启二次验证,随后使用自己的二次验证验证码,登录受害者的 victim@gmail.com 账号。
修复方案:开发人员如何防范此类攻击
- 强化邮箱验证规则:仅允许邮箱输入框中出现ASCII字符(可通过正则表达式或输入清洗类库实现)。
- 统一邮箱地址标准化处理流程:将Unicode字符转换为ASCII字符(如调用
IDN.toASCII() 方法或同类功能接口),并在所有业务流程中执行统一的标准化处理。
- 非必要情况下屏蔽国际化域名与Punycode编码域名:拒绝接收包含Punycode编码前缀的域名邮箱(如
xn--example),除非应用系统明确支持国际化域名。
- 在注册、登录、密码重置流程中应用统一的验证逻辑:确保所有环节的邮箱验证与对比采用相同的处理逻辑,避免出现逻辑不一致导致的漏洞或绕过问题。
结语
基于Punycode编码的国际化域名攻击,是现代漏洞赏金挖掘中最精妙、最被低估且杀伤力极强的账号劫持手段之一。掌握其原理并善用Burp Suite等工具,你就能发现许多人忽略的高危安全漏洞。希望这篇实战解析能为你带来启发,更多技术讨论欢迎访问云栈社区进行交流。
翻译自:https://infosecwriteups.com/the-most-underrated-0-click-account-takeover-using-punycode-idn-attacks-c0afdb74a3dc