身份验证漏洞

身份验证漏洞

文章内容大部分源于portswigger官方文档
实验为portswigger官方靶场,实验wp参考官方和https://bbs.huaweicloud.com/blogs/389369

本文结合实验的思维导图
在这里插入图片描述

身份验证漏洞可让攻击者访问敏感数据和功能。

它们还会暴露出更多的攻击面,从而被进一步利用。
在这里插入图片描述

什么是身份验证

在了解身份验证漏洞之前,首先需要知道什么是身份验证机制

  • 身份验证是验证用户或客户身份的过程。网站有可能暴露给任何连接到互联网的人。因此,强大的身份验证机制是有效的网络安全不可或缺的一部分。

身份验证主要有三种类型

  1. 知识因素: 你知道的东西 — 密码,安全问题答案
  2. 拥有因素: 你拥有的东西 — 一种实物,如手机和安全令牌token
  3. 固有因素: 你的身份或者行为 — 生物特征,行为模式

身份验证机制依靠一系列技术来验证其中的一个或多个因素

身份验证(authentication) vs 授权(authorization)

身份验证是验证用户身份的过程。

授权涉及验证用户是否被允许做某事。

例如,身份验证确定的是,试图使用用户名 Carlos123 访问网站的人是否真的是创建该账户的人。

一旦 Carlos123 通过了身份验证,他们的权限就决定了他们有权做什么。例如,他们可能被授权访问其他用户的个人信息,或执行删除其他用户账户等操作。

身份验证漏洞产生的原因

  1. 验证机制的薄弱 —— 无法抵御暴力破解攻击
  2. 存在逻辑缺陷,编码不完善, 攻击者绕过身份验证机制

身份验证漏洞产生的影响

  1. 访问被入侵账户的所有数据和功能
  2. 如果攻击者能够入侵系统管理员等高权限账户,他们就能完全控制整个应用程序,并有可能访问内部基础设施。
  3. 即使入侵的是低权限账户,攻击者仍有可能访问本不该访问的数据,如商业敏感信息。
  4. 即使账户无法访问任何敏感数据,也可能允许攻击者访问更多页面,从而提供更多攻击面。

身份验证漏洞的几种类型

基于密码的登录漏洞(单因素身份验证漏洞)

对于采用基于密码的登录流程的网站,用户要么自己注册一个账户,要么由管理员分配一个账户。

该账户与一个唯一的用户名和一个秘密密码相关联,用户在登录表单中输入该用户名和密码来验证自己的身份。

在这种情况下,只要知道秘密密码就足以证明用户的身份。因此,如果攻击者能够获取或猜到其他用户的登录凭证,网站的安全性就会受到威胁。

暴力破解漏洞 – bruteforce

暴力攻击是指攻击者使用试错系统来猜测有效的用户凭证。

这些攻击通常使用用户名和密码的词典自动进行。

将这一过程自动化,特别是使用专用工具,可使攻击者高速尝试大量登录。 – 如hydra, john , burpsuite, yakit等工具

暴力破解 不完全是随机的猜测用户名和密码。通过使用基本的逻辑和搜集到的信息,可以对爆破进行微调,做出更符合逻辑的猜解,从而大大提高了攻击的效率。

有些用户名是符合格式的,如电子邮件 – firstname@lastname.com, 常见后管理员名 adminxxx,administrator

许多网站都采用某种形式的密码策略,强制用户创建高熵密码,至少从理论上讲,这样的密码更难被暴力破解。

这通常包括强制使用以下密码

  • ​ 最少字符数
  • ​ 小写字母和大写字母的混合
  • ​ 至少一个特殊字符

虽然单靠计算机很难破解高熵密码,但我们可以利用人类行为的基本知识来利用用户无意中给系统带来的漏洞。

用户通常不会使用随机字符组合来创建一个强密码,而是使用一个他们能记住的密码,并试图将其与密码策略相匹配。例如,如果不允许使用 mypassword,用户可能会尝试 Mypassword1! 或 Myp4$$w0rd 这样的密码。

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

这种对可能的凭据和可预测模式的了解意味着,**暴力破解攻击往往比简单地遍历每种可能的字符组合要复杂得多,因此也有效得多。** – 暴力破解并不是简单的遍历,是一种有技巧性,筛选性的遍历

这里就要提到一种字典生成工具,可以根据指定的格式生成字典

用户名枚举

