2022年Facebook OAuth 帐户接管漏洞

VSole2022-07-28 12:49:52

声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

背景介绍:

国外一位名叫Youssef Sammouda的白帽子于今年5月中旬公布了他在Facebook上发现的数个漏洞,利用这些漏洞组合,最终获得了44625 美元的赏金奖励(包含7000元钻石联赛奖金以及2625元赏金延迟奖金)。

漏洞说明:

该漏洞允许攻击者窃取用于登录 Facebook 的 Gmail OAuth id_token从而接管受害者的Facebook 帐户,而发生这种情况是利用了多个漏洞,主要是 Facebook 沙箱域中的 XSS 和导致与该沙箱域共享的敏感数据漏洞。我们先来看看这几个漏洞分别是什么。

1、Facebook Checkpoint

Facebook 在登录后有额外的安全机制,负责保护和验证用户的真实身份,确保有效的 MFA。此外,如果你的 Facebook 帐户因滥用或暂时被阻止而被删除,你最终会进入这个“Checkpoint”(检查点)。

在此检查过程中的某些情况下,你需要完成验证码以确保在正常的速率限制和尝试次数中:


从上图可以看出,他们使用了Google Captcha,并将Google Captcha作为一项额外的安全功能,以避免将来自Google的第三方代码添加到主域中,他们将 Google Captcha 包含在沙箱域中,并在将其放入 Iframe 后与主域之间建立通信。

一切看起来似乎都OK,但这个实现中的奇怪部分是不知何种原因(可能是日志记录)决定在检查点与沙箱域共享当前 URL,如下所示:

例如,当前URL为:

https://www.facebook.com/checkpoint/CHECKPOINT_ID/?test=test

正在加载的iframe页面将具有这个URL:

https://www.fbsbx.com/captcha/recaptcha/iframe/?referer=https%3A%2F%2Fwww.facebook.com%2Fcheckpoint%2FCHECKPOINT_ID%2F%3Ftest%3Dtest

如同所见,第一个URL作为参数被包含在第二个URL中

此外,由于处于这个Checkpoint,所以在 www.facebook.com 域中访问的任何 URL 都会让我们再次重定向到这个Checkpoint,然后前一个 URL 同样被包含在下一个URL的参数中:

1、(访问)

https://www.facebook.com/eg_oauth_callback_endpoint?code=code

2、(服务器重定向) 

https://www.facebook.com/checkpoint/CHECKPOINT_ID/?next=https%3A%2F%2Fwww.facebook.com%2Feg_oauth_callback_endpoint%3Fcode%3Dcode

3、(内部Iframe)

https://www.fbsbx.com/captcha/recaptcha/iframe/?referer=https://www.facebook.com/checkpoint/CHECKPOINT_ID/?next=https%3A%2F%2Fwww.facebook.com%2Feg_oauth_callback_endpoint%3Fcode%3Dcode

那么我们便可以将在 www.facebook.com 中访问过任何URL及泄露给 www.fbsbx.com,下一步就是想办法把它们从沙箱域中泄露给我们,这并不困难,因为沙箱域的安全性与主域相比较而言松散了很多,我们也能从中轻易地找到 XSS。

2、XSS in www.fbsbx.com

白帽小哥之前就在该网站发现了XSS,因为 Facebook 实际上使用沙盒域来允许某些用户可以上传 HTML 文件的特定功能,即使在本次漏洞确认后,该功能仍然保持原样。

只需要拥有一个开发者帐户,然后在https://developers.facebook.com/tools/playable-preview/ 使用脚本上传 HTML 文件即可,最终文件将被上传到 www.fbsbx.com,如下所示:

https://www.fbsbx.com/developer/tools/playable-preview/preview-asset/?handle_str=STR

3、退出和登录CSRF

由于目标 Facebook 帐户不处于Checkpoint状态,因此我们无法利用上述的漏洞,在这种情况下,我们可以先注销当前用户,并将其登录到处于 Checkpoint 状态的攻击者帐户,但如果这样做了,我们还怎么接管他人的 Facebook 帐户呢?

答案是针对 Facebook 使用的第三方 OAuth,即 Gmail。如果用户登录到 Gmail,Gmail 会将 OAuth code/Token发送回 www.facebook.com,并且由于我们可以窃取访问 www.facebook.com 的任何内容,于是便可以使用 Google OAuth 登录到 Facebook与该 Gmail 帐户相关联的帐户(即任何拥有 Gmail 帐户的 Facebook 帐户)

4、SOP && COOP

要窃取传递给 facebook 内部 iframe 的 URL,我们首先应该在两个窗口之间建立关系:

窗口 (1)具有如下URL

https://www.facebook.com/checkpoint/?next=Pevious_Page_With_Gmail_Code

的页面,以及带有 XSS 的

https://www.fbsbx.com/developer/tools/playable-preview/preview-asset/?handle_str=

页面的窗口(2)。

例如,我们可以从窗口 (2) 访问 opener.frames[0] .location.href :

–这里的Opener是窗口 (1)。

– frames[0]是 iframe 里面有

