凭据填充攻击预防速查表¶
简介¶
本速查表涵盖了针对两种常见的认证相关攻击的防御措施:凭据填充攻击和密码喷射攻击。尽管这些是独立的、不同的攻击,但在许多情况下,为防范它们而实施的防御措施是相同的,并且它们对暴力攻击也同样有效。这些不同攻击的总结如下:
攻击类型 | 描述 |
---|---|
暴力破解 | 针对单个账户测试来自字典或其他来源的多个密码。 |
凭据填充攻击 | 测试从其他网站泄露中获得的用户名/密码对。 |
密码喷射攻击 | 针对大量不同账户测试单个弱密码。 |
多因素认证¶
多因素认证(MFA)是迄今为止对抗大多数密码相关攻击(包括凭据填充和密码喷射)的最佳防御手段,微软的分析表明它可以阻止 99.9%的账户泄露。因此,应尽可能实施MFA。过去,根据应用程序的受众,强制使用MFA可能不切实际或不可行,但随着现代浏览器和移动设备现在支持FIDO2 Passkey和其他形式的MFA,这对于大多数用例来说都是可以实现的。
为了平衡安全性和可用性,多因素认证可以与其他技术结合使用,仅在有理由怀疑登录尝试可能不合法(例如来自以下情况的登录)的特定情况下才要求进行第二因素认证:
- 新的浏览器/设备或IP地址。
- 异常国家或地区。
- 被认为不可信或通常不包含服务用户的特定国家。
- 出现在已知拒绝列表或与匿名服务(如代理或VPN服务)相关的IP地址。
- 尝试登录多个账户的IP地址。
- 看起来是脚本或机器人而非人类的登录尝试(即来自单个IP或子网的大量登录请求)。
或者组织可以选择在会话期间针对上述场景以及请求高风险活动(如以下情况)时,要求以“渐进式”认证的形式进行MFA:
- 大额货币交易
- 特权或管理配置更改
此外,对于企业应用程序,可以将已知的可信IP范围添加到允许列表中,以便用户从这些范围连接时不需要MFA。
替代防御¶
在无法实施MFA的情况下,有许多替代防御措施可用于防范凭据填充和密码喷射攻击。单独来看,这些防御措施都没有MFA有效,但是多层防御可以提供合理的保护程度。在许多情况下,这些机制也将防范暴力破解或密码喷射攻击。
如果应用程序有多个用户角色,则可能需要为不同的角色实施不同的防御措施。例如,对所有用户强制实施MFA可能不可行,但应要求所有管理员都使用MFA。
纵深防御与指标¶
虽然这不是一种具体的技术,但重要的是要实施防御措施,考虑单个防御措施被攻破或失效的影响。例如,客户端防御(如设备指纹识别或JavaScript挑战)可能会被欺骗或绕过,因此应实施其他防御层来弥补这一点。
此外,每种防御措施都应生成用于检测机制的流量指标。理想情况下,这些指标将包括已检测到和已缓解的攻击流量,并允许按IP地址等字段进行筛选。监控和报告这些指标可以识别防御失败或未识别攻击的存在,以及新的或改进的防御措施的影响。
最后,当不同防御措施的管理由多个团队执行时,应注意确保在不同团队执行维护、部署或以其他方式修改单个防御措施时进行沟通和协调。
辅助密码、PIN码和安全问题¶
除了要求用户在认证时输入其密码外,还可以提示用户提供额外的安全信息,例如:
- 一个PIN码
- 辅助密码或助记词中的特定字符
- 安全问题的答案
必须强调的是,这不构成多因素认证(因为两个因素都是相同的——你所知道的东西)。然而,在无法实施适当MFA的情况下,它仍然可以为凭据填充和密码喷射提供有用的保护层。
验证码 (CAPTCHA)¶
要求用户在每次登录尝试时解决一个“完全自动化公共图灵测试以区分计算机和人类”(CAPTCHA)或类似的谜题,有助于识别自动化/机器人攻击并帮助阻止自动化登录尝试,并可能减缓凭据填充或密码喷射攻击。然而,CAPTCHA并非完美,在许多情况下,存在可用于以相当高的成功率破解它们的工具或服务。监控CAPTCHA的解决率可能有助于识别对正常用户的影响,以及自动化CAPTCHA破解技术(可能通过异常高的解决率来表明)。
为了提高可用性,当登录请求被认为是可疑或高风险时,可能需要才要求用户解决CAPTCHA,使用MFA部分中讨论的相同标准。
IP缓解和情报¶
阻止IP地址可能足以阻止不那么复杂的攻击,但不应作为唯一或主要的防御措施,因为规避起来很容易。更有效的方法是对滥用行为采取分级响应,根据攻击的不同因素利用多种防御措施。
任何缓解(包括阻止和CAPTCHA)来自IP地址的凭据填充流量的过程或决策都应考虑多种滥用场景,而不是依赖单一可预测的流量限制。应考虑短(即突发)和长两种时间周期,以及高请求量和单个IP地址(可能与许多其他IP地址协同)产生低但持续流量的情况。此外,缓解决策应考虑IP地址分类(例如:住宅 vs 托管)和地理位置等因素。这些因素可用于提高或降低缓解阈值,以减少对合法用户的潜在影响,或更积极地缓解来自异常来源的滥用行为。缓解措施,特别是阻止IP地址,应是临时的,并且应有程序在滥用行为减少或停止时将IP地址从缓解状态中移除。
许多凭据填充工具包,如Sentry MBA,提供内置的代理网络使用功能,将请求分散到大量独立的IP地址。这可能会击败IP黑名单和速率限制,因为每个IP的请求量可能仍然相对较低,即使在高流量攻击中也是如此。将认证流量与代理和类似的IP地址情报以及托管服务提供商的IP地址范围进行关联,可以帮助识别高度分散的凭据填充攻击,并作为缓解触发器。例如,可以要求来自托管服务提供商的每个请求都解决CAPTCHA。
有公共和商业的IP地址情报和分类来源可用作此目的的数据源。此外,一些托管服务提供商会公布自己的IP地址空间,例如AWS。
除了阻止网络连接之外,还应考虑存储账户的IP地址认证历史记录。如果最近的IP地址被添加到阻止或缓解列表中,则可能需要锁定账户并通知用户。
设备指纹识别¶
除了IP地址之外,还有许多不同的因素可用于尝试识别设备指纹。其中一些可以由服务器从HTTP头部(特别是“User-Agent”头部)被动获取,包括:
- 操作系统和版本
- 浏览器和版本
- 语言
使用JavaScript可以访问更多信息,例如:
- 屏幕分辨率
- 已安装字体
- 已安装浏览器插件
利用这些各种属性,可以创建设备的指纹。然后可以将此指纹与任何尝试登录账户的浏览器进行匹配,如果它不匹配,则可以提示用户进行额外的认证。许多用户会使用多个设备或浏览器,因此简单地阻止不匹配现有指纹的尝试是不切实际的,但是通常会定义一个流程,供用户或客户查看其设备历史记录并管理其记住的设备。此外,这些属性还可以用于检测异常活动,例如设备似乎运行的是较旧版本的操作系统或浏览器。
fingerprintjs2 JavaScript库可用于执行客户端指纹识别。
需要注意的是,由于所有这些信息都由客户端提供,因此攻击者可能会伪造。在某些情况下,伪造这些属性很简单(例如“User-Agent”头部),但在其他情况下,修改这些属性可能更加困难。
连接指纹识别¶
与设备指纹识别类似,网络连接有多种指纹识别技术。例如JA3、HTTP/2指纹识别和HTTP头部顺序。由于这些技术通常侧重于连接的建立方式,因此连接指纹识别可能比依赖指标(如IP地址)或请求数据(如用户代理字符串)的其他防御措施提供更准确的结果。
连接指纹识别还可以与其他防御措施结合使用,以确定认证请求的真实性。例如,如果用户代理头部和设备指纹表明是移动设备,但连接指纹表明是Python脚本,则该请求很可能是可疑的。
要求不可预测的用户名¶
凭据填充攻击不仅依赖于密码在多个站点之间的重复使用,还依赖于用户名的重复使用。大量网站使用电子邮件地址作为用户名,由于大多数用户会为所有账户使用同一个电子邮件地址,这使得电子邮件地址和密码的组合对于凭据填充攻击非常有效。
要求用户在网站注册时创建自己的用户名,使得攻击者更难获得有效的用户名和密码对进行凭据填充,因为许多可用的凭据列表只包含电子邮件地址。为用户提供生成的用户名可以提供更高程度的保护(因为用户很可能在大多数网站上选择相同的用户名),但这对用户不友好。此外,需要注意确保生成的用户名不可预测(例如基于用户的全名或顺序数字ID),因为这可能使密码喷射攻击中枚举有效用户名变得更容易。
多步登录流程¶
大多数现成的工具都设计用于单步登录流程,其中凭据被POST到服务器,并且响应指示登录尝试是否成功。通过在此过程中添加额外的步骤,例如要求用户名和密码按顺序输入,或者要求用户首先获得一个随机的CSRF Token才能登录,这使得攻击执行起来稍微困难,并且使攻击者必须进行的请求数量翻倍。
然而,多步登录流程应注意不要促进用户枚举。在凭据填充攻击之前枚举用户可能会导致更难识别的低请求量攻击。
要求JavaScript并阻止无头浏览器¶
用于此类攻击的大多数工具会直接向服务器发送POST请求并读取响应,但不会下载或执行其中包含的JavaScript。通过要求攻击者评估响应中的JavaScript(例如生成必须随请求提交的有效令牌),这迫使攻击者要么使用带有Selenium或Headless Chrome等自动化框架的真实浏览器,要么使用PhantomJS等其他工具实现JavaScript解析。此外,还有许多技术可用于识别无头Chrome或PhantomJS。
请注意,阻止禁用JavaScript的访问者将降低网站的可访问性,尤其是对使用屏幕阅读器的访问者。在某些司法管辖区,这可能违反平等法。
降级¶
一种更激进的凭据填充攻击防御措施是实施增加攻击完成时间的措施。这可能包括逐步增加必须评估的JavaScript的复杂性、在响应请求前引入长时间的等待期、返回过大的HTML资产或返回随机错误消息。
由于这类防御措施可能对合法用户产生负面影响,因此必须非常谨慎地使用,尽管在缓解更复杂的凭据填充攻击时可能需要它。
识别泄露的密码¶
应实施ASVS v4.0 密码安全要求规定 (2.1.7),即验证新密码是否出现在已泄露密码数据集中。
有商业和免费服务可用于验证密码是否出现在之前的泄露中。一个著名的免费服务是Pwned Passwords。你可以自行托管该应用程序的副本,或使用其API。
通知用户异常安全事件¶
当检测到可疑或异常活动时,通知或警告用户可能很合适。然而,应注意不要让用户收到大量不重要的通知而感到不知所措,否则他们会开始忽略或删除它们。此外,由于密码在多个网站上经常重复使用,应考虑用户电子邮件账户也可能已被泄露的可能性。
例如,通常不适合通知用户曾有人尝试使用不正确的密码登录其账户。但是,如果已使用正确密码登录,但随后未能通过MFA检查,则应通知用户,以便他们可以更改密码。随后,如果用户从不同设备或IP地址请求多次密码重置,则可能需要在进一步用户验证流程完成之前阻止对账户的进一步访问。
与当前或最近登录相关的详细信息也应向用户显示。例如,当他们登录应用程序时,可以向他们显示上次登录尝试的日期、时间和位置。此外,如果应用程序支持并发会话,用户应能够查看所有活动会话的列表,并终止任何不合法的其他会话。
参考资料¶
- OWASP 凭据填充攻击文章
- OWASP 针对Web应用程序的自动化威胁
- 项目:OAT-008 凭据填充,这是该项目制作的OWASP 自动化威胁手册中定义的20种威胁之一。