Unicode非常复杂。 很少有人知道
所有技巧 :从看不见的字符和控制字符到代理对和组合的表情符号(当在第三个字符中添加两个字符时)。 该标准在17个
平面中包括2
个16个代码位置。 实际上,可以将学习Unicode与学习单独的编程语言相提并论。
毫不奇怪,Web开发人员忽略了某些细微差别。 另一方面,攻击者可以根据自己的目的使用Unicode的功能。
安全专家John Gracie
演示了一个GitHub电子邮件验证错误
的示例,该错误用于恢复忘记的密码。 在其他站点上也可以找到类似的错误。
John Gracie解释了将转换后的两个不同字符转换为相同字符时的“符号转换冲突”。
在这种情况下,他使用土耳其语字符“ı”(不带点的“ i”),将其翻译成拉丁语“ i”,这样处理后的邮政地址
John@Gıthub.com
就变成了
John@Github.com
:
'ß'.toLowerCase()
可以在所有Unicode平面上找到此类冲突:这是
完整列表 。
我们主要对那些被转换为拉丁字符的字符感兴趣。 只有十一种选择。 表格中的第三位是土耳其符号“ i”,不带点。
GitHub允许攻击者从其他人的帐户中获取密码,因为恢复忘记的密码的过程无法正常进行。
作为此过程的一部分,将输入的电子邮件地址与数据库中存储的地址进行了比较。 验证算法:
- 使用toLowerCase方法输入的地址是小写字母。
- 将输入的地址与注册用户数据库中的地址进行比较。
- 如果找到匹配项,则数据库中的密码将发送到输入的地址。
显然,使用
toLowerCase
方法时,开发人员并不了解地址转换的冲突。
在这种情况下,纠正错误很简单。 将密码发送到数据库中的地址而不是输入的地址就足够了。
当然,这不是一个完整的错误修复程序,而只是一个快速补丁。 更完整的解决方案是广播到Punycode进行验证:
John@Gıthub.com
→
xn—john@gthub-2ub.com
。 Punycode旨在将域名唯一地转换为ASCII字符序列。 可以使用相同的方式来验证电子邮件地址,但是大多数Web应用程序不能。
John Gracie
因该漏洞而获得了现金奖励和
2500点积分 ,尽管他与主要的Github黑客
Alexander Dobkin仍然相去甚远
<img src = 404 onerror = alert(document.domain)> :具有如此不寻常名称的用户已经获得了30,750点积分,包括用于在生成GitHub Pages的GitHub服务器上执行任意代码。
Messenger收到黑点表情符号时崩溃(iOS上的Messenger,Android版WhatsApp)与Unicode相关的错误具有这样的属性,即可以在处理用户输入的文本的任何应用程序中找到它们。 Web应用程序以及适用于Android和iOS的本机程序中存在漏洞。 最著名的事件之一是
2015年的
iOS错误 ,当时一条短信中的多个Unicode字符导致操作系统崩溃。 去年,在iOS 11.3中发现了类似的Unicode错误,称为
“黑点” 。 当您触摸表情符号时,Android的WhatsApp应用程序中也会发生类似的崩溃。

