使用Unicode进行黑客攻击(以GitHub为例)

Unicode非常复杂。 很少有人知道所有技巧 :从看不见的字符和控制字符到代理对和组合的表情符号(当在第三个字符中添加两个字符时)。 该标准在17个平面中包括2 个16个代码位置。 实际上,可以将学习Unicode与学习单独的编程语言相提并论。

毫不奇怪,Web开发人员忽略了某些细微差别。 另一方面,攻击者可以根据自己的目的使用Unicode的功能。

安全专家John Gracie 演示了一个GitHub电子邮件验证错误的示例,该错误用于恢复忘记的密码。 在其他站点上也可以找到类似的错误。

John Gracie解释了将转换后的两个不同字符转换为相同字符时的“符号转换冲突”。

在这种情况下,他使用土耳其语字符“ı”(不带点的“ i”),将其翻译成拉丁语“ i”,这样处理后的邮政地址John@Gıthub.com就变成了John@Github.com

 'ß'.toLowerCase() // 'ss' 'ß'.toLowerCase() === 'SS'.toLowerCase() // true // Note the Turkish dotless i 'John@Gıthub.com'.toUpperCase() === 'John@Github.com'.toUpperCase() 

可以在所有Unicode平面上找到此类冲突:这是完整列表

我们主要对那些被转换为拉丁字符的字符感兴趣。 只有十一种选择。 表格中的第三位是土耳其符号“ i”,不带点。

签收代码点结果
ß0x00DFSS
ı0x0131I
ſ0x017FS
0xFB00FF
科幻0xFB01FI
0xFB02FL
0xFB03FFI
0xFB04FFL
0xFB05ST
0xFB06ST
ķ0x212Ak

GitHub允许攻击者从其他人的帐户中获取密码,因为恢复忘记的密码的过程无法正常进行。

作为此过程的一部分,将输入的电子邮件地址与数据库中存储的地址进行了比较。 验证算法:

  1. 使用toLowerCase方法输入的地址是小写字母。
  2. 将输入的地址与注册用户数据库中的地址进行比较。
  3. 如果找到匹配项,则数据库中的密码将发送到输入的地址。

显然,使用toLowerCase方法时,开发人员并不了解地址转换的冲突。

在这种情况下,纠正错误很简单。 将密码发送到数据库中的地址而不是输入的地址就足够了。

当然,这不是一个完整的错误修复程序,而只是一个快速补丁。 更完整的解决方案是广播到Punycode进行验证: John@Gıthub.comxn—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应用程序中也会发生类似的崩溃。






Source: https://habr.com/ru/post/zh-CN481318/


All Articles