api漏洞系列-OAuth中的race conditions问题

简介: 漏洞描述大多数OAuth2 的API实现在用于处理访问令牌或刷新令牌的请求的时候似乎有多个竞争条件漏洞。竞争条件允许恶意应用程序获得多个access_token和refresh_token对,而实际上应该只生成一对。而且,当访问被撤销时,它会导致授权绕过。

漏洞描述


大多数OAuth2 的API实现在用于处理访问令牌或刷新令牌的请求的时候似乎有多个竞争条件漏洞。

竞争条件允许恶意应用程序获得多个access_tokenrefresh_token对,而实际上应该只生成一对。而且,当访问被撤销时,它会导致授权绕过。


访问令牌的竞争条件:


根据OAuth 2.0 RFC (https://datatracker.ietf.org/doc/html/rfc6749),通过回调获得的代码只能使用一次来生成access_token(以及相应的refresh_token)。

竞争条件漏洞允许恶意应用程序生成多个access_token和refresh_token对。当用户撤销对应用程序的访问时,这会导致身份验证问题。其中一对access_token和refresh_token将被撤销,但其余的都保持活动状态。

26.png

复现步骤


0)注册一个使用目标提供者(注:一般是google,facebook,apple这种厂商)的OAuth 2.0 API的应用程序。获取应用程序的凭证

1)在浏览器中打开应用授权链接。通常它看起来是这样的:https://OAUTH_PROVIDER_DOMAIN/oauth/authorize?client_id=APPLICATION_ID&redirect_uri =https://APPLICATION_REDIRECT_URI&response_type=code

2)登录受害者的账户(如果需要的话),并允许访问应用程序

3)通过回调获取code值:

https://APPLICATION_REDIRECT_URI?code=AUTHORIZATION_CODE_VALUE

4)尝试利用访问令牌请求的竞争条件。我使用了以下脚本:


对于有Race Condition bug的目标(11个测试中的10个),它的执行结果给出了1到20个不同的access_token值(可能与refresh_token值成对)。

5)检查每个access_token。从目标API中获取最简单的请求,并对每个值进行尝试,比如:

GET /api/me?access_token=ACCESS_TOKEN_VALUE HTTP/1.1Host: OAUTH_PROVIDER_DOMAIN

通常,所有的access_token值都是有效的。

6)请注意Race Condition是概率漏洞。可能需要对PoC做一些尝试来重现它。攻击者通常可以向服务器生成一些额外的负载(不是DoS,而是许多对脆弱脚本的请求),以增加成功利用的机会。

7)这里的执行流程有两个可能的方向:

7A)进入受害者账户的设置或应用页面,撤销该应用的访问权限。然后重复步骤5,查看是否所有access_token都无效。如果所有的access_token都无效,那么尽管成功利用了竞态条件,但这是良好的行为。实际上,在某些情况下,只有一个access_token被撤销,而其他所有的token都保持有效。

7B)对一个access_token使用撤销请求(比如/oauth/revoke)。然后重复步骤5,查看在这种情况下,只有一个令牌被撤销,而其他所有令牌都保持活动(除了一个被测试的目标)。


刷新令牌的竞争条件:


虽然代码只能使用一次来获取access_token,但refresh_token通常也只能使用一次。在这种情况下,竞争条件漏洞允许攻击者生成大量的access_token和refresh_token对。这将使受害者很难撤销对恶意应用程序的访问。

0)注册一个使用目标提供者的OAuth 2.0 API的应用程序。获取应用程序的凭证  

1)在浏览器中打开应用授权链接。通常它看起来是这样的:

https://OAUTH_PROVIDER_DOMAIN/oauth/authorize?client_id=APPLICATION_ID&redirect_uri = https://APPLICATION_REDIRECT_URI&response_type=code  

2)登录受害者的账户(如果需要的话),并允许访问应用程序

3)通过回调获取代码值:

https://APPLICATION_REDIRECT_URI?code=AUTHORIZATION_CODE_VALUE

4)合法获取access_token和refresh_token。通常可以由请求来完成,如下所示:  

24.png

5)尝试利用竞态条件刷新令牌。我使用了以下脚本:

25.png

对于有Race Condition bug的目标,它的执行结果会给出1到20个不同的access_token值(可能与refresh_token值成对)。

6)检查获得的access_tokens,就像前面的概念证明一样。它们都是有效的,并且适用于API。

7)请注意Race Condition是概率漏洞。可能需要对PoC做一些尝试来重现它。攻击者通常可以向服务器生成一些额外的负载(不是DoS,而是许多对脆弱脚本的请求),以增加成功利用的机会。

8)这里的执行流程有两个可能的方向:

8A)进入受害者账户的设置或应用程序页面,撤销其访问权限

应用程序。然后重复步骤5,查看是否所有access_token都无效。如果所有的access_token都无效,那么尽管成功利用了竞态条件,但这是良好的行为。实际上,在某些情况下,只有一个access_token被撤销,而其他所有的token都保持有效。

