声明:该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。
身份验证漏洞很有趣,因为它们本质上影响很大,并且经常允许未经授权的用户以提升的权限访问各种资源。尽管它们更难发现,在OWASP 十大漏洞列表中仅排在第 7 位,但它们仍然构成重大风险,当然值得测试。
在本文中,我们将介绍什么是身份验证漏洞,并帮助您识别和利用简单和更高级的情况。请注意,本文不会介绍第三方身份验证机制(如 OAuth 2.0 或 SAML)中发现的安全配置错误或漏洞。这些将在以后的文章中介绍。
让我们开始吧!
什么是破坏身份验证漏洞?
身份验证是在授予用户访问特定资源的权限之前验证用户凭据的行为。它是控制仅供少数授权用户使用的关键资源和应用程序(例如,用于开发目的的应用程序)访问所必需的最前沿防御层。
如果没有身份验证,关键资源(通常具有提升的权限)就会暴露给互联网上的任何人,包括未经身份验证和未经授权的用户。
简单的身份验证过程通常围绕一组提供的用户凭据(电子邮件和密码)进行验证。然而,如今人们正在应用各种其他身份验证机制来防止未经身份验证的用户访问受控资源。当此身份验证方法配置不正确时,它可能会开启新的攻击途径。
易受破坏的身份验证漏洞影响的应用程序无法验证用户的访问权限,从而导致受保护的应用程序被暴露。
本文将分析最常见的身份验证漏洞,但在此之前,让我们先解决身份验证和授权之间的一个常见误解。
身份验证和授权之间的区别
身份验证是验证某人身份的过程,即确认用户的身份。另一方面,授权决定某人可以做什么,即用户拥有的权限和访问权限。
身份验证和授权控制都需要强制执行,因为它们在保护应用程序或系统方面都发挥着巨大的作用。
让我们看一个简单的例子。在 Intigriti,您必须先登录您的帐户,这样我们才能确定您是谁并返回与您的帐户相关的数据(= 身份验证)。之后,我们实施授权控制,以防止未经授权的漏洞赏金猎人访问他们未被邀请的私人漏洞赏金计划(= 授权)。
提示!想在我们的平台上获得一些私人邀请吗?提交一些高质量的报告,积极主动地在 Intigriti 上展示您的黑客技能!漏洞赏金计划喜欢活跃的猎人,并会一直邀请他们加入私人计划!
识别破坏身份验证的漏洞
当身份验证机制较弱(例如可预测的会话令牌)或开发不充分时,就会出现身份验证漏洞。
下面,我们将探讨如何利用破坏的身份验证漏洞并利用任何现有的逻辑缺陷的几种方法。
利用基本身份验证漏洞
强制浏览
这种利用方法需要直接请求经过身份验证的资源。在某些情况下,逻辑错误或身份验证机制的错误实施会导致资源仍然可访问,但只能通过直接请求才能访问。
这通常是由于请求的资源缺乏身份验证。一种常见的测试方法是使用适合目标类型的单词表进行暴力破解攻击。
结果将允许您查看哪些资源无需身份验证即可访问。
让我们看一个简单的例子:
上图源自使用 Ffuf 进行的内容发现扫描,它显示虽然在/admin/
目录上应用了适当的权限,但不幸的是这些权限不是递归的。
这使得我们可以直接请求该目录内的文件而无需任何身份验证,从而揭示了端点的存在GetResource.aspx
!
提示!运行内容发现扫描时,请尝试更改您的请求方法(例如,从到或)!某些 API 端点或应用路由仅被编程为在请求中发送特定 HTTP 方法时返回有效响应!GET
POST
PUT
默认凭据
某些身份验证机制还设置为接受弱凭据或默认凭据(例如 admin/admin)。当开发人员或 Web 管理员设置新的应用程序或系统但无法访问密码管理器时,他们通常会保留默认凭据或将登录名设置为易于记忆的用户名和密码组合。当此资源暴露在互联网上时,就会出现问题,当开发人员忘记轮换这些凭据时,问题就更加严重了。
以下是一些常见的默认凭证模式,格式如下"<username>:<password>"
:
-
管理员:管理员
-
管理员:管理员
-
<公司>:<公司>
-
<公司>:密码
-
测试:测试
这些只是您可以手动尝试的一些方法。
提示!SecLists 列出了几乎所有常用软件供应商的 2.8K 多个记录默认凭证!下次您遇到使用第三方软件供应商的目标时,请尝试检查默认凭证!
缺乏速率限制(暴力破解)
未能对传入客户端请求实施速率限制的应用程序更容易受到暴力破解和凭证填充攻击。这通常允许攻击者暴力破解弱凭证。特别是当响应更改允许您枚举现有用户帐户时。
各种自动化工具都可以帮助我们进行暴力破解登录,例如 BurpSuite Intruder 和 Ffuf!让我们以使用 Ffuf 为例:
ffuf -w "/path/to/wordlist" -X "POST" -d "username=admin&password=FUZZ" -H "Content-Type: application/x-www-form-urlencoded" -u "https://app.example.com/auth/login" -mr "Incorrect password"
此命令本质上会针对管理员用户尝试您所选单词列表中的所有类型的弱密码。我们还设置了匹配规则,以便在接受可能有效的密码时通知我们。
请注意,许多漏洞赏金计划并不认为缺乏速率限制会对应用程序造成重大风险,并且经常将其标记为超出范围,因为它们已安装其他系统和安全功能。详细了解漏洞赏金中的积极扫描。
利用高级身份验证漏洞
缺乏输入验证
注入漏洞,特别是 SQL 注入,可能导致身份验证绕过。让我们看一个易受攻击的代码片段的简单示例:
如上图所示,这两个字段都容易受到 SQL 注入攻击。在这种情况下,我们可以传递一个有效的用户名(例如“admin”)并破解其余的 SQL 查询,而无需提供密码:
POST /login.php HTTP/1.1Host: app.example.comContent-Type: application/x-www-form-urlencoded; charset=utf-8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3username=admin&password=xyz' OR 1=1; --
发送上述请求将自动允许我们以管理员用户身份登录。这是一个简单的例子,表明缺乏输入验证也会触发不良行为,导致部分或完全绕过身份验证。因此,始终建议在任何身份验证端点上广泛测试 SQL 注入。
可预测的“记住我”标记
开发人员经常会引入一项功能,允许持久身份验证,并在用户稍后访问网站时保持登录状态。此令牌有效地绕过了整个身份验证过程,因此,重要的是此持久身份验证令牌是不可预测的,并且存储在安全的地方。
“记住我”令牌通常由唯一标识符(例如用户名或用户 ID)和高熵令牌组成,并且通常作为(仅 HTTP)cookie 保存在客户端的 Web 浏览器中。
在某些情况下,尽管开发人员付出了所有努力来生成唯一的令牌,但它仍然是可预测的,并且可能允许任何人生成他/她的令牌。
始终建议分析这些令牌并查看是否可以发现任何可能削弱令牌的潜在缺陷。
密码重置漏洞
密码重置功能总是值得测试的,因为它们可以导致完全接管帐户,而无需目标用户帐户采取任何二次步骤。
大多数开发人员都会使用带有密码重置功能的身份验证框架。这些框架遵循最佳实践和安全准则,并且通常经过充分测试。但是,当进行额外修改或密码重置功能实施不当时,可能会导致密码重置漏洞。
可预测的重置密码令牌
其中之一就是可预测或弱密码重置令牌。颁发的重置密码令牌必须是具有有效期的高熵令牌。如果令牌可以被猜出,任何人都可以生成一个令牌,您可以使用该令牌重置任何帐户的密码。
这将有效地绕过身份验证,无需目标用户采取任何二次必要步骤。
提示!密码重置实现中的主机头注入是绕过身份验证的另一种方法!确保也测试这些类型的漏洞!
可信 IP 白名单绕过
一些身份验证机制围绕验证客户端的公共 IP 地址展开。使用此身份验证方法的服务器和应用程序仅当 IP 与白名单匹配时才允许流量通过。如果 IP 无法匹配,应用程序将完全拒绝您的所有请求或要求提供其他凭据来验证您的访问权限。
在某些情况下,会定义 IP 范围的白名单。这样做通常是为了允许开发人员轻松访问资源。这可能会导致另一种潜在的身份验证绕过,如果 IP 白名单未严格定义,您可以使用 VPN 或代理来欺骗您的 IP 以匹配允许列表并授予您对资源的访问权限。
绕过 IP 白名单的另一种方法是了解客户端的 IP 地址是如何得出的,以及您(客户端)和原始服务器之间是否有反向代理服务器。如果是这种情况,您可能可以通过传递X-Forwarded-For
请求标头来伪造您的 IP。
看一下以下 Nginx 服务器配置文件:
由此我们可以得出,如果X-Forwarded-For
HTTP 请求标头匹配127.0.0.1
,则标记为可信,并将转发请求。否则,它将拒绝并返回 403 响应状态代码。
魔法链接缺乏有效期
魔术链接越来越多地被用作身份验证机制。这是一个无密码身份验证过程,用户输入与帐户关联的电子邮件并收到可用于登录的唯一登录链接。
当令牌可预测或永不过期时,就会出现问题。如果唯一登录链接中使用的令牌很弱,它也可以被预测,并允许任何人为任何用户帐户生成自己的魔法链接。这使得完全绕过身份验证层成为可能。
如果魔法链接永不过期,并且其中一个链接意外泄露(通过主机头注入或被搜索引擎索引),它可以允许未经授权的用户在将来使用相同的链接来获得访问权限。
确保测试已部署无密码身份验证实现的目标。
结论
身份验证漏洞较难发现,但通常影响巨大,可让攻击者访问未经授权的服务或组件。测试目标是否存在被破坏的身份验证漏洞始终是一个好主意,尤其是当您的目标已部署其独特的身份验证实现时,因为它更容易出现设计缺陷,而这些缺陷可能会变成安全漏洞。
原文始发于微信公众号(安全视安):【翻译】身份验证失效:利用高级身份验证漏洞的完整指南
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论