身份验证漏洞
几乎所有网站都为用户提供登录功能,这已经变得非常普遍。用户无需多想,只需输入邮箱地址、用户名和密码即可注册,因为借助浏览器或插件的缓存以及第三方身份验证服务,再次访问网站变得更加便捷。
不幸的是,安全威胁也在增加,黑客可以更轻松地在暗网上出售凭证或在粘贴网站上发布泄露的数据,劫持社交媒体账户进行点击诱饵或资金交易。
我们将研究身份验证如何工作、攻击者如何破坏帐户以及如何防御此类攻击。
身份验证如何运作?
HTTP 提供了身份验证框架,服务器使用它来向客户端请求发送401
状态码(表示“未授权”),并通过响应头提供授权信息WWW-Authenticate
。客户端如果想向服务器进行身份验证,必须在Authorization
请求头中包含凭证信息。
最常见的身份验证类型是Basic
,包含在Authorization
标头中,如下所示:
//syntax
Authorization: <type> <credentials>
//example
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
在身份验证过程中basic
,客户端从用户处获取用户名和密码,并通过连接用户名、单个冒号(“:”)和密码(生成字符串username:password
)来构造用户密码。然后,客户端将用户密码编码为八位字节序列,最后使用 Base64 将八位字节序列编码为 US-ASCII 字符序列。
如果用户代理希望发送用户名“Aladdin”和密码“open sesame”,它将使用以下标头字段:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
由于用户名和密码以明文形式在网络上传输(采用 base64 编码,但 base64 是一种可逆编码),因此基本身份验证方案并不安全。基本身份验证应与 HTTPS/TLS 结合使用。
有关更多信息,请参阅RFC 7617。
攻击类型
以下是攻击者常用的自动攻击类型:
暴力攻击
黑客试图通过猜测密码来突破单个账户的身份验证。使用脚本来尝试字典中的多个常用密码以及数百万个从先前数据泄露事件中获得的密码,可以提高此类尝试的成功率。
凭证填充
此类攻击是通过测试从其他网站泄露的用户名和密码对来进行的。请访问haveibeenpwned.com网站,检查您的电子邮件、电话或密码是否遭遇数据泄露。
密码喷洒
在这种类型的攻击中,会针对大量不同的帐户测试单个弱密码。
防御机制
让我们看看防范此类攻击的各种方法
#1 无需密码的第三方身份验证
现在,使用社交媒体账户(例如 Facebook 或 Google 账户)在网站上验证用户身份非常普遍。这种方式更方便,因为用户无需使用或记住密码。允许第三方应用存储用户名/密码组合被认为是不安全的。对于这种情况以及其他用例,可以使用身份验证协议来保护用户数据。例如OAuth、OpenId、SAML和FIDO。
OAuth 或 OpenID 要求用户通常使用个人电子邮件地址作为用户名。对于企业用户,可以考虑使用Single sign-on (SSO)
Okta、OneLogin 等身份提供商,使用企业邮箱登录。
#2 保护自己的身份验证系统
并非所有用户都拥有 Facebook、Gmail 或其他社交媒体账户来登录。这意味着除了第三方身份验证之外,网站仍然需要使用个人邮箱或自选用户名和密码进行常规的注册、登录和注销。在实施您自己的身份验证系统之前,需要考虑许多因素:
用户名或用户 ID
- 它应该不区分大小写,即用户名“Bob”和“bob”应该是同一个用户。
- 它应该是独一无二的。
- 当用户拥有公开个人资料时,请使用单独的显示名称,并避免使用电子邮件地址作为显示名称,因为它会招致垃圾邮件。
- 通过检查有效字符并发送带有令牌的验证链接来验证和确认电子邮件地址,然后才发送进一步的交易电子邮件。
- 禁止使用 10 Minute Mail 或 Mailinator 等服务生成的一次性电子邮件。
- 不允许使用敏感帐户(例如用于数据库的内部帐户)登录任何前端用户界面。
- 请勿使用与内部用于不安全访问(例如公共访问/ DMZ)相同的身份验证解决方案(例如 IDP / AD)
密码
- 应用程序强制执行密码的最小长度,少于 8 个字符的密码被视为弱密码,
- 密码最大长度不应设置得太短,因为这会阻止用户创建密码短语。由于哈希算法的限制,有些人将其设置为 64 个字符,更多信息请参阅OWASP 密码存储备忘单
- 应设置最大密码长度,以防止长密码拒绝服务攻击。
- 如果用户设置的密码超出限制,则不要截断密码,而是使用预哈希算法(如PBKDF2)。
- 允许使用所有字符,包括 unicode 和空格。
- 密码泄露时,允许凭证轮换(更改/重置密码)。密码重置链接应在用户使用后或 30 分钟后失效,以防止攻击者滥用过期的重置链接。要了解密码重置机制,请阅读OWASP 忘记密码备忘单。
- 使用库来计算密码强度,选择时要小心,检查较少的依赖性和可维护性状态。
- 使用Pwned Passwords API 检查输入的密码是否在之前被破解的密码列表中。
- 为了在用户再次登录时重新验证用户,应使用加密技术将密码安全地存储在数据库中,详情请参阅OWASP 密码存储备忘单。
密码不是按原样存储的,而是以哈希值存储的,为此应该选择一个好的哈希算法,这样即使攻击者获得了哈希密码,也需要很长时间才能破解(不可能将哈希值解密回原始密码)。
这些是攻击者用来从哈希破解密码的步骤。
- 选择您认为受害者选择的密码
- 计算哈希值
- 将你计算出的哈希值与受害者的哈希值进行比较。如果匹配,则说明你已正确“破解”了哈希值,并且知道了受害者密码的明文值。
阅读密码安全要求以了解有关密码安全注意事项的更多信息。
#3 使用多因素身份验证(MFA)或双因素身份验证(2FA)
最好在安全密码存储的基础上,通过多重身份验证 (MFA) 来提供额外的安全保障,以有效抵御暴力破解、凭证填充和密码喷洒等攻击。微软表示,使用 MFA 可以防止99.9% 的密码泄露。MFA 要求回访用户提供以下四类信息中的至少两类来证明其身份:已知信息、拥有信息、身份信息以及所在位置。
许多人使用身份验证移动应用程序,例如Google 身份验证器和Microsoft 身份验证器,这些应用程序可以在注册期间与网站同步,之后可用于生成随机密码以成功登录。
要获得有关实施 MFA 的指导,请阅读OWASP 多因素身份验证备忘单。
#4 实施 CAPTCHA
CAPTCHA(全自动区分计算机与人类的公共图灵测试)要求用户执行各种图像识别任务,这些任务对人类来说很简单,但对计算机来说却很棘手。它有助于防止自动登录尝试和用户枚举攻击(测试列表中的每个用户名是否存在于您的网站上)。
CAPTCHA 并不完美,攻击者可以使用机器学习技术或通过付费让人类用户完成任务来破解它,但它仍然可以阻止大多数常见的黑客攻击。
确保 CAPTCHA 对普通用户友好,只需在少数几次登录失败后解决 CAPTCHA,而不是从第一次登录时就要求解决 CAPTCHA,并使其不那么复杂 🙂。
#5 安全注销
为用户提供安全的注销功能也同样重要,以防止会话劫持攻击。
注销功能应该清除浏览器中的会话 Cookie,并使其无效(如果您将会话标识符存储在服务器端)。这可以防止攻击者试图拦截会话 Cookie 并使用窃取的 Cookie 重新建立会话。会话 Cookie 的清除方式是:返回一个包含Set-Cookie
空值标头的 HTTP 响应,并将Expires
(或 Max-Age) 属性设置为过去的日期(如果使用的是持久性 Cookie)Set-Cookie: id=; Expires=Friday, 17-May-03 18:45:00 GMT
:
其他辩护
防止攻击的其他方法包括使用密码管理器和重新验证。
当攻击者找到安全漏洞的方法时,人们必须找到更好的方法来防范它,并且通过启用身份验证的日志记录和监控,人们可以实时检测攻击/故障。
鏂囩珷鏉ユ簮锛�https://dev.to/ms_74/authentication-vulnerability-15po