OAuth 2.0身份验证漏洞

2021-03-29 00:06:08

在浏览网络时,您'几乎肯定会遇到遍布您使用社交媒体帐户登录的网站。此功能是使用流行的OAuth 2.0框架构建此功能。 OAuth 2.0对攻击者来说非常有趣,因为它既非常常见,并且本质上容易实现错误。这可能导致许多漏洞,允许攻击者获得敏感的用户数据并完全逐步绕过身份验证。

在本节中,我们' ll教你如何识别和利用OAuth 2.0身份验证机制中找到的一些关键漏洞。不要担心,如果你'重新熟悉OAuth身份验证 - 我们提供了大量的背景信息,以帮助您了解您的关键概念' ll需要。我们' LL还探索OAuth' S OpenID Connect扩展中的一些漏洞。最后,我们' ve包括一些关于如何保护自己的应用程序免受这些类型的攻击的指导。

像往常一样,我们'已经提供了一系列故意脆弱的网站,被称为"实验室&#34 ;,这样就可以在实践中看到了这些漏洞,并把你'已经了解了他们开发的测试。如果您&#39更喜欢直接潜入实验室,您可以从我们的Labs索引页面访问完整列表。

OAuth是一个常用的授权框架,使网站和Web应用程序能够请求有限访问用户' s帐户在另一个应用程序上。至关重要的是,OAuth允许用户授予此访问,而不会将其登录凭据暴露给请求应用程序。这意味着用户可以精细调整他们想要分享的数据,而不是不得不完全控制他们的帐户到第三方。

基本的OAuth进程广泛用于集成需要访问用户' S帐户的某些数据的第三方功能。例如,应用程序可能会使用OAuth来请求访问电子邮件联系人列表,以便它可以建议人们连接。但是,相同的机制也用于提供第三方认证服务,允许用户使用与不同的网站有不同的帐户登录。

虽然OAuth 2.0是当前标准,但某些网站仍然使用旧版版本1a。 OAuth 2.0由划痕写入,而不是直接从OAuth 1.0开发。结果,这两个是非常不同的。请注意,这个词和#34; OAuth"在整个这些材料中专门引用OAuth 2.0。

OAuth 2.0最初开发为分享对应用程序之间特定数据的访问方式。它通过定义三个不同方之间的一系列交互,即客户端应用程序,资源所有者和OAuth服务提供商。

客户端应用程序 - 想要访问用户' s数据的网站或Web应用程序。

OAuth服务提供商 - 控制用户的网站或应用程序和数据和访问它。它们通过提供与授权服务器和资源服务器交互的API来支持OAuth。

可以实现实际OAuth过程的许多不同的方法。这些被称为OAuth"流动"或"授予类型"在这个主题中,我们' ll专注于"授权码"和#34;隐式"授予类型,因为这些类型是最常见的。广泛地说,这两个授予类型都涉及以下阶段:

客户端应用程序请求访问用户' s数据的子集,指定他们想要使用的授权类型以及他们想要的任何类型的访问。

提示用户登录OAuth Service,并明确表示同意所请求的访问。

客户端应用程序收到唯一的访问令牌,证明他们有权从用户访问所请求的数据。根据授权类型,究竟如何发生这种情况。

客户端应用程序使用此访问令牌来使API调用从资源服务器获取相关数据。

在学习OAUTH如何用于身份验证之前,它非常重要,了解这一基本OAuth流程的基本面。如果您与OAuth完全新的,我们建议您熟悉授予我们&#39的授予类型的详细信息;重新覆盖进一步阅读前。

虽然最初未用于此目的,但OAuth也进化为验证用户的手段。例如,您可能熟悉了许多网站的选项,以使用现有的社交媒体帐户登录的选项,而不是必须与有问题的网站注册。每当你看到这个选项时,那就'它是一个很好的机会,它建立在OAuth 2.0上。

对于OAuth身份验证机制,基本OAuth流程仍然是相同的;主要区别是客户端应用程序如何使用它收到的数据。从最终用户的角度来看,OAuth身份验证的结果是广泛类似于SAML的单点登录(SSO)的原因。在这些材料中,我们' LL专注于此SSO的用例中的漏洞。

用户选择使用社交媒体帐户登录的选项。然后,客户端应用程序使用社交媒体站点' s OAuth服务来请求访问它可以用于识别用户的某些数据。例如,这可以是其帐户注册的电子邮件地址。

在接收到访问令牌后,客户端应用程序通常从资源服务器请求该数据,通常来自专用/ userInfo端点。

一旦收到数据,客户端应用程序就会代替用户名来登录用户名。从授权服务器接收的访问令牌通常使用而不是传统密码。

您可以看到一个简单的例子,即如何在以下实验室中查找。刚完成"登录社交媒体和#34;通过Burp代理流量的选项,然后在代理历史记录中研究一系列OAuth交互。您可以使用凭据Wiener登录:Peter。请注意,此实现是故意脆弱的 - 我们' LL教你如何稍后剥离。

