身份认证漏洞

本文阅读 21 分钟

身份认证是验证给定用户或客户端身份的过程。简单理解就是如何让别人相信你就是你。

1、身份认证三要素

①、你所知道的信息:比如我们最广泛使用的“用户名+密码”,因为只有你自己知道“用户名+密码”这个信息组合,那么当你把这个组合提供给我的时候,我就可以相信你就是你。 ②、你所拥有的信息:假如你的“用户名+密码”泄露给了第三方,这个时候你就会有被第三方冒充的危险了。怎么办呢,再进一步提供一个只有你自己拥有的信息,即可防止被第三方冒充的危险。 ③、你所独有的信息:再假设一下,你拥有的信息也被泄露给了第三方,这个时候你又会面临被冒充的危险。再进一步,提供一个只有你自己所独有的的信息,比如你的指纹,虹膜,面部特征等等。 身份认证机制依赖于一系列技术来验证这些因素中的一个或多个。

2、身份认证和授权的区别

身份认证是验证用户确实是他们声称的身份的过程,而授权是验证用户是否被允许做某事。

1、身份验证机制无法充分防御暴力攻击。 2、逻辑缺陷或较差的编码使攻击者可以完全绕过身份验证机制。

1、基于密码的登录漏洞

1.1、密码破解 目前大部分系统使用的强密码类型为: ①最少字符数 ②小写字母和大写字母的混合 ③至少一个特殊字符 此类密码强度高,比较难破解,但是用户通常不会使用一个难以记忆的密码,大多情况下是根据个人情况使用一些自己常用密码的变形,例如,如果qitiana不允许,则用户可能使用Qitiana1!或Qitiana.1等替代的方法。 该策略要求用户定期更改其密码的情况下,用户仅对他们的首选密码进行较小且可预测的更改也是很常见的。例如,qitiana变为Qitiana2!或Qitiana.2。所以社工有时候是可以破解此类密码的。

1.2、用户名猜解 ①用户名具有某种特点。格式为firstname.lastname@somecompany.com;或如admin或者adminstrator等。

1.3、用户名枚举 用户名枚举:攻击者通过观察网站行为的变化以判断给定的用户名是否有效。用户名枚举通常出现再登录页。例如,当用户名正确但密码不正确时,或者在注册表单上,当输入已使用的用户名时,因为攻击者能够快速生成有效用户名的候选列表,所以这大大减少了暴力登录所需的时间和精力。 在尝试登录页面时,应注意以下方面: ①状态码: 在暴力破解中,返回的HTTP状态码可能是相同的,因为大多数猜测都是错误的。如果此时出现了一个状态码,则表明用户名正确。 ②错误消息: 返回的错误消息不同,取决于用户名和密码不正确还是仅密码不正确。最佳做法是网站在两种情况下都使用相同的通用消息,但是有时会出现小的键入错误。即使在呈现的页面上看不到该字符的情况下,只有一个字符的位置不正确也会使这两个消息有所区别。 ③响应时间: 如果大多数请求都以相似的响应时间进行处理,则任何偏离此时间的请求都表明发生了一些不同的事情,这时我们猜测的用户名可能正确。例如,网站可能仅在用户名有效时检查密码是否正确,此额外步骤可能会导致响应时间略有增加。这个增加的时间可能比较短,但是攻击者可以通过输入一个超长密码来使此延迟更加明显,而该密码需要网站花费更长的时间才能处理。

1.4、目前防止暴力攻击的最常见方法是:

①如果远程用户多次尝试登录失败,则锁定远程用户尝试访问的帐户 例如,如果多次登录失败,会发现IP被阻止。在某些实现中,如果IP所有者成功登录,则失败尝试次数的计数器将重置。这意味着攻击者只需每尝试几次就可以登录自己的帐户,以防止达到此限制。 锁定帐户可提供一定程度的保护,以防止对特定帐户进行有针对性的暴力破解。但是,这种方法无法充分防止暴力攻击,在这种暴力攻击中,攻击者只是试图获得对他们可以使用的任何随机帐户的访问权限。

