2022年Facebook OAuth 帳戶接管漏洞
聲明:文章中涉及的程序(方法)可能帶有攻擊性,僅供安全研究與教學之用,讀者將其信息做其他用途,由用戶承擔全部法律及連帶責任,文章作者不承擔任何法律及連帶責任。 |
背景介紹:
國外一位名叫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)