OAuth身份验证漏洞部分地出现,因为OAuth规范的设计相对模糊,灵活。虽然每个授予类型的基本功能所需的少量强制性组件,但绝大多数实施是完全可选的。这包括保持用户&#39所必需的许多配置设置;数据安全。简而言之,有足够的机会来蠕动的不良做法。

OAuth的其他关键问题之一是普遍缺乏内置安全功能。安全性依赖于使用配置选项的正确组合和在顶部实现自己的额外安全措施,例如强大的输入验证。像你'可能会聚集在那里,有很多东西,如果你'重新经历OAuth,这很容易出错。

根据授权类型,也通过浏览器发送高度敏感的数据,这为攻击者拦截了各种机会。

识别应用程序使用OAuth身份验证时相对简单。如果您看到要使用不同网站使用帐户登录的选项,则这是在使用OAuth的强烈指示。

识别OAuth身份验证最可靠的方法是通过Burp来代理您的流量,并在使用此登录选项时检查相应的HTTP消息。无论是否使用哪个OAuth授权类型,流程的第一个请求将始终是包含许多用于OAUTH的查询参数的/授权端点的请求。特别是,对Client_ID,Redirect_URI和Response_type参数留出遥留。例如,授权请求通常看起来像这样:

在识别漏洞方面,使用正在使用的OAuth服务的一些基本录制可以指向您的正确方向。

不言而喻,您应该研究构成OAuth流的各种HTTP交互 - 我们' LL浏览一些特定的东西来稍后要看。如果使用外部OAuth服务,则应该能够从发送授权请求的主机名中识别特定提供程序。由于这些服务提供了一个公共API,通常有详细的文档可用于告诉您各种有用的信息,例如端点的确切名称以及正在使用的配置选项。

了解授权服务器的主机名后,应始终尝试将GET请求发送到以下标准端点:

这些通常会返回包含关键信息的JSON配置文件,例如可以支持的附加功能的详细信息。这有时会提示您在文档中可能未提及的更广泛的攻击表面和支持的功能。

客户申请中可能会出现漏洞' oauth的实施以及OAuth服务本身的配置。在本节中,我们' ll向您展示如何利用这两个上下文中的一些最常见的漏洞。

客户端应用程序通常会使用信誉良好的战斗,并良好地保护广泛的已知漏洞利用良好的oauth服务。但是,他们自己的实施方面可能不那么安全。

正如我们已经提到的那样,OAuth规范相对松散地定义。对于客户申请的实现尤其如此。 OAuth流中有很多活动部件,每个授予类型中有许多可选的参数和配置设置,这意味着有大量的错误控制范围。

由于通过浏览器发送访问令牌引入的危险,主要推荐用于单页应用的隐式授予类型。但是,它通常也用于经典的客户端 - 服务器Web应用程序,因为它相对简单。

在此流程中,访问令牌通过用户' s浏览器从OAuth服务发送到客户端应用程序作为URL片段。然后,客户端应用程序使用JavaScript访问令牌。问题是,如果应用程序想要在用户关闭页面后维护会话,则需要将当前用户数据(通常是用户ID和访问令牌)存储在某处。

为了解决这个问题,客户端应用程序通常会在POST请求中将此数据提交到服务器,然后为用户分配会话cookie,有效地记录。此请求大致相当于可能作为零件发送的表单提交请求基于经典的密码登录。但是,在这种情况下,服务器没有任何秘密或密码来与提交的数据进行比较,这意味着它是隐式信任的。

在隐式流动中,该帖子请求通过浏览器暴露给攻击者。因此,如果客户端应用程序不正确检查访问令牌是否与请求中的其他数据匹配,则此行为可能导致严重漏洞。在这种情况下,攻击者可以简单地将发送给服务器发送到服务器以模拟任何用户的参数。

虽然OAuth流的许多组件是可选的,但是,除非有没有使用它们的重要原因,否则将强烈建议其中一些组件。一个这样的示例是状态参数。

状态参数应该理想地包含一个不间断的值,例如与用户绑定的东西的散列; s' s会话首次启动OAuth流程时。然后,此值将在客户端应用程序和OAuth服务之间来回通过,作为客户端应用程序的CSRF令牌的形式。因此,如果您注意到授权请求不发送状态参数,这对攻击者的透视非常有趣。它可能意味着他们可以在欺骗用户欺骗浏览器之前启动OAuth流动,类似于传统的CSRF攻击。这取决于客户端应用程序如何使用OAuth的严重后果。

考虑一个网站,允许用户使用经典,基于密码的机制或通过使用OAuth将其帐户链接到社交媒体配置文件的网站。在这种情况下,如果应用程序无法使用状态参数,则攻击者可能会通过将其绑定到自己的社交媒体帐户来劫持受害者用户' s帐户。

请注意,如果站点允许用户专门通过OAUTH登录,则状态参数可以变得不那么重要。但是,不使用状态参数仍然可以允许攻击者构建登录CSRF攻击,从而欺骗用户登录攻击者' s帐户。

