当用户名是电子邮件地址时,用户名枚举是否实用?

信息安全 Web应用程序 枚举 用户枚举
2021-08-10 07:15:39

据我了解,显示信息丰富的失败登录消息是不好的安全做法,例如:

您输入的邮箱不存在

代替

不正确的电子邮件/密码组合

因为它可能导致用户名枚举。这真的是枚举登录的有效方法吗?似乎您可以利用这一点的唯一方法是提出一个包含数百万电子邮件地址的庞大列表,然后查看是否有任何帐户。考虑到电子邮件地址的数量,这似乎是一个遥远的目标。现实世界中是否有此类漏洞被利用的例子?

4个回答

让我给你一个假设但非常合理的场景的例子。

有一个名叫 Bob 的有抱负的黑客。一个阳光明媚的早晨,Bob 在一个名为 HandBook 的流行社交网站中发现了一个 SQL 注入漏洞。使用上述 SQL 注入漏洞,Bob 设法转储了在 HandBook 注册的帐户的电子邮件地址和密码列表。鉴于 HandBook 有一个糟糕的安全团队,所有的密码都用MD5. 破解他可信赖的彩虹表,Bob 设法恢复了 86% 的用户帐户的明文密码。

鲍勃接下来要做什么?Bob 知道 HandBook 上 86% 的用户是青少年。青少年更喜欢一个社交网站吗?当然是两个社交网站!Bob 决定尝试使用他设法破解的所有电子邮件地址和密码组合来对抗第二个流行的社交网站 Chatter 的身份验证服务。鉴于青少年是青少年,他们没有强密码策略。Bob 只需尝试相同的密码或接近的变体即可访问 76% 的用户帐户。他能够很快完成此操作,因为当他尝试使用不存在的电子邮件地址登录时,Chatter 的登录表单会友好地通知他。

这是一个缺陷吗?是的,有可能。我在另一个答案中提到了这一点。有人指出,如果注册帐户的用户名可以以其他方式枚举,例如通过注册页面,这可能不是主要问题。但是,许多注册页面都受到 CAPTCHA 的保护,这使得针对它的自动尝试变得更加困难。

这是古老的传说。

过去,人们使用大型机和非常糟糕的密码,因此保护帐户名是“重要的”:如果攻击者知道实际用户的姓名,那么他可以尝试密码,并且当时尝试几十个密码倾向于工作。

当然,这并不令人满意,因为用户并不是真正的秘密信息。拥有强密码要好得多。

如今,隐藏用户名已经不那么重要了,在某些情况下也是不可能的。例如,当用户使用他选择的“名称”在某个网站上注册时,该网站必须警告他有重复,这是不可避免的;该站点不能容忍两个具有相同名称的用户。在这种情况下,真正隐藏用户名是不可行的;因此,隐藏用户名最好是没有意义的。正如@Terry 所提到的,注册页面上的验证码可能会使用户名枚举更难自动进行(但“更难”与“难”不同)。

因此,无法区分不存在的登录名和错误密码的登录失败消息仍在广泛使用,但更多的是出于传统原因,而不是出于强烈的理性原因。


但请注意,有一些僵尸网络试图通过使用“通用用户名和密码”在随机 IP 地址上尝试 SSH 登录来进行复制。只需检查auth.logLinux 服务器的文件,您就会看到这些尝试。此类僵尸网络多年来一直这样做。他们可能会出于传统的感觉(没有理由相信邪恶的人比非邪恶的人更能胜任他们所做的事情),但这种蛮力可能真的适用于非邪恶的人。可忽略的成功概率;区分错误登录名和错误密码的失败消息只能帮助这些僵尸网络。

因此,虽然避免泄露用户名的整个概念大多是旧时代的历史遗留物,但它在某些极端情况下仍然具有一定的价值,主要是盲目攻击者的大规模暴力破解。

如果攻击者正在进行社会工程攻击。攻击者可以将受害者电子邮件地址放入登录表单中。然后我们将能够知道受害者是否在特定电子邮件下注册。如果受害者注册到一个网站,攻击者将在该网站上创建一个帐户,并尝试进行社会工程攻击。我认为它不会阻止攻击者,但是通过不给出“您输入的电子邮件不存在”的消息,它应该会减慢攻击速度。

GDPR 稍微改变了对此的看法。如果您泄露某人在您的网站上拥有一个帐户,那么您现在正在泄露有关该人的 PII(个人身份信息),如果该人是欧盟居民,则可能会使您面临罚款。