②如果远程用户连续多次尝试登录,则阻止远程用户的IP地址 例如,可以使用以下方法来解决这种保护问题: 建立可能有效的候选用户名列表。这可以通过用户名枚举或仅基于常见用户名列表进行。 确定一个很小的密码清单,您认为至少一个用户可能拥有该密码。至关重要的是,您选择的密码数量不得超过允许的登录尝试数量。例如,如果您确定限制为3次尝试,则最多需要选择3个密码猜测值。 使用Burp Intruder之类的工具,使用每个候选用户名尝试每个选定的密码。这样,您可以尝试强行强制每个帐户,而不会触发帐户锁定。您只需要一个用户即可使用三个密码之一来破坏帐户。 帐户锁定也无法防止凭据填充攻击。这涉及使用庞大的username:password成对字典,该字典由在数据泄露中失窃的真实登录凭据组成。凭据填充依赖于以下事实:许多人在多个网站上重复使用相同的用户名和密码,因此,词典中某些受损的凭据也有可能在目标网站上有效。帐户锁定无法防止凭据塞满,因为每个用户名仅被尝试一次。凭证填充特别危险,因为它有时可能导致攻击者仅通过一次自动攻击就破坏了许多不同的帐户。

③用户速率限制 在这种情况下,在短时间内发出太多登录请求会导致您的IP地址被阻止。通常,只能以下列方式之一解除对​​IP的限制: Ⅰ、经过一定时间后自动 Ⅱ、由管理员手动 Ⅲ、成功完成验证码后,由用户手动进行 有时最好使用用户速率限制而不是帐户锁定,因为它不太容易出现用户名枚举和拒绝服务攻击。但是,它仍然不是完全安全。由于限制是基于从用户IP地址发送的HTTP请求的速率,因此,如果可以确定如何通过单个请求猜测多个密码,有时也可以绕过此防御。

④HTTP基本认证 HTTP基本认证相对简单和易于实现,在HTTP身份验证中,客户端从服务器接收身份验证令牌,该身份验证令牌是通过串联用户名和密码并在Base64中对其进行编码而构造的,该令牌由浏览器存储和管理,浏览器会自动将其添加到Authorization每个后续请求的标头中。 如下所示:

Authorization: Basic base64(username:password)

由于多种原因,通常不将其视为安全的身份验证方法。 Ⅰ、它在每个请求中重复发送用户的登录凭据,除非该网站还实施HSTS,否则用户凭据很容易在中间人攻击中被捕获。

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

Ⅲ、HTTP基本身份验证还特别容易受到与会话相关的攻击的影响,尤其是CSRF,它无法单独提供保护。

2、双因子身份验证中的漏洞

验证码通常由用户从某种物理设备获取,手机,邮箱等。这一过程中,代码是通过SMS传输的,而不是由设备本身生成的,请求过程是完全可以被截取的;还存在SIM交换的风险,从而使攻击者获得带有受害者电话号码的SIM卡;然后,攻击者将收到发送给受害者的所有SMS消息,包括包含其验证码的SMS消息。

2.1、绕过双因子验证 如果首先提示用户输入密码,然后提示用户在单独的页面上输入验证码,则在用户输入验证码之前,用户实际上处于“登录”状态。在这种情况下,看是否可以在完成第一个身份验证步骤后直接跳到“仅登录”页面。有时,您会发现网站实际上并没有在加载页面之前检查您是否完成了第二步。

2.2、双因子验证逻辑错误 有时,两因素身份验证中的逻辑有缺陷,这意味着用户完成初始登录步骤后,网站无法充分验证同一用户是否已完成第二步。

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

POST /login-steps/first HTTP/1.1
Host: xxx.xxx.com
...
username=qitiana&password=qwer123
然后,为他们分配与他们的帐户相关的cookie,然后将其转到登录过程的第二步:

HTTP/1.1 200 OK
Set-Cookie: account=qitiana

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


提交验证码时,请求将使用此cookie来确定用户尝试访问的帐户:


POST /login-steps/second HTTP/1.1
Host: xxx.xxx.com
Cookie: account=qitiana
...
verification-code=123456

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


POST /login-steps/second HTTP/1.1
Host: xxx.xxx.com
Cookie: account=useruser
...
verification-code=123456


这将允许攻击者根据用户名登录任意用户的账号。

2.3、暴力破解2FA验证码 与使用密码一样,网站需要采取措施来防止2FA验证码的暴力破解。该验证码通常是一个简单的4或6位数字。一些网站通过输入一定数量的错误验证码自动锁定账号来防止此情况,但是攻击者可以通过为Burp Intruder创建宏来自动执行此多步骤过程。

3、其他身份验证机制中的漏洞