用户名枚举是指攻击者通过观察网站行为的变化来识别给定用户名是否有效。

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

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

  1. 状态码 : 在暴力破解攻击中,绝大多数猜测返回的 HTTP 状态代码都可能是相同的,因为大多数猜测都是错误的。如果猜测返回的状态代码不同,这就充分说明用户名是正确的。网站的最佳做法是无论结果如何,始终返回相同的状态代码,但这种做法并不总是得到遵守。例如,当用户名和密码都正确时,网页可能会进行一个跳转,这时的状态码就是302,说明爆破成功
  2. 错误信息 :有时,返回的错误信息会有所不同,这取决于是用户名和密码都不正确,还是只有密码不正确。 不同的返回信息,导致返回的数据包长度是不一样的。网站的最佳做法是在两种情况下都使用相同的通用信息,但有时也会出现小的输入错误。只要有一个字符出错,两条信息就会截然不同,即使该字符在呈现的页面上不可见。
  3. 响应时间 : 如果处理大多数请求的响应时间相似,那么任何偏离响应时间的请求都表明幕后发生了不同的情况。这也表明所猜测的用户名可能是正确的。例如,网站可能只在用户名有效的情况下才检查密码是否正确。这一额外步骤可能会导致响应时间略有增加。这可能很微妙,但攻击者可以通过输入过长的密码,使网站处理时间明显延长,从而使这种延迟更加明显。
存在缺陷的暴力破解保护

从逻辑上讲,暴力破解保护的核心是尽量使程序自动化,降低攻击者尝试登录的速度。

防止暴力破解攻击最常见的两种方法是:

  1. 如果远程用户尝试登录失败次数过多,则锁定其尝试访问的账户
  2. 如果远程用户连续尝试登录的次数过多,则封锁其 IP 地址

这两种方法都能提供不同程度的保护,但都不是无懈可击的,尤其是在使用错误逻辑的情况下。、

当登录失败次数过多,ip被屏蔽,如果ip登录成功,则失败的计数器就会清零。那么攻击者每几次登录自己的账户就可以突破这个限制

在这种情况下,只需在整个词表中定期加入自己的登录账户信息,就足以使这种防御几乎毫无用处。

还有就是锁定账户, 如果符合某些可疑条件(通常是登录失败的设定次数),就会锁定账户。与正常登录错误一样,服务器显示账户已锁定的响应也有助于攻击者列举用户名。

但账户锁定存在局限性

锁定账户可以在一定程度上防止对特定账户的定向暴力破解。但是,这种方法无法充分防止攻击者随意访问任意账户的暴力破解攻击。

可以使用以下方法绕过这种保护:

  1. 建立一个可能有效的候选用户名字典。这可以通过用户名枚举或简单地根据常见用户名列表来实现。
  2. 确定一个很小的密码短名单,你认为至少有一个用户可能拥有这些密码。最重要的是,所选密码的数量不能超过允许的登录次数。例如,如果你已经计算出登录次数限制为 3 次,那么你最多只能选择 3 次密码猜测。
  3. 使用暴力破解工具,为每个用户名尝试密码,从而对每个账户进行暴力破解。只要能够爆破出一个有效的账户

锁定账户无法防止撞库攻击(凭证填充)。在网络中,数据泄露会流出大量的用户名-密码字典,登录凭据等信息

这里需要理解一个为 凭证填充 的概念

https://www.cloudflare.com/zh-cn/learning/bots/what-is-credential-stuffing/

凭证填充是一种网络攻击,利用从一项服务上的数据泄露中获得的登录凭据尝试登录到另一个不相关的服务。

凭证填充依赖于许多人在多个网站上重复使用相同的用户名和密码,因此字典中的一些被泄露的凭证也可能在目标网站上有效。

而账户锁定是无法防止凭证填充攻击的,因为攻击者根据泄露的信息只会尝试使用一次用户名。凭证填充特别危险,因为它有时会导致攻击者仅通过一次自动攻击就危及许多不同的帐户(同一个登录凭据可能适用多个网站)

除了账户锁定和ip锁定,还有一种方式是用户速率限制

在这种情况下,如果在短时间内发出过多登录请求,就会导致你的 IP 地址被封锁。通常情况下,IP 只能通过以下一种方式解封:

  • 一段时间后自动解封
  • 由管理员手动解除
  • 用户成功完成验证码后手动解锁

用户速率限制有时比账户锁定更受欢迎,因为它不容易受到用户名枚举和拒绝服务攻击。

不过,它仍然不完全安全。有时可以请求多个密码,从而绕过登录验证

http基本身份验证