也许是最昭着的基于OAuth的漏洞是当OAuth服务本身的配置使攻击者能够窃取与其他用户相关联的授权代码或访问令牌;帐户。通过窃取有效的代码或令牌,攻击者可能能够访问受害者' s数据。最终,这可以完全妥协他们的帐户 - 攻击者可能会在以此OAuth服务注册的任何客户端应用程序上作为受害者用户身份登录。

根据授权类型,代码或令牌通过受害者' s浏览器发送到授权请求的redirect_uri参数中指定的/回调端点。如果OAuth服务无法正常验证此URI,则攻击者可能能够构建类似CSRF的攻击,欺骗受害者和#39;浏览器,以启动将代码或令牌发送到攻击者控制的redirect_uri的OAuth流程。

在授权代码流的情况下,攻击者可能会在使用之前窃取受害者' s代码。然后,它们可以将此代码发送到客户端应用程序' s合法/回调端点(原始redirect_uri)以访问用户' s帐户。在这种情况下,攻击者甚至不需要了解客户端密钥或生成的访问令牌。只要受害者与OAuth服务有了有效的会话,客户端应用程序就会在登录受害者之前完成攻击者和#39; s的代码/令牌交换。

请注意,使用状态或随机保护不一定会阻止这些攻击,因为攻击者可以从自己的浏览器生成新值。

更安全的授权服务器还需要在交换代码时发送redirect_uri参数。然后,服务器可以检查这是否与初始授权请求中收到的那个匹配,并拒绝交换否则。由于这在通过安全反向通道的服务器到服务器请求中发生,因此攻击者无法控制第二个redirect_uri参数。

由于在上一个实验室中看到的各种攻击,在注册OAuth服务时,客户应用程序为客户端申请提供了一个正版回调URI的白名单是最好的。这样,当OAuth服务接收到新请求时,它可以对此白名单验证redirect_uri参数。在这种情况下,提供外部URI可能会导致错误。但是,可能仍有方法来绕过这种验证。

审核OAuth流时,您应该尝试使用Redirect_Uri参数来了解它是如何验证的。例如:

某些实现允许通过仅检查字符串以正确的字符序列序列来允许一系列子目录i.e.批准的域。您应该尝试删除或添加任意路径,查询参数和片段,以查看您可以在不触发错误的情况下更改。

如果您可以将额外的值附加到默认的redirect_uri参数,则可以通过OAuth服务的不同组件来利用URI解析之间的差异。例如,您可以尝试以下方式:https://default-host.com& @ foo.evil-user.net#@ bar.evil-user.net /如果您'重复不熟悉这些技术,我们建议阅读我们的内容,以如何规避共同的SSRF防御和CORS。

您可能偶尔会遇到服务器端参数污染漏洞。只是在情况下,您应该尝试提交重复的redirect_uri参数,如下所示:https://oauth-authorization-server.com/?client_id=123 & ;edirect_uri= client-app.com/callback&骤数;redirect_uri=evil-user.net

某些服务器还将特殊的处理给Localhost Uri,因为它们经常在开发期间使用。在某些情况下,可以在生产环境中意外允许使用localhost开始的任何重定向URI。这可能允许您通过注册域名(例如localhost.evil-user.net)绕过验证。

值得注意的是,您应该限制您的测试,以便在隔离中探测redirect_uri参数。在野外,您经常需要尝试不同的变化组合到几个参数。有时改变一个参数会影响他人的验证。例如,将response_mode从查询更改为片段,有时可以完全更改redirect_uri的解析,允许您提交否则会被阻止的URI。同样,如果您注意到支持Web_Message响应模式,则这通常允许更广泛的redirect_uri子域。

针对更强大的目标,您可能会发现无论您尝试什么,您都无法成功提交外部域作为redirect_uri。然而,这不起作用,这意味着它'时间放弃。

在这个阶段,你应该对你可以篡改哪些部位的uri才有相对良好的理解。键现在是使用此知识来尝试访问客户端应用程序本身内的更广泛的攻击面。换句话说,尝试解决是否可以更改redirect_uri参数以指向白名单域上的任何其他页面。

尝试找到您可以成功访问不同子域或路径的方法。例如,默认URI通常会位于特定于OAuth的路径上,例如/ OAuth /回调,这不太可能具有任何有趣的子目录。但是,您可以使用目录遍历技巧来提供域上的任意路径。这样的东西:

一旦确定您能够设置为重定向URI的其他页面,您应该审核它们以获取可能使用泄漏代码或令牌的其他漏洞。对于授权代码流,您需要查找一个漏洞,可让您访问查询参数,而对于隐式授予类型,则需要提取URL片段。

为此目的的最有用的漏洞之一是开放式重定向。您可以使用此作为代理转发受害者,以及其代码或令牌,到攻击者控制的域,您可以在其中托管您喜欢的任何恶意脚本。

请注意,对于隐式授权类型,窃取访问令牌并不能让您登录受害者'在客户端应用程序上登录。随着通过浏览器进行的整个隐式流动,您还可以使用令牌来使您自己的API调用oauth service' s资源服务器。这可以使您能够获取您无法从客户端应用程序和#39; S Web UI中无法访问的敏感用户数据。

除了开放式重定向外,您还应该查找允许您提取代码或的任何其他漏洞

......