Vulnerabilities in password-based login:基于密码登录的漏洞

对于采用基于密码登录过程的网站,用户要么自己注册一个帐户,要么由管理员分配一个帐户。该帐户与一个唯一的用户名和一个秘密密码相关联,用户在登录表单中输入这些信息以进行身份​​验证。
在这种情况下,他们知道秘密密码这一事实就足以证明用户的身份。因此,如果攻击者能够获取或猜测其他用户的登录凭据,则网站的安全性将受到损害。

这可以通过多种方式实现,我们将在下面探讨。

暴力攻击

暴力攻击是指攻击者使用反复试验的系统来尝试猜测有效的用户凭据。这些攻击通常使用用户名和密码的词表自动进行。自动化此过程,尤其是使用专用工具,可能使攻击者能够高速进行大量登录尝试。

暴力并不总是只是对用户名和密码进行完全随机猜测的情况。通过使用基本逻辑或公开可用的知识,攻击者可以微调暴力攻击以做出更有根据的猜测。这大大提高了此类攻击的效率。依赖基于密码的登录作为验证用户身份的唯一方法的网站**,如果没有实施足够的暴力保护,就极易受到攻击**。

暴力破解用户名

如果用户名符合可识别的模式(例如电子邮件地址),则用户名特别容易猜到。例如,在格式中看到业务登录是很常见的:firstname.lastname@somecompany.com。然而,即使没有明显的模式,有时甚至使用可预测的用户名创建高特权帐户,例如admin或administrator。

在审核过程中,检查网站是否公开披露了潜在的用户名。例如,您能否在不登录的情况下访问用户配置文件?即使配置文件的实际内容被隐藏,配置文件中使用的名称有时与登录用户名相同。您还应该检查 HTTP 响应以查看是否泄露了任何电子邮件地址。有时,回复包含高权限用户的信息,比如管理员地址或者其他IT支持

暴力破解密码

密码也可以类似地被暴力破解,其难度因密码的强度而异。许多网站采用某种形式的密码策略,迫使用户创建复杂的密码,至少从理论上讲,单独使用蛮力更难破解。这通常涉及通过以下方式强制创建密码:

  • 最少字符数
  • 小写和大写字母的混合
  • 至少一个特殊字符
    然而,虽然高复杂度的密码很难由计算机单独破解,但我们可以利用人类行为的基本知识来利用用户在不知不觉中引入该系统的漏洞。与使用随机字符组合创建强密码不同,用户通常会使用他们可以记住的密码,并尝试将其撬开以适应密码策略。例如,如果mypassword不允许,用户可以尝试类似Mypassword1!或Myp4$$w0rd替代的方法。

在策略要求用户定期更改密码的情况下,用户只需对其首选密码进行微小的、可预测的更改也很常见。例如,Mypassword1!变成Mypassword1?或Mypassword2!.

了解可能的凭据和可预测的模式意味着暴力攻击通常比简单地迭代每个可能的字符组合更复杂,因此更有效。即,社会工程学

用户名枚举

用户名枚举是指攻击者能够观察网站行为的变化,以确定给定的用户名是否有效。

用户名枚举通常出现在登录页面上,例如,当您输入有效的用户名但密码不正确时,或者在您输入已被使用的用户名时出现在注册表单上。这大大减少了暴力登录所需的时间和精力,因为攻击者能够快速生成有效用户名的候选名单。

在尝试对登录页面进行暴力破解时,您应该特别注意以下方面的任何差异:

  • 状态代码:在暴力攻击期间,返回的 HTTP 状态代码对于绝大多数猜测可能是相同的,因为大多数猜测都是错误的。如果猜测返回不同的状态代码,这强烈表明用户名是正确的。无论结果如何,网站始终返回相同的状态代码是最佳做法,但并不总是遵循这种做法。
  • 错误消息:有时返回的错误消息会有所不同,具体取决于用户名和密码是否都不正确或仅密码不正确。网站的最佳做法是在这两种情况下使用相同的通用消息,但有时会出现小的打字错误。只要一个字符错位就可以使两条消息不同,即使在呈现的页面上看不到该字符的情况下也是如此。
  • 响应时间:如果大多数请求都以相似的响应时间处理,任何与此不同的请求都表明幕后发生了不同的事情。这是猜测的用户名可能是正确的另一个迹象。例如,如果用户名有效,网站可能只检查密码是否正确。这个额外的步骤可能会导致响应时间略有增加。这可能是微妙的,但攻击者可以通过输入一个过长的密码来使这种延迟更加明显,网站需要更长的时间来处理该密码。

三种实验:

有缺陷的暴力保护

