如何防止Unicode安全漏洞

时间:2017-11-08 09:34:34

标签: security unicode unique string-comparison owasp

"Five things everyone should know about Unicode"是一篇博文,展示了如何将Unicode字符用作网站的攻击媒介。

这种现实世界攻击的主要示例是使用开发人员名称中的unicode不可打印空间提交给​​Google Play商店的虚假WhatsApp应用程序,该名称使该名称具有唯一性并允许其通过Google的过滤器。蒙古元音分隔符(U + 180E)是一种不可打印的空间角色。

enter image description here

另一个漏洞是使用外观相似的替代Unicode字符。 Mimic工具显示了它的工作原理。

我能想到的一个例子是在注册新用户时保护用户名。您不希望两个用户名相同,也不希望外观相同。

你如何防范这种情况?那里有这些人物的清单吗?通常的做法是从所有表格输入中删除所有这些类型的字符吗?

4 个答案:

答案 0 :(得分:2)

你所说的被称为同性恋攻击。

Unicode here有一个“confusables”列表,另外还有this。应该有基于这些或pontentially其他数据库的库。一个这样的库是this one,您可以在Java或Javascript中使用它。其他语言也必须存在,或者你可以写一个。

我认为重要的是没有自己的数据库 - 在良好的数据基础上,库或服务很容易做到。

至于你是否应该过滤掉类似的用户名 - 我认为这取决于你。如果用户有兴趣尝试伪造彼此的用户名,也许是的。对于许多其他类型的数据,也许没有必要这样做。除了您应该使用数据点评估应用程序中的风险之外,我认为没有通用的最佳实践。

对于另一个问题也是一种不同的方法,但如果你的正则表达式引擎是Unicode就绪的,那么正常表达式中\w字符可能通常用于Unicode输入验证。在这样的引擎中,\w应匹配所有Unicode类的单词字符,即。任何语言的字母,修饰符和连接符,但没有别的(没有特殊字符)。这不能防止同性恋攻击,但可以防止某些注入,同时保持您的应用程序对Unicode友好。

答案 1 :(得分:0)

如果您拥有已知安全值的白名单,并且排除所有其他安全值,那么所有清理效果最佳。

ASCII是一组这样的字符。

答案 2 :(得分:0)

这可以通过各种方式来解决,但是每一个都可能会增加误报的数量,从而导致合法用户。烦恼。此外,它们都不适用于100%的情况(即使合并)。他们只会添加一个额外的图层。

一种方法是使表格看起来类似,并检查是否存在重复的名称。什么'看起来相似'在许多情况下,手段是主观的,因此建立这样的清单可能是棘手的。这种方法在某些情况下可能会产生误报。

此外,颠倒某些字母的顺序可能会欺骗许多用户。使用诸如Jaro-Winkler和Levenshtein距离之类的算法(即,检查是否已存在类似的用户名/公司名称)可以实现检查字谜或非常相似的名称。然而,有时候,这可能是由于某些地区某些单词的拼写不同(例如,' center' vs' center'),或某些公司的名称可能故意包含anagram 。这种方法可能会进一步增加误报的数量。

此外,正如Jonathan所述,卫生处理也是一种很好的方法,但是它可能无法防止字谜,并且会给想要使用某些特殊字符的合法用户带来问题。

正如OP所提到的,特殊字符也可以被剥离。名称的其他部分也可能需要被删除,例如像#"''' .com'等

最后,名称可以被限制为仅包含一种语言的字符,而不是来自不同语言的字符混合(更宽松的版本可能不允许在同一个单词中混合使用字符 - 而如果分开则允许空间)。限制使用大写第一个字母和小写字母可以进一步改进这种方法,因为某些小写字母(如' l')可能看起来像大写字母(如' I& #39;)使用某些字体时。排除使用某些符号(例如' |')将进一步增强此方法。此解决方案将增加某些无法使用某些名称的用户的烦恼。

也可以使用一些/所有上述方法的组合。方法的选择以及如何应用它们(例如,您可以选择禁止相似的名称,或者在名称相似的情况下要求主持人批准,或者不采取任何行动,而只是警告主持人/管理员)取决于您尝试解决的方案。

答案 3 :(得分:0)

对于有关用户名的问题,我可能有一个创新的解决方案。显然,您希望允许使用ASCII字符,但在某些特殊情况下,将使用其他字符(如您所说,使用不同的语言)。

我认为一种直观的方法是允许在用户名中使用ASCII和其他字符,同时受到“Unicode漏洞”的保护,将是这样的:

允许所有ASCII字符并禁止其他字符,除非用户名中有 x或更多这些特殊字符(用户名是另一种语言)。

以此为例:

Whatsapp,Inc +(U + 180E) - 不允许,只有1个特殊字符。

элч+(U + 180E) - 允许!它有超过x个特殊字符(例如,3)。它可以使用Mongolian分隔符,因为它是Mongolian。

显然,这并不能保护你100%免受这些类型的漏洞攻击,但这是我一直使用的非常有效的方法,特别是如果你没有在“登录”或“注册”中提到这种算法的存在页面,因为攻击者可能会发现你有一个算法来保护网站免受这些类型的攻击,但是没有提及它,所以他们无法对其进行逆向工程并找到绕过它的方法。

很抱歉,如果这不是您正在寻找的答案,请分享我的想法。

编辑:或者您可以使用 RNN(递归神经网络)AI 来检测语言并允许该语言中的特定字符。