近期,卡巴斯基区块链安全专家在测试区块链平台的漏洞时发现,在该平台上找回密码的过程很容易受到用户名枚举攻击。Web开发人员有必要意识到这种攻击及其危险性。
什么是枚举攻击
具有密码和登录身份验证的Web应用程序通常包括几个与用户数据库交互的组件,包括登录窗口(原因不言而喻)、注册表单(为了避免用户名重复)和密码重置页面(为了确相应的帐户的确存在)。如果Web开发人员没有使用安全的方法实现这些功能,那么黑客将能够利用它们确定数据库中是否存在某个特定的用户名。
以前的开发者在实现这些功能通常不会添加任何的安全保护措施,因此黑客可以使用程序轻松排查一整组用户名。后来,为了避免潜在的攻击者滥用这些功能,开发人员开始采取一些保护技巧,如人机验证、限制登录尝试的次数,或使用星号键等其他方法来隐藏具体的反馈详情。
在如今的Web应用程序中,登录窗口通常都会具备这种级别的保护,然而注册表单和密码重置页面有时则缺乏此类功能。另外,Web开发人员常常会错过的一个细节是,服务器的响应时间也能被用于判定特定用户是否存在于数据库中。打个比方,如果该用户名的确在数据库中,服务器响应只需要2毫秒;若是数据库中没有它,则需要两倍的时间,即4毫秒。对于人类来说,是无法察觉这种毫秒级的差异,但是对于自动枚举工具来说,这就已经是天壤之别。
用户名枚举攻击的危险性
枚举攻击让攻击者得以确认数据库中是否存在某个特定用户名。虽然这不足以让他马上登陆账号,但至少提供了一半的必要信息。例如,在进行暴力破解攻击时,就不再尝试所有的用户名和密码组合,只需为已经确认存在的用户名匹配密码即可,大大节省了时间和精力。
有很多平台都可以使用电邮地址作为用户名。因此,一般的用户会使用同个邮件登录各个网站,但并不是所有网站都同样重视安全问题,各种登录信息和密码组合泄露的消息层出不穷。这些泄漏的数据合集都能在黑客留言板上找到。人们还习惯于在不同的网站上使用相同的密码,因此黑客只要获得你的网站用户名之后,就能够在合集中查找是否有相同的用户名,并获取一系列可能的密码,然后逐一尝试。
此外,鱼叉式钓鱼攻击的发起者通常在侦查阶段使用枚举攻击的方法。当他们确认自己的目标在你的服务中有帐户后,就可以发送一封貌似来自你的网站的电子邮件,要求用户更改密码,并链接到一个看起来像真实网站的钓鱼页面。不知情的用户在设置新密码时,还必须确认旧密码,这为骗子提供了他们所需的一切。
如何保护自己免受枚举攻击
你是否有注意过在提交密码重置表单后,现在网站的反馈方式?他们用”如果该邮箱存在于我们的数据库中,我们将给您发送一封附有链接的邮件。”统一替代了以往”已向您发送重置密码的链接”或”您的用户名不存在”这样的提示信息。也就是说,网站不会明确表明该用户名是否存在,这都是为了防止枚举攻击而特别做出的改变。
同理,当用户输入了错误登陆信息时,也无需说明究竟是密码错误,还是系统中不存在这个用户名,只要表示没有找到对应的用户名/密码组合即可。从用户体验的角度来看,这不是十分理想的解决方案。例如,当我认为自己记得密码,只是无法确认到底用哪个邮箱注册账号时,或是只记得用户名却想不起密码时,网站没有给出任何的提示告诉我究竟时哪里出了错,就会让人感到异常恼火。然而实际上,安全性总是以牺牲便捷性为代价,针对于身份验证服务,有一点安全性偏差是合理的。
当然,使用人机验证和限制登录尝试也是必要措施。为了确保您的Web应用安全性,我们建议您进行第三方检查。如果您有在使用区块链技术,我们卡巴斯基区块链安全的同事可以帮助您进行Web应用安全性分析。