https://www.fbsbx.com/captcha/recaptcha/iframe/?referer=https://www.facebook.com/checkpoint/?next=Pevious_Page_With_Gmail_Code

的页面。

由于frames [0] 和窗口 (2) 是同源的,所以可以读取被盗代码的页面location.href。

唯一可以防止这种情况发生的保护措施是 COOP(Cross-Origin-Opener-Policy),但它在前几个月在 Facebook 中被大量应用。

攻击步骤:

完整攻击将通过上传脚本传递到 www.fbsbx.com,通过利用步骤2中的XSS,从而执行以下步骤的代码:

1、退出CSRF:代码已被原作者编辑(隐藏)

2、登录CSRF:代码已被原作者编辑(隐藏)

3、使用windows.open打开(TARGET):

https://accounts.google.com/o/oauth2/auth?redirect_uri=https://www.facebook.com/oauth2/redirect/&response_type=permission%20code%20id_token&scope=email%20profile%20openid&client_id=15057814354 -80cg059cn49j6kmhhkjam4b00on1gb2n.apps.googleusercontent.com

它将重定向到

www.facebook.com/checkpoint/CHECKPOINT_ID/?next=URL_WITH_CODE 

其中 URL_WITH_CODE 是

www.facebook.com/oauth2/redirect/?code=Gmail_Code

4、等待几秒,然后访问 TARGET.frames[0].location.href,我们就有了 Google OAuth code和 id_token,作为攻击者,我们可以从 id_token 中提取电子邮件地址,然后在 www.facebook.com 中启动密码重置过程(设置正确的 sfui cookie),然后选择连接到 Gmail(openid),我们会重定向到与第 3 步类似的 URL,但会带有额外的状态参数。

我们使用上一步重定向到 accounts.google.com 中的状态,并将其放在此处以构建最终 URL

https://www.facebook.com/oauth2/redirect/?state=STATE&code=CODE_FROM_STEP_4

如果我们访问上面这个 URL,在响应包的正文中会看到一个访问受害者帐户的链接(该URL的 /recover/password/ 中包含有一个随机数,该随机数即为受害者帐户)。

漏洞时间线:

Feb 16, 2022— Report Sent 

Feb 22, 2022— Acknowledged by Facebook

Mar 21, 2022— Fixed by Facebook

May 14, 2022 — $44625 bounty awarded by Facebook. (7000 Diamond League Bonus, 2625 Bounty Delay Bonus)

oauthcheckpoint
本作品采用《CC 协议》,转载必须注明作者和本文链接
唯一可以防止这种情况发生的保护措施是 COOP,但它在前几个月在 Facebook 中被大量应用。
网络攻击十大目标行业:政府、通讯、银行、IT、酒店、航空、汽车、医疗、学校、关基。
以勒索软件为代表的网络威胁正从小概率事件变为时间问题,去年底的Solarwinds事件还未消退,7月初针对IT服务供应商Kayesa的供应链黑客攻击又破规模之最。
2018年1月21日,国家信息安全漏洞共享平台(CNVD)接收了OAuth 2.0存在第三方帐号快捷登录授权劫持漏洞(CNVD-C-2018-06621)。综合利用上述漏洞,攻击者可通过登录受害者账号,获取存储在第三方移动应用上的敏感信息。由于OAuth广泛应用于微博等社交网络服务,漏洞一旦被黑客组织利用,可能导致用户隐私信息泄露。
网站和应用程序用于连接到Facebook,Google,Apple,Twitter等的开放授权标准实施中的漏洞可能允许攻击者接管用户帐户,访问和/或泄露敏感信息,甚至进行金融欺诈。当用户登录到网站并单击链接以使用另一个社交媒体帐户登录时,OAuth就会发挥作用,例如“使用Facebook登录”或“使用Google登录” - 许多网站都使用该功能允许跨平台身份验证。该漏洞是Salt研究人员在在线平台实施OAuth时发现的第二个也是更具影响力的漏洞,OAuth被证明是一个难以安全实施的标准。
前言为什么使用spring-authorization-server?真实原因:原先是因为个人原因,需要研究新版鉴权服务,看到了spring-authorization-server,使用过程中,想着能不能整合新版本cloud,因此此处先以springboot搭建spring-authorization-server,后续再替换为springcloud2021。官方原因:原先使用Spring Security OAuth,而该项目已经逐渐被淘汰,虽然网上还是有不少该方案,但秉着技术要随时代更新,从而使用spring-authorization-serverSpring 团队正式宣布 Spring Security OAuth 停止维护,该项目将不会再进行任何的迭代项目构建以springboot搭建spring-authorization-server数据库相关表结构构建需要创建3张表,sql分别如下CREATE?
谷歌OAuth Client Library for Java的设计目的是用来与web上的任意OAuth协作,而不仅仅是谷歌API。该库基于谷歌Java HTTP客户端库构建,支持Java 7标准版和企业版、安卓4.0、谷歌APP引擎。
2022年4月13日,Google修复了Google-OAuth-Java-Client中的一个身份验证绕过漏洞。漏洞编号:CVE-2021-22573 ,漏洞威胁等级:高危,漏洞评分:8.7。
VSole
网络安全专家