基于密码的漏洞
翻译
原文:https://portswigger.net/web-security/authentication/password-based
- name: 翻译
desc: 原文:https://portswigger.net/web-security/authentication/password-based
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 基于密码的漏洞
在本节中,我们将更仔细地研究基于密码的登录机制中 出现的一些最常见的漏洞。我们还将提出可能被利用的方法。还有一些交互式实验室,你可以自己尝试利用这些漏洞。
对于采用密码登录流程的网站,用户要么自己注册一个帐户,要么由管理员分配一个帐户。此帐户与唯一的用户名和密码相关联,用户在登录表单中 输入这些信息以验证自己的身份。
在这种情况下,“他们知道密码” 这一事实就足以证明用户的身份。因此,如果攻击者能够获得 或 猜测另一个用户的登录凭据,则网站的安全性将会受到损害。
这可以通过多种方式实现,我们将在下面进行探讨。
# 1.1暴力攻击(暴力破解攻击 / 穷举攻击)
暴力攻击是指:
- 攻击者使用试错系统,试图猜测有效的用户凭据。
- 这些攻击通常是 使用用户名和密码的单词列表自动执行的。
- 自动化此过程,尤其是使用专用工具时,攻击者能够高速进行大量登录尝试。
暴力破解 并不总是对用户名和密码进行完全随机的猜测。通过使用基本逻辑 或 公开可用的信息,攻击者可以对暴力攻击进行微调,以做出更有根据的猜测。
这大大提高了此类攻击的效率。依赖基于密码的登录 作为唯一认证方法的网站,如果没有实施足够的暴力破解保护,则可能非常容易受到攻击。
# 1.1.1用户名暴力破解
如果用户名为可识别的信息(例如电子邮件地址),则用户名特别容易被猜出。
例如,经常可以看到格式为firstname.lastname@somecompany.com
的登录。但是,即使没有明显的信息,有时甚至可以使用 “可预测的用户名” 来创建高特权帐户(例如admin
或administrator
)。
在审计过程中,检查网站是否公开披露了 潜在的用户名。例如,你是否能够在不登录的情况下,访问用户配置文件?即使配置文件的实际内容被隐藏,配置文件中使用的名称 有时也与登录用户名相同。
你还应该检查 HTTP 响应,以查看是否披露了任何电子邮件地址。有时,响应中会包含高特权用户的电子邮件地址(例如 管理员和 IT 支持)。
# 1.1.2密码暴力破解
密码同样可以被暴力破解,破解的难度 根据密码的强度而有所不同。许多网站采用多种形式的密码策略,迫使用户创建高强度密码,至少从理论上讲,仅使用蛮力 会更难破解。这通常 涉及以下强密码执行方式:
- 最小字符数
- 小写和大写字母的混合
- 至少一个特殊字符
然而,虽然高强度密码很难被计算机单独破解,但我们可以利用人类行为的基本知识,来利用用户无意中引入该系统的漏洞。用户通常不会使用随机字符组合 来创建强密码,而是使用一个他们能记住的密码,并尝试将其撬入密码策略中。
- 例如,如果不允许使用
mypassword
,用户可以尝试使用Mypassword1!
或者Myp4$$w0rd
。
如果策略要求用户定期更改其密码,则用户通常只对其首选密码进行微小的、可预测的更改。
- 例如,将
Mypassword1!
改为Mypassword1?
或Mypassword2!
这种对可能的凭据 和 可预测模式的了解,意味着暴力攻击通常比 简单地遍历所有可能的字符组合 要复杂得多,因此也更有效。
# 1.1.3用户名枚举
用户名枚举是指:攻击者能够观察网站行为的变化,以确定给定的用户名是否有效。
用户名枚举通常发生在
- 登录页面上(例如,当你输入一个有效的用户名 但密码不正确时),
- 或者 注册表单上(例如,当你输入一个已经存在的用户名时)。
这大大减少了暴力登录所需的时间和精力,因为攻击者能够快速生成有效用户名的短名单。
在登录页面 尝试暴力破解时,你应该注意以下方面的差异:
- 状态码:在暴力攻击期间,对于绝大多数猜测,返回的 HTTP 状态码可能是相同的,因为大多数猜测都是错误的。如果猜测返回不同的状态码,这就强有力地表明用户名是正确的。无论结果如何,网站总是返回相同的状态码是最佳实践,但这种实践并不总是被遵循。
- 错误消息:有时返回的错误消息会有所不同,取决于用户名和密码都不正确,或仅密码不正确。在这两种情况下,网站最好使用相同的通用消息,但有时会出现一些小的输入错误。例如,只要一个字符的位置不合适,就可以使两个消息不同,即使该字符在呈现的页面上不可见。
- 响应时间:如果大多数请求 都以相似的响应时间处理,那么任何偏离此时间的请求都表明 幕后发生了不同的事情。这表明猜测的用户名可能是正确的。例如,网站可能只在用户名有效的情况下,才会检查密码是否正确。这个额外的步骤可能会导致响应时间略有增加。这可能很微妙,但攻击者可以通过输入一个过长的密码,来使这种延迟更加明显,网站需要更长的时间来处理。
- name: 实验室-学徒
desc: 通过不同的响应进行用户名枚举 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
- name: 实验室-从业者
desc: 通过响应的细微差异进行用户名枚举 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-subtly-different-responses
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
- name: 实验室-从业者
desc: 通过响应的时差进行用户名枚举 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-response-timing
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.2有缺陷的暴力破解防护机制
在攻击者成功入侵帐户之前,暴力攻击很可能会涉及许多失败的猜测。
从逻辑上讲,暴力攻击防护的核心是 尽可能使保护过程自动化,并降低攻击者尝试登录的速度。防止暴力攻击的两种最常见方法是:
- 如果目标用户登录失败的次数过多,则锁定该用户试图访问的账户(锁定用户名)
- 如果远程用户在短时间内,进行过多的尝试登录,则阻止目标用户的 IP 地址(锁定IP)
这两种方法都提供了不同程度的保护,但都不是牢不可破的,特别是 在使用有缺陷的逻辑实现时。
例如,如果你登录失败的次数过多,你可能会发现你的 IP 被阻止。在某些实现中,如果 IP 所有者成功登录,则失败尝试次数的计数器将会重置。这意味着攻击者只需每隔几次 再尝试登录自己的帐户,就可以防止达到此限制。
在这种情况下,仅需要在整个字典中,定期包含你自己的登录凭据,就足以使这种防御失去作用。
- name: 实验室-从业者
desc: 暴力破解防护-IP锁定机制 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/password-based/lab-broken-bruteforce-protection-ip-block
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 1.2.1账户锁定
网站试图防止暴力破解的另一种方法是,在满足某些可疑条件(通常是登录失败的次数)时锁定帐户。与正常的登录错误一样,来自服务器的响应信息-提示帐户已锁定,这也可以帮助攻击者枚举用户名。
- name: 实验室-从业者
desc: 暴力破解防护-账户锁定机制 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-account-lock
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
锁定帐户 虽然可以提供一定程度的保护,防止针对某一特定帐户的暴力破解。但是,这种方法无法充分防止暴力攻击,在这种攻击中,攻击者只是试图获得 任何随机帐户的访问权。
例如,可以使用以下方法来绕过这种保护:
- 建立一个可能有效的候选用户名列表。这可以通过用户名枚举 或 仅基于常见用户名列表来实现。
- 选择一个你认为 密码强度可能较弱的账户,筛选出密码列表。至关重要的是,你选择的密码数量不能超过允许的登录尝试次数。例如,如果你已经计算出该限制是 3 次尝试,则最多只能选择 3 个密码来猜测。
- 使用 Burp Intruder 等工具,尝试对每个候选账户 使用每个选定的密码。这样,你就可以在不触发帐户锁定的情况下,尝试暴力破解每个帐户。你只需要对单个用户 使用三个密码中的一个,就可以破坏帐户。
帐户锁定也无法防止凭据填充攻击(撞库攻击)。这涉及 使用大量的username:password
正确字典,这是在数据泄露事件中,由被盗的真实登录凭据组成。凭据填充攻击依赖于 许多人在多个网站上,重复使用相同的用户名和密码 这一事实,因此,字典中的某些受损凭据,也可能在其它的一些网站上有效。帐户锁定不能防止撞库,因为每个用户名只尝试一次。撞库特别危险,因为它有时会导致攻击者 仅通过一次自动攻击,就破坏了许多不同的帐户。
# 1.2.2用户速率限制
网站试图防止暴力攻击的另一种方法是:用户速率限制。在这种情况下,在短时间内发出过多的登录请求,会导致你的 IP 地址被阻止。通常情况下,只能通过以下方式之一 来对 IP 进行解封:
- 经过一段时间后自动解封
- 由管理员手动解封
- 用户成功完成验证码后解封(用户手动)
用户速率限制,有时比帐户锁定更受欢迎,因为它不太容易受到用户名枚举 和 拒绝服务攻击。然而,它也不是绝对安全的。正如我们在前面的实验中 看到的示例,攻击者可以通过多种方式,操纵其表现的 IP 以绕过限制。
由于该限制是基于:从用户的 IP 地址 发送的 HTTP 请求的速率。
因此,如果你能够解决:如何通过单个请求猜测多个密码,则有时也可以绕过此防御。
- name: 实验室-专家
desc: 暴力破解防护-一个请求多个凭据 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/password-based/lab-broken-brute-force-protection-multiple-credentials-per-request
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6
# 1.3HTTP基本身份认证(HTTP Basic Auth)
虽然相当古老,但它相对简单且易于实现,这意味着你有时可能会 看到某个网站正在使用 HTTP 基本身份验证。
在 HTTP 基本身份验证中,客户端从服务器接收身份验证令牌,该令牌是通过连接用户名和密码,并以 Base64 编码来构造的。此令牌由浏览器存储和管理,浏览器会自动将其添加到每个后续请求的Authorization
标头中,如下所示:
Authorization: Basic base64(username:password)
出于多种原因,这通常 不被认为是安全的身份验证方法。首先,它涉及 在每个请求中,重复发送用户的登录凭据。除非该网站同步实施了 HSTS,否则用户凭据很容易在中间人攻击中被捕获。
此外,HTTP 基本身份验证的实现,通常不支持暴力攻击防护。由于令牌仅由静态值组成,因此这可能使其容易受到暴力破解。
HTTP 基本身份验证,也特别容易受到 与会话相关的攻击,特别是CSRF (opens new window),因为它(Basic auth)本身不提供任何保护机制。
在某些情况下,利用易受攻击的 HTTP 基本身份验证,可能只允许攻击者访问 其看似不感兴趣的页面的权限。但是,除了提供进一步的攻击面之外,以这种方式暴露的凭据,可能会在其他更机密的上下文中被重复使用。