Facebook提供了一個(gè)GraphQL節(jié)點(diǎn),管理員可以通過這個(gè)節(jié)點(diǎn)查看廣告的用戶點(diǎn)擊日志。這些廣告指的是那些會(huì)出現(xiàn)在Facebook和Instagram上的廣告,可以是贊助式廣告,也可以是出現(xiàn)在側(cè)邊欄上的常規(guī)廣告,這些廣告可以根據(jù)不同用戶的選擇和習(xí)慣來顯示相應(yīng)的內(nèi)容。但需要注意的是,并非所有的用戶都能夠知道某個(gè)廣告的創(chuàng)作者、廣告開發(fā)經(jīng)費(fèi)、目標(biāo)人群、以及賬號(hào)所綁定的信用卡數(shù)據(jù)。

介紹
目前,F(xiàn)acebook還沒有一份公開的GraphQL文檔或指南,所以我們開始先簡單介紹一下它如何使用收集到的信息來對(duì)用戶進(jìn)行有根據(jù)的推測(cè)。
首先,請(qǐng)大家按照ApolloData的這篇基礎(chǔ)教程【傳送門】來搭建一臺(tái)GraphQL測(cè)試服務(wù)器,可供參考的資料還有g(shù)raphql.org的這兩篇文章。【資料一】【資料二】

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

Facebook給我們提供了很多種root查詢,比如說,nodes可以在一次調(diào)用中接受多個(gè)ID,并返回多個(gè)對(duì)象。Root查詢中的默認(rèn)對(duì)象和數(shù)據(jù)域如下圖所示:

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

我們還需要盡可能地降低錯(cuò)誤發(fā)生的次數(shù),因?yàn)槟壳斑@個(gè)功能仍處于測(cè)試階段,因此我們不想在Facebook的日志系統(tǒng)中留下太多的記錄。不過幸運(yùn)的是,F(xiàn)acebook的GraphQL還允許我們找出當(dāng)前的數(shù)據(jù)類型。

既然我們已經(jīng)知道了相關(guān)的數(shù)據(jù)類型,我們就可以通過查看已有資源和之前的查詢請(qǐng)求來確定系統(tǒng)是否會(huì)接受這些數(shù)據(jù)域了。

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

Instagram

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