在HTTP基本认证中,客户端从服务器接收认证令牌,该令牌是通过连接用户名和密码并以Base64编码来构造的。此令牌由浏览器存储和管理,浏览器会自动将其添加到 Authorization 每个后续请求的标头,如下所示:

Authorization: Basic base64(username:password)

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

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

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

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

多因素身份验证的漏洞

许多网站完全依赖使用密码的单因素身份验证来验证用户。但是,有些网站要求用户使用多个身份验证因素来证明自己的身份。

对大多数网站来说,验证生物识别因素是不切实际的。不过,基于 "你所知道的 "和 "你所拥有的 "的强制性和可选的双因素身份验证(2FA)–( 知识因素和拥有因素) 越来越常见。

这通常要求用户输入传统密码和临时验证码,验证码来自用户所持有的带外物理设备(如短信验证码)。

虽然攻击者有时有可能获取密码等基于知识的单一因素,但同时从带外来源获取另一个因素的可能性要小得多。因此,双因素身份验证显然比单因素身份验证更安全。

不过,与任何安全措施一样,双因素身份验证的安全性取决于其实施情况。实施不力的双因素身份验证可能会被击败,甚至完全被绕过,就像单因素身份验证一样。

只有通过验证多个不同的因素,才能充分发挥多因素身份验证的优势。

以两种不同方式验证同一因素并不是真正的双因素身份验证。

基于电子邮件的 2FA 就是这样一个例子。虽然用户必须提供密码和验证码,但获取验证码只依赖于用户知道其电子邮件账户的登录凭证(只有登录凭证有效才能获取验证码)。因此,知识验证因素只是经过了两次验证。

双因素身份验证tokens

验证码通常由用户通过某种物理设备读取。

现在许多高安全性网站会向用户提供专用设备,例如访问网上银行使用的rsa令牌,键盘设备等

除了为了安全而设计,这些设备还能用于生成验证码

有时网站也使用移动应用程序(Google Authenticator) 来达到同样的效果

双因素身份验证绕过

有时,双因素身份验证的实施存在缺陷,以至于可以完全绕过它。

如果首先提示用户输入密码,然后在另一个页面上提示用户输入验证码,那么用户在输入验证码之前实际上已经处于 "登录 "状态。在这种情况下,值得测试一下能否在完成第一个验证步骤后直接跳转到 "仅登录 "页面。有时,你会发现网站在加载页面前实际上并不检查你是否完成了第二步。

双因素身份验证绕过

有时,双因素身份验证的实施存在缺陷,以至于可以完全绕过它。

如果首先提示用户输入密码,然后在另一个页面上提示用户输入验证码,那么用户在输入验证码之前实际上已经处于 "登录 "状态。在这种情况下,值得测试一下能否在完成第一个验证步骤后直接跳转到 "仅登录 "页面。有时,你会发现网站在加载页面前实际上并不检查你是否完成了第二步。

有缺陷的双因素身份验证逻辑

有时,双因素身份验证的逻辑缺陷意味着,在用户完成初始登录步骤后,网站没有充分验证同一用户是否在完成第二步骤。

例如,用户在第一步中使用正常凭据登录,如下所示:

POST /login-steps/first HTTP/1.1
主机:vulnerable-website.com
...
username=carlos&password=qwerty

然后,在进入登录过程的第二步之前,他们会被分配一个与其账户相关的 cookie:

http/1.1 200 ok
Set-Cookie: account=carlos

GET /login-steps/second HTTP/1.1
Cookie: account=carlos

提交验证码时,请求会使用此 cookie 来确定用户试图访问的账户:

POST /login-steps/second HTTP/1.1
主机:vulnerable-website.com
Cookie: account=carlos
...
verification-code=123456

在这种情况下,攻击者可以使用自己的凭据登录,但在提交验证码时会将账户 cookie 的值更改为任意用户名。

POST /login-steps/second HTTP/1.1
主机:vulnerable-website.com
Cookie: account=victim-user
...
verification-code=123456

如果攻击者能够暴力破解验证码,这将是极其危险的,因为这将允许他们完全根据用户名登录任意用户的账户。他们甚至不需要知道用户的密码。

暴力破解2fa验证码

与密码一样,网站也需要采取措施防止 2FA 验证码被暴力破解。这一点尤为重要,因为验证码通常是一个简单的 4 或 6 位数字。如果没有足够的暴力破解保护,破解这样的验证码是轻而易举的。