在攻击者成功破坏帐户之前,暴力攻击很可能会涉及许多失败的猜测。从逻辑上讲,暴力保护围绕着尝试使过程自动化减慢攻击者尝试登录的速度尽可能棘手。防止暴力攻击的两种最常见方法是:

  • 如果远程用户尝试登录失败次数过多,则锁定他们尝试访问的帐户
  • 如果远程用户连续进行过多的登录尝试,则阻止远程用户的 IP 地址
  • 两种方法都提供不同程度的保护,但都不是无懈可击的,尤其是在使用有缺陷的逻辑实施时。

例如,如果您登录失败的次数过多,有时您可能会发现您的 IP 被阻止。在某些实现中,如果 IP 所有者成功登录,则失败尝试次数的计数器会重置。这意味着攻击者只需每隔几次尝试登录自己的帐户即可防止达到此限制。

在这种情况下,仅在整个单词列表中定期包含您自己的登录凭据就足以使这种防御几乎毫无用处。

实验链接:

账户锁定

网站尝试防止暴力破解的一种方法是在满足某些可疑标准时锁定帐户,通常是一定数量的失败登录尝试。就像正常的登录错误一样,来自服务器的响应表明帐户被锁定也可以帮助攻击者枚举用户名。
锁定帐户可提供一定程度的保护,以防止对特定帐户进行有针对性的暴力破解。然而,这种方法无法充分防止暴力攻击,在这种攻击中,攻击者只是试图访问他们可以访问的任何随机帐户。

例如,可以使用以下方法来解决这种保护:

  • 建立可能有效的候选用户名列表。这可以通过用户名枚举或简单地基于常用用户名列表。
  • 确定一个您认为至少一个用户可能拥有的非常小的密码候选名单。至关重要的是,您选择的密码数量不得超过允许的登录尝试次数。例如,如果您计算出限制为 3 次尝试,则您需要选择最多 3 次密码猜测。
  • 使用诸如 Burp Intruder 之类的工具,使用每个候选用户名尝试每个选定的密码。这样,您可以尝试在不触发帐户锁定的情况下对每个帐户进行暴力破解。您只需要一个用户使用三个密码中的一个就可以入侵一个帐户。

帐户锁定也无法防止凭据填充攻击。这涉及使用大量username:password成对字典,由在数据泄露中窃取的真实登录凭据组成。凭据填充依赖于许多人在多个网站上重复使用相同的用户名和密码这一事实,因此,字典中的某些受损凭据有可能在目标网站上也有效。帐户锁定不能防止凭证填充,因为每个用户名只被尝试一次。凭证填充特别危险,因为它有时会导致攻击者仅通过一次自动攻击就破坏许多不同的帐户。

实验链接:

用户限速

网站尝试防止暴力攻击的另一种方法是通过用户速率限制。在这种情况下,在短时间内发出过多的登录请求会导致您的 IP 地址被阻止。通常,只能通过以下方式之一解锁 IP:

  • 经过一定时间后自动
  • 由管理员手动
  • 成功完成验证码后由用户手动操作

用户速率限制有时比帐户锁定更受欢迎,因为它不太容易发生用户名枚举和拒绝服务攻击。但是,它仍然不是完全安全的。正如我们在早期实验室中看到的一个例子,攻击者可以通过多种方式操纵他们的明文IP 以绕过该块。

由于该限制基于从用户 IP 地址发送的 HTTP 请求的速率,因此如果您可以计算出如何通过单个请求猜测多个密码,有时也可以绕过此防御。

实验链接:

HTTP 基本认证

尽管相当古老,但它相对简单和易于实现意味着您有时可能会看到使用 HTTP 基本身份验证。在 HTTP 基本认证中,客户端从服务器接收一个认证令牌,该令牌是通过将用户名和密码连接起来并用 Base64 编码来构造的。此令牌由浏览器存储和管理,浏览器会自动将其添加到Authorization每个后续请求的标头中,如下所示:

Authorization: Basic base64(username:password)

由于多种原因,这通常不被视为安全的身份验证方法。首先,它涉及在每个请求中重复发送用户的登录凭据。除非网站也实施 HSTS,否则用户凭证很容易被中间人攻击捕获。

此外,HTTP 基本身份验证的实现通常不支持强力保护。由于令牌仅由静态值组成,因此很容易被暴力破解。

HTTP 基本身份验证也特别容易受到与会话相关的攻击,特别是CSRF,它本身不提供任何保护。

在某些情况下,利用易受攻击的 HTTP 基本身份验证可能只会授予攻击者访问看似无趣的页面的权限。但是,除了提供进一步的攻击面之外,以这种方式暴露的凭据可能会在其他更机密的上下文中重复使用。

posted @ 2021-08-19 08:35  Zeker62  阅读(115)  评论(0编辑  收藏  举报