Facebook提供了一個GraphQL節點,管理員可以通過這個節點查看廣告的用戶點擊日志。這些廣告指的是那些會出現在Facebook和Instagram上的廣告,可以是贊助式廣告,也可以是出現在側邊欄上的常規廣告,這些廣告可以根據不同用戶的選擇和習慣來顯示相應的內容。但需要注意的是,并非所有的用戶都能夠知道某個廣告的創作者、廣告開發經費、目標人群、以及賬號所綁定的信用卡數據。

介紹
目前,Facebook還沒有一份公開的GraphQL文檔或指南,所以我們開始先簡單介紹一下它如何使用收集到的信息來對用戶進行有根據的推測。
首先,請大家按照ApolloData的這篇基礎教程【傳送門】來搭建一臺GraphQL測試服務器,可供參考的資料還有graphql.org的這兩篇文章。【資料一】【資料二】

如果想通過Facebook查詢一個對象的話,一般我們都會使用root查詢來獲取任意ID(用戶有權限查看)的相關信息。類似頁面這樣的公共實體可以隨意被訪問,但類似廣告賬號這樣的私人實體只有具備一定權限的用戶角色才可以訪問到。

Facebook給我們提供了很多種root查詢,比如說,nodes可以在一次調用中接受多個ID,并返回多個對象。Root查詢中的默認對象和數據域如下圖所示:

偵察
通過使用Shubs(@infosec_au)和Naffy(@nnwakelam)所提供的自定義偵察技術,我們找到了能夠允許我們獲取更多Facebook資源的節點,那么下一步就是要弄清楚我們能夠加載的數據類型。不過有了Shubs和Naffy所提供的方法,這一步操作的難度其實并不大。
Facebook使用了一種Invariant Detector(IVD),并通過這種縱深防御系統來檢查授權規則中的異常查詢請求,所以通過字典來測試所有可能的數據域估計就行不通了。

我們還需要盡可能地降低錯誤發生的次數,因為目前這個功能仍處于測試階段,因此我們不想在Facebook的日志系統中留下太多的記錄。不過幸運的是,Facebook的GraphQL還允許我們找出當前的數據類型。

既然我們已經知道了相關的數據類型,我們就可以通過查看已有資源和之前的查詢請求來確定系統是否會接受這些數據域了。

PoC
為了讓本文所介紹的技術真正應用到實際中,我們要做的就是想辦法讓用戶點擊一個廣告,然后查看廣告訪問日志的響應即可。我們這里使用了一個Python腳本來導出所有使用的GraphQL調用,并給Facebook安全團隊提供了一個攻擊演示視頻。下面是一些視頻截圖以及攻擊者可能查看到的內容:
-廣告創作者的個人Facebook賬號;
-Facebook廣告賬號;
-賬號所使用的支付方式(Mastercard/Visa/Paypal);
-信用卡卡號的最后四位數以及卡片的到期日期;
-廣告的總花費;
Facebook

Instagram

總結
由于Facebook的廣告賬號可以被其他角色的用戶查看到,因此這也就意味著其他的Facebook活動(包括廣告受眾和廣告統計等信息)很有可能也會被他人獲取到。換句話來說,當他人點擊了一個廣告之后,該廣告不僅會將這個廣告賬號中所有其他的廣告信息以及廣告目標人群信息全部泄露出去,而且連廣告制作方的信用卡信息和個人信息都泄露出去。
影響
需要注意的是,Facebook其實并不想廣告的制作方被他人去匿名化,因此這個漏洞給Facebook所帶來的影響不容小覷。我于2017年3月26日首次將漏洞信息上報給了Facebook的事件響應團隊,經過了兩個多月的溝通和努力之后,我在2017年6月6日收到了Facebook提供的一萬美元漏洞獎金。
|