一些网站试图通过在用户输入一定数量的错误验证码后自动注销来防止这种情况的发生。这在实践中是无效的,因为高级攻击者甚至可以通过为 Burp Intruder 创建宏来自动执行这一多步骤过程(重放多个数据包)。Turbo Intruder 扩展也可用于此目的。

这里就需要了解到burpsuite的会话和宏功能是如何使用的
关于宏的使用参考文章
https://www.noa.icu/posts/sec_tools/burpsuite_macro/

其他身份验证机制的漏洞

除了基本的登录功能外,大多数网站还提供辅助功能,允许用户管理自己的账户。例如,用户通常可以更改密码或在忘记密码时重置密码。这些机制也会引入攻击者可以利用的漏洞。
网站通常会注意避免在登录页面中出现众所周知的漏洞。而在其他的功能页面,对安全保护有所忽视

保持用户登录状态

一个常见的功能是在关闭浏览器会话后仍能保持登录状态。这通常是一个简单的复选框,标有 "记住我 "或 "保持我的登录状态 "等字样。
这种功能通常是通过生成某种 "remember me "标记来实现的,然后将其存储在一个持久的 Cookie 中。
由于拥有这个 cookie 就能有效绕过整个登录过程,因此最好的做法是不要让人猜到这个 cookie。

那么攻击者如何获取到cookie?
● 不过,有些网站会根据可预测的静态值(如用户名和时间戳)的连接来生成 cookie。有些网站甚至将密码作为 cookie 的一部分。如果攻击者能够创建自己的账户,那么这种方法就特别危险,因为他们可以研究自己的 cookie,并可能推断出 cookie 是如何生成的。一旦推算出公式,他们就可以尝试暴力破解其他用户的 cookie,从而访问他们的账户。
● 同时,跨站脚本攻击xss也可以获取到cookie
● 在有些情况下,cookie中的值会经过hash处理,但在不加salt的情况下,仍可能被撞库获取到原文
● 如果网站使用的是开源框架,有可能可以在源码中找出cookie构造的细节

重置用户密码

在这种情况下,基于密码的身份验证机制是不可能适用的,网站就会使用其他的身份验证机制,来验证当前重置密码的是真正的用户
一般有以下几种验证机制:
● 通过电子邮件发送一个新的密码
● 使用url重置密码 – url一般为http://vulnerable-website.com/reset-password?user=victim-user
● 更改用户密码 – 需要输入当前密码,这种机制与前面的密码验证机制是相似的

应避免通过不安全的通道发送持久密码。在这种情况下,安全性依赖于生成的密码在很短的时间内过期,或者用户立即再次更改其密码。否则,这种方法很容易受到中间人攻击。
电子邮件通常也不被认为是安全的,因为收件箱是永久性的,并且不是真正为机密信息的安全存储而设计的。许多用户还通过不安全的渠道在多个设备之间自动同步收件箱


在url重置密码中,攻击者可以更改user参数以引用他们识别的任何用户名。然后,他们将被直接带到一个页面,在那里他们可以为这个任意用户设置一个新密码。
此过程的一个更好的实现是生成一个高熵、难以猜测的令牌,并基于该令牌创建重置URL。在最佳情况下,此URL不应提供有关正在重置哪个用户密码的提示。 例如http://vulnerable-website.com/reset-password?token=a0ba0d1cb3b63d13822572fcff1a241895d893f659164d4cc550b421ebdd48a8
当用户访问此URL时,系统应该检查后端是否存在此令牌,如果存在,应该重置哪个用户的密码。此令牌应在短时间后过期,并在重置密码后立即销毁。

但是,某些网站在提交重置表单时也无法再次验证令牌。在这种情况下,攻击者只需通过自己的帐户访问重置表单,删除令牌,然后利用此页面重置任意用户的密码。

如果重置电子邮件中的URL是动态生成的,也可能容易受到密码重置毒害。在这种情况下,攻击者可能会窃取其他用户的令牌并使用它更改其密码。


如果密码更改功能允许攻击者在不以受害用户身份登录的情况下直接访问它,则该功能可能特别危险。例如,如果用户名在隐藏字段中提供,攻击者就可能在请求中编辑此值以攻击任意用户。攻击者可能会利用此漏洞枚举用户名和强力密码。

根据密码更改功能提示的错误返回信息,攻击者可以爆破出原密码
例如:
● 原密码错误,新密码输入不一致 – 提示原密码输入错误
● 原密码正确,新密码输入不一致 – 提示两次输入的新密码要一致
通过以上错误信息就可以爆破出原密码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值