基于密码登录中的漏洞
在本节中,我们将更详细地了解基于密码的登录机制中常见的一些漏洞,并提出可能被利用的方式。甚至还提供一些交互式实验室,以便可以尝试自行利用这些漏洞。
对于采用基于密码的登录流程的网站,用户要么自己注册账户,要么由管理员分配账户。该账户与唯一的用户名和密码相关联,用户通过登录表单输入这些信息以验证自己的身份。
在这种情况下,他们知道密码这一事实就足以证明用户的身份。因此,如果攻击者能够获取或猜测到另一个用户的登录凭证,则网站的安全性将会受到威胁。
这可以通过多种方式实现,我们将在下面探讨。
暴力破解攻击
暴力破解攻击是指攻击者使用试错系统来尝试猜测有效的用户凭证。这些攻击通常使用用户名和密码的字典自动进行的。自动化这个过程,尤其是使用专门的工具,可能使攻击者能够快速进行大量的登录尝试。
暴力破解并不总是完全随机地猜测用户名和密码。通过使用基本逻辑或公开可得的知识,攻击者可以调整暴力破解攻击,进行更加有根据的猜测。这极大地增加了此类攻击的效率。如果网站仅依赖基于密码的登录作为其唯一的用户认证方法,并未实施足够的防暴力破解保护措施,那么它们可能会非常容易受到攻击。
暴力破解用户名
如果用户名符合可识别的模式,例如电子邮件地址,那么它就很容易被猜测出来。例如,我们经常会看到企业登录以firstname.lastname@somecompany.com的格式出现。然而,即使没有明显的模式,有时甚至是高权限的账户也会使用可预测的用户名,比如admin或administrator。
在审计过程中,请检查网站是否公开泄露潜在的用户名。例如,是否能够在未登录的情况下访问用户个人资料?即使个人资料的实际内容被隐藏,但个人资料中使用的名称有时与登录用户名相同。你还应该检查HTTP响应,看是否泄露了任何电子邮件地址。有时,响应中包含高权限用户(如管理员和IT支持)的电子邮件地址。
暴力破解密码
密码同样可以被暴力破解,其难度取决于密码的强度。许多网站采用某种形式的密码策略,强制用户创建具有高熵的密码,从理论上来说,仅通过暴力破解很难破解它们。通常,这涉及以下密码要求:
最少字符数要求
包含大小写字母的混合
至少包含一个特殊字符
然而,尽管高熵密码仅靠计算机是很难破解的,但我们可以利用对人类行为的基本了解来利用用户无意中引入该系统的漏洞。用户通常不会创建一个由随机字符组合而成的强密码,而是采用一个他们能记住的密码,并试图迎合密码策略。例如,如果mypassword是不允许的,用户可能会尝试类似Mypassword1!或Myp4$$w0rd这样的密码。
在密码策略要求用户定期更改密码的情况下,用户通常只会对其首选密码进行微小且可预测的更改。例如,Mypassword1!变成Mypassword1?或Mypassword2!.
对可能的凭证和可预测模式的了解意味着暴力破解攻击通常可以更加复杂和有效,而不仅仅是迭代尝试每种可能的字符组合。
用户名枚举
用户名枚举是指攻击者能够观察网站的行为变化,以确定给定的用户名是否有效。
用户名枚举通常发生在登录页面,例如,当你输入一个有效的用户名但密码错误时,或者在注册表单上输入一个已被占用的用户名时。这极大地减少了暴力破解登录所需的时间和精力,因为攻击者能够快速生成一个有效用户名的名单。
在尝试暴力破解登录页面时,你应特别注意以下方面的差异:
状态码:在暴力破解攻击期间,返回的HTTP状态码对于绝大多数猜测来说可能是相同的,因为大部分猜测都是错误的。如果一个猜测返回了不同的状态码,这是用户名正确的强烈指示。网站最佳实践是无论结果如何,始终返回相同的状态码,但并非总是遵循这种做法。
错误信息:有时,返回的错误信息会根据用户名和密码都不正确还是仅密码不正确而不同。网站最佳实践是在两种情况下都使用相同的通用信息,但有时会出现一些小的打字错误。即使只有一个字符位置错误,两条信息也会不同,即使该字符在呈现的页面上不可见。
响应时间:如果大多数请求的响应时间相似,任何与此不同的请求都表明后台发生了不同的事情。这是另一个表明猜测的用户名可能正确的迹象。例如,网站可能仅在用户名有效时检查密码是否正确。这个额外的步骤可能导致响应时间略有增加。这可能是微妙的,但攻击者可以通过输入一个明显需要更长时间处理的过长密码来使这个延迟更加明显。
LAB
LAB
LAB
有缺陷的暴力破解保护
在攻击者成功破坏一个账户之前,暴力破解攻击很可能会涉及许多失败的猜测。从逻辑上讲,暴力破解保护的重点在于尽可能地使自动化过程变得困难,并降低攻击者尝试登录的速度。防止暴力破解攻击的两种最常见方法是:
如果远程用户尝试登录失败的次数过多,则锁定他们尝试访问的账户。
如果远程用户在短时间内尝试登录次数过多,则阻止其IP地址。
这两种方法都提供不同程度的保护,但都不是绝对安全的,特别是在采用有缺陷的逻辑进行实现时。
例如,有时如果你登录失败太多次,你的IP地址将被封禁。在某些实现中,如果IP的所有者成功登录,则失败尝试次数的计数器将重置。这意味着攻击者只需每隔几次尝试登录到自己的账户,就可以防止达到此限制。
在这种情况下,仅仅在单词列表中的常规间隔中包含自己的登录凭证就足以使这种防御几乎无效。
LAB
账户锁定
网站为了防止暴力破解,有一种方式是当满足某些可疑条件时(通常是一定数量的登录失败尝试)锁定账户。就像普通的登录错误一样,服务器返回表明账户已被锁定的响应也可以帮助攻击者枚举用户名。
LAB
锁定账户在防止特定账户受到有针对性的暴力破解攻击方面提供了一定的保护。然而,这种方法无法充分地防止暴力破解攻击,即攻击者仅仅试图获取任意随机账户的访问权限。
例如,可以使用以下方法绕过此类保护:
建立一个可能有效的候选用户名列表。这可以通过用户名枚举或仅基于常见用户名列表来实现。
决定一个非常小的密码短列表,你认为至少有一个用户可能拥有这些密码。至关重要的是,你选择的密码数量不能超过允许的登录尝试次数。例如,如果你已经确定尝试次数限制为3次,则需要选择最多3个密码猜测。
使用Burp Intruder等工具,尝试将所选的每个密码与每个候选用户名组合在一起。这样,你可以在不触发账户锁定的情况下尝试暴力破解每个账户。只需要一个用户使用其中三个密码之一即可破坏一个账户。
账户锁定也无法防止撞库攻击。这涉及使用大量的 username:password对字典,由在数据泄露中被盗的真实登录凭证组成。撞库攻击依赖于许多人在多个网站上重复使用相同的用户名和密码,因此这个字典中的一些被泄露的凭证也有可能在目标网站上有效。账户锁定无法防止撞库攻击,因为每个用户名只尝试一次。撞库攻击特别危险,因为它有时可能导致攻击者在单次自动化攻击中破坏许多不同的账户。
用户速率限制
网站防止暴力破解攻击的另一种方式是通过用户速率限制。在这种情况下,在短时间内进行过多的登录请求会导致你的IP地址被封禁。通常,IP地址只能通过以下方式解除:
在一定的时间段后自动解除
管理员手动解除
用户在成功完成验证码后手动解除
用户速率限制有时比账户锁定更受欢迎,因为它更不容易受到用户名枚举和拒绝服务攻击的影响。然而,它仍然不是完全安全的。正如我们在之前的实验中看到的一个例子,攻击者有几种方法可以操纵其表面的IP地址以绕过封禁。
由于限制是基于从用户的IP地址发送的HTTP请求的速率,如果你可以找出如何使用单个请求猜测多个密码,那么有时也可以绕过这种防御措施。
LAB
HTTP basic认证
尽管相当古老,但由于其相对简单和易于实现,你有时可能会看到HTTP basic认证被使用。在HTTP basic认证中,客户端从服务器接收一个认证令牌,该令牌由用户名和密码连接后进行Base64编码构成。此令牌由浏览器存储和管理,并在每个后续请求的Authorization标头中自动添加,如下所示:
出于多种原因,通常不认为这是一种安全的认证方法。首先,它涉及在每个请求中重复发送用户的登录凭证。除非网站还实现了HSTS,否则用户凭证很容易在中间人攻击中被捕获。
此外,HTTP basic认证的实现通常不支持暴力破解保护。由于令牌仅包含静态值,这使得它容易受到暴力破解攻击的威胁。
HTTP basic认证对会话相关的漏洞,尤其是CSRF,也特别容易受到攻击,在这方面它本身不提供任何保护。
在某些情况下,利用易受攻击的HTTP basic认证可能只允许攻击者访问一个看似无趣的页面。然而,除了提供进一步的攻击面之外,以这种方式暴露的凭证可能会在其他更机密的情况中被重复使用。
Last updated