身份验证漏洞可让攻击者访问敏感数据和功能。
它们还会暴露出更多的攻击面,从而被进一步利用。
什么是身份验证
在了解身份验证漏洞之前,首先需要知道什么是身份验证机制
- 身份验证是验证用户或客户身份的过程。网站有可能暴露给任何连接到互联网的人。因此,强大的身份验证机制是有效的网络安全不可或缺的一部分。
身份验证主要有三种类型
- 知识因素: 你知道的东西 — 密码,安全问题答案
- 拥有因素: 你拥有的东西 — 一种实物,如手机和安全令牌token
- 固有因素: 你的身份或者行为 — 生物特征,行为模式
身份验证机制依靠一系列技术来验证其中的一个或多个因素
身份验证(authentication) vs 授权(authorization)
身份验证是验证用户身份的过程。
授权涉及验证用户是否被允许做某事。
例如,身份验证确定的是,试图使用用户名 Carlos123 访问网站的人是否真的是创建该账户的人。
一旦 Carlos123 通过了身份验证,他们的权限就决定了他们有权做什么。例如,他们可能被授权访问其他用户的个人信息,或执行删除其他用户账户等操作。
身份验证漏洞产生的原因
- 验证机制的薄弱 —— 无法抵御暴力破解攻击
- 存在逻辑缺陷,编码不完善, 攻击者绕过身份验证机制
身份验证漏洞产生的影响
- 访问被入侵账户的所有数据和功能
- 如果攻击者能够入侵系统管理员等高权限账户,他们就能完全控制整个应用程序,并有可能访问内部基础设施。
- 即使入侵的是低权限账户,攻击者仍有可能访问本不该访问的数据,如商业敏感信息。
- 即使账户无法访问任何敏感数据,也可能允许攻击者访问更多页面,从而提供更多攻击面。
身份验证漏洞的几种类型
基于密码的登录漏洞
对于采用基于密码的登录流程的网站,用户要么自己注册一个账户,要么由管理员分配一个账户。
该账户与一个唯一的用户名和一个秘密密码相关联,用户在登录表单中输入该用户名和密码来验证自己的身份。
在这种情况下,只要知道秘密密码就足以证明用户的身份。因此,如果攻击者能够获取或猜到其他用户的登录凭证,网站的安全性就会受到威胁。
暴力破解漏洞 -- bruteforce
暴力攻击是指攻击者使用试错系统来猜测有效的用户凭证。
这些攻击通常使用用户名和密码的词典自动进行。
将这一过程自动化,特别是使用专用工具,可使攻击者高速尝试大量登录。 -- 如hydra, john , burpsuite, yakit等工具
暴力破解 不完全是随机的猜测用户名和密码。通过使用基本的逻辑和搜集到的信息,可以对爆破进行微调,做出更符合逻辑的猜解,从而大大提高了攻击的效率。
有些用户名是符合格式的,如电子邮件 -- firstname@lastname.com, 常见后管理员名 adminxxx,administrator
许多网站都采用某种形式的密码策略,强制用户创建高熵密码,至少从理论上讲,这样的密码更难被暴力破解。
这通常包括强制使用以下密码
- 最少字符数
- 小写字母和大写字母的混合
- 至少一个特殊字符
虽然单靠计算机很难破解高熵密码,但我们可以利用人类行为的基本知识来利用用户无意中给系统带来的漏洞。
用户通常不会使用随机字符组合来创建一个强密码,而是使用一个他们能记住的密码,并试图将其与密码策略相匹配。例如,如果不允许使用 mypassword,用户可能会尝试 Mypassword1! 或 Myp4$$w0rd 这样的密码。
在政策要求用户定期更改密码的情况下,用户对首选密码进行微小的、可预测的更改也很常见。例如,Mypassword1! 变成 Mypassword1? 或 Mypassword2!。
这种对可能的凭据和可预测模式的了解意味着,暴力破解攻击往往比简单地遍历每种可能的字符组合要复杂得多,因此也有效得多。
-- 暴力破解并不是简单的遍历,是一种有技巧性,筛选性的遍历
这里就要提到一种字典生成工具,可以根据指定的格式生成字典
用户名枚举
用户名枚举是指攻击者通过观察网站行为的变化来识别给定用户名是否有效。
用户名枚举通常发生在登录页面,例如,当你输入一个有效的用户名但密码不正确时,或者当你在注册表单上输入一个已经被占用的用户名时。这大大减少了暴力登录所需的时间和精力,因为攻击者能够快速生成有效用户名的短名单。
在尝试暴力破解登录页面时,应特别注意以下方面的任何差异:
- 状态码 : 在暴力破解攻击中,绝大多数猜测返回的 HTTP 状态代码都可能是相同的,因为大多数猜测都是错误的。如果猜测返回的状态代码不同,这就充分说明用户名是正确的。网站的最佳做法是无论结果如何,始终返回相同的状态代码,但这种做法并不总是得到遵守。例如,当用户名和密码都正确时,网页可能会进行一个跳转,这时的状态码就是302,说明爆破成功
- 错误信息 :有时,返回的错误信息会有所不同,这取决于是用户名和密码都不正确,还是只有密码不正确。 不同的返回信息,导致返回的数据包长度是不一样的。网站的最佳做法是在两种情况下都使用相同的通用信息,但有时也会出现小的输入错误。只要有一个字符出错,两条信息就会截然不同,即使该字符在呈现的页面上不可见。
- 响应时间 : 如果处理大多数请求的响应时间相似,那么任何偏离响应时间的请求都表明幕后发生了不同的情况。这也表明所猜测的用户名可能是正确的。例如,网站可能只在用户名有效的情况下才检查密码是否正确。这一额外步骤可能会导致响应时间略有增加。这可能很微妙,但攻击者可以通过输入过长的密码,使网站处理时间明显延长,从而使这种延迟更加明显。
存在缺陷的暴力破解保护
从逻辑上讲,暴力破解保护的核心是尽量使程序自动化,降低攻击者尝试登录的速度。
防止暴力破解攻击最常见的两种方法是:
- 如果远程用户尝试登录失败次数过多,则锁定其尝试访问的账户
- 如果远程用户连续尝试登录的次数过多,则封锁其 IP 地址
这两种方法都能提供不同程度的保护,但都不是无懈可击的,尤其是在使用错误逻辑的情况下。
当登录失败次数过多,ip被屏蔽,如果ip登录成功,则失败的计数器就会清零。那么攻击者每几次登录自己的账户就可以突破这个限制
在这种情况下,只需在整个词表中定期加入自己的登录账户信息,就足以使这种防御几乎毫无用处。
http基本身份验证
在HTTP基本认证中,客户端从服务器接收认证令牌,该令牌是通过连接用户名和密码并以Base64编码来构造的。此令牌由浏览器存储和管理,浏览器会自动将其添加到 Authorization 每个后续请求的标头,如下所示:
Authorization: Basic base64(username:password)
由于多种原因,这通常不被视为一种安全的身份验证方法。首先,它涉及在每个请求中重复发送用户的登录凭据。除非网站还实施了 HSTS,否则用户凭据可能会在中间人攻击中被捕获。
此外,HTTP 基本身份验证的实现通常不支持暴力保护。由于令牌仅由静态值组成,因此可能使其容易受到暴力破解。
HTTP 基本身份验证也特别容易受到与会话相关的攻击,尤其是 CSRF,它本身无法提供任何保护。
在某些情况下,利用易受攻击的 HTTP 基本身份验证可能仅授予攻击者访问看似无趣的页面的权限。但是,除了提供进一步的攻击面外,以这种方式公开的凭据还可能在其他更机密的上下文中重复使用。