8B)对其中一个access_token使用撤销请求(如/oauth/revoke)。然后重复步骤5,查看在这种情况下,只有一个令牌被撤销,而其他所有令牌都保持活动(除了一个被测试的目标)。

利用refresh_token比利用access_token更危险,因为攻击者不会失败。每次利用至少提供一个新的可进一步使用的refresh_token。因此,令牌对的数量呈指数增长。


影响:


生成大量的令牌用于访问是一个严重的问题,它违反了OAuth框架的RFC和最佳实践。该漏洞使受害者无法拒绝恶意应用程序的访问(对于测试的大多数实现)。

因为目标(例如/oauth/token)脚本容易受到竞态条件的攻击,所以有比我演示的更多的攻击向量。例如,应用程序可以无限刷新其访问权限,而用户也不能撤销访问权限。


目录
相关文章
|
安全 Java API
解决 Swagger API 未授权访问漏洞:完善分析与解决方案
Swagger 是一个用于设计、构建、文档化和使用 RESTful 风格的 Web 服务的开源软件框架。它通过提供一个交互式文档页面,让开发者可以更方便地查看和测试 API 接口。然而,在一些情况下,未经授权的访问可能会导致安全漏洞。本文将介绍如何解决 Swagger API 未授权访问漏洞问题。
|
6月前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
790 0
|
安全 网络协议 Shell
Docker API未授权漏洞复现
Docker API未授权漏洞复现
955 0
|
安全 API
api漏洞系列-邮箱验证API接口无限制,可作为邮箱炸弹
漏洞描述 https://admin.phacility.com/settings/user/toma/page/email/ 中的API接口是无限的,可以用作邮箱炸弹。
415 4
api漏洞系列-邮箱验证API接口无限制,可作为邮箱炸弹
|
安全 API Android开发
api漏洞系列-一个越权漏洞
主要逻辑 Fabric平台帮助你构建更稳定的应用程序,通过世界上最大的移动广告交易平台产生收入,并使你能够利用Twitter的登录系统和丰富的实时内容,实现更大的分发和更简单的身份识别; 在注册功能(主要是为公司注册)中,缺少适当的授权检查,允许任何用户窃取API令牌。
271 1
api漏洞系列-一个越权漏洞
|
安全 API 开发工具
api漏洞系列-API权限升级
主要逻辑 使用能够嵌入Crashlytics的fabric SDK,用twitter登录到他们的Android/IOS应用程序。用户可以在https://fabric.io/dashboard上管理/跟踪仪表板上的报告。
138 1
api漏洞系列-API权限升级
|
安全 API
api漏洞系列-shopify中一个越权漏洞
主要逻辑 这是文档中所讲到的应用程序可以访问的范围(https://docs.shopify.com/api/authentication/oauth#scopes),但应用可以请求/获得更多范围的访问权,而其中有些范围本不应该是可访问的。
289 1
api漏洞系列-shopify中一个越权漏洞
|
安全 API
api漏洞系列-OAuth中的一个问题小结
漏洞描述 OAuth2 API允许用户将访问他们账户的权限授予第三方应用程序。当然,用户能够管理此类应用程序对其帐户的访问,并可能拒绝任何应用程序的访问。当某些用户拒绝对应用程序的访问时,所有的access_token(以及使用的refresh_token)都将被撤销并变得无效。但是不仅access_tokens应该被撤销,授权码(它是OAuth2授权流中使用的中间令牌)也必须被撤销。目前大多数OAuth2 API实现在撤销访问时不撤销授权代码。它可能被恶意应用程序利用去恢复访问用户帐户后,即使权限被撤销。
127 1
api漏洞系列-OAuth中的一个问题小结
|
存储 安全 API
api漏洞系列-OAuth的一个问题
漏洞描述 OAuth2 API允许用户将访问他们账户的权限授予第三方应用程序。当然,用户能够管理此类应用程序对其帐户的访问,并可能拒绝任何应用程序的访问。当某些用户拒绝对应用程序的访问时,所有的access_token都将被撤销并变得无效。但是除了access_tokens应该被撤销以外,授权码(它是OAuth2授权流中使用的中间令牌)也必须被撤销。 在撤销访问时,Vimeo OAuth2 API没有撤销其授权代码。它可能被利用于恢复访问用户帐户。 复现步骤
139 0
api漏洞系列-OAuth的一个问题
|
安全 API iOS开发
api漏洞系列-api速率限制绕过
漏洞描述 该漏洞是关于2FA的绕过,Slack Web应用程序有速率限制实现。在执行4-6次失败的2FA尝试后,速率限制逻辑将被筛选并要求用户等待下一次尝试(防止自动2FA被暴力破解) 使用iOS App(iOS 9.3.3 iPad Air 2)进行相同的测试,发现API端点/API/auth.signin没有该措施。 攻击者可以暴力破解2FA并进入用户(受害者的帐户) 漏洞接口: /api/auth.signin
381 0
api漏洞系列-api速率限制绕过