3.1、保持用户登录状态 大部分浏览器会提供“记住密码”或“记住登录状态”等功能,将用户登录信息存储在持久性cookie中,因此下次登录时可以继续使用此cookie绕过登录过程。 但是,某些网站会根据可预测的静态值(例如用户名和时间戳)生成cookie。有些甚至使用密码作为cookie的一部分。此时攻击者能够创建自己的帐户,研究自己的cookie并可能推断出cookie的生成方式,就可以使用其他用户的Cookie来访问其帐户。 一些网站认为,如果cookie以某种方式进行了加密,即使使用静态值也将不可猜测。但使用简单的双向编码(如Base64)加密 cookie是不能提供完全的保护的。即使使用具有单向哈希函数的加密也不是完全安全的方法,如果攻击者能够识别哈希算法,并且加密算法不使用任何盐值,则可以通过哈希其单词列表就可以对Cookie进行暴力破解。如果未对Cookie猜测应用类似的限制,则可以使用此方法绕过登录尝试的限制。

即使攻击者无法创建自己的帐户,也能够利用此漏洞,使用XSS之类的常用技术,攻击者可能会窃取另一个用户的“记住我” cookie,并从中推断出如何构造cookie。如果网站是使用开放源代码框架构建的,则cookie构造的关键详细信息是公开记录的。

少数情况下,从哈希表中获取了哈希值,可能以明文形式从cookie获取用户的实际密码。

3.2、重置用户密码 当用户忘记密码时,这时用户无法使用基于密码的身份验证,因此网站必须依靠其他方法来确保真实用户正在重置自己的密码。因此,密码重置功能具有内在的危险性。

通常实现此功能的几种方法:

①通过电子邮件发送密码 某些网站会生成一个新密码,然后通过电子邮件将其发送给用户。 一般而言,应避免通过不安全的通道发送永久性密码。在这种情况下,安全性取决于:生成的密码在很短的时间后过期;用户立即再次更改其密码。否则,此方法极易受到中间人攻击。

考虑到收件箱是持久性的,并且不是为安全存储机密信息而设计的,因此通常认为电子邮件也是不安全的。许多用户还会跨不安全的系统在多个设备之间自动同步其收件箱。

②使用URL重置密码 重置密码的一种更可靠的方法是向用户发送一个唯一的URL,该URL将其带到密码重置页面。此方法任意产生问题的地方在于使用带有易于猜测参数的URL来标识要重置的帐户。

例如:http://xxx.xxx.com/reset-password?user=user

在此示例中,攻击者可以更改user参数然后转到任何用户名,为该任意用户设置新密码。

此方法比较完美的做法是:生成难以猜测的令牌,并基于该令牌创建重置URL,此URL不提供有关重置哪个用户密码的提示。

http://xxx.xxx.com/reset-password?token=a0ba0d1cb3b63d13822572fcff1a241895d893f659164d4cc550b421ebdd48a8

当用户访问此URL时,系统应检查此令牌在后端是否存在,如果存在,则应检查应重置哪个用户的密码。此令牌应在短时间后过期,并在重置密码后立即销毁。

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

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

③修改用户密码 更改密码需要输入当前密码,然后输入两次新密码。这些页面从根本上依靠与普通登录​​页面相同的逻辑来检查用户名和当前密码是否匹配。因此,这些页面可能容易受到相同技术的攻击。

如果密码更改功能允许攻击者直接访问它而无需以受害者用户身份登录,则可能特别危险。例如,如果在隐藏字段中提供了用户名,则攻击者能够在请求中编辑此值来定位任意用户。这有可能被利用来枚举用户名和暴力破解。

1、防止用户凭据泄露。账户明文传输可能会导致用户名和密码泄露。 2、实施有效的密码策略。加强密码强度。 3、防止用户名枚举。使用通用的错误消息;每个登录请求的响应状态码相同;不同情况下响应时间尽可能相同。 4、防止暴力破解。登录请求在达到特定限制后,每次尝试登录时都完成CAPTCHA验证。 5、严格的逻辑验证。防止在登录页面,注册页面,密码修改页面等出现逻辑错误。

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/sycamorelg/article/details/114626454
-- 展开阅读全文 --
Web安全—逻辑越权漏洞(BAC)
« 上一篇 03-13
Redis底层数据结构--简单动态字符串
下一篇 » 04-10

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复