
在參與Twitter漏洞賞金項目的過程中,我通過一些安全測試發現了Twitter存在的重大漏洞:攻擊者不需要獲取他人賬戶權限,就能以任意賬戶發布推文。我于2017年2月26日發現了該漏洞,Twitter方面于2017年2月28日及時對其進行了修復(參考Hackerone),并最終向我獎勵了$7560美元漏洞賞金。我們一起來看看該漏洞細節:
簡介
Twitter Ads最早為向企業開放的廣告服務平臺,為了擴大自媒體廣告業務,Twitter Ads于2013年5月1日向所有美國用戶免費開放,用戶可以通過https://ads.twitter.com/注冊個人廣告業務,實現推文(Tweet)推廣、競價排行、個性化定制等個人廣告宣傳。Twitter Ads服務中包含了一個多媒體庫,注冊用戶可以向該庫上傳個人廣告相關的視頻、圖片、GIF動圖等多媒體文件,另外,用戶在發布推文之前也能對這些文件進行審核。該多媒體庫存在以下鏈接中:
https://ads.twitter.com/accounts/*id_of_your_account*/media
前期試探
如果你是Twitter Ads注冊用戶,用以上鏈接登入多媒體庫后會發現其多媒體文件上傳功能:

我們點擊右上角的媒體文件下載按鈕Download media-file(Загрузить медиа-файл),選擇某一上傳圖片文件后,會顯示相應的已經上傳的圖片:

點擊該圖片放大,請注意查看上圖中顯示的功能,將出現以下情景:

1、我們可以推送發布該多媒體文件
2、我們可以與任何用戶分享該多媒體文件
通過BurpSuit抓包具體分析一下該推文布動作的相關功能:

可以發現網絡請求包中包含以下參數:
account_id:賬戶ID,為已登錄入庫的賬戶ID;
owner_id:圖片文件所有者ID;
user_id:推文分享用戶的ID;
media_key:媒體文件發布ID,如下圖的地址欄URL后部分數字:

接下來,讓我們來定義一些相關的測試標識:
我的第一個測試賬號:account №1
我的第二個測試賬號:account №2
由于我不記得錯誤輸出的確切語句,所以我們暫且把兩個賬號對應的錯誤輸出定義為error №1、error №2。
漏洞發現
首先,我攔截監聽了推文發布的網絡請求信息,并嘗試進行以下參數更改:
基于json的GET請求owner_id和user_id,在POST方式下,被設置從account №1發往對應的account №2處,此時,發生了錯誤error №1;
之后,我嘗試在POST包中更改owner_id和user_id,又出現了錯誤error №2,我記得當時的錯誤提示是這樣的:
作為替代*的,owner_id為*id的用戶,并不是該多媒體文件的所有者,*這里應該是一個media_key*
我想,既然這樣,那我們作出如下更改:
我使用account №2登錄ads.twitter.com,進入媒體庫,上傳圖片,以提前讓Twitter解析出media_key的值。
舉一反三
我們回到account №1登錄狀態:
攔截監聽推文發布的網絡請求信息,針對推文接收方account №2,我們對GET方式和POST請求中的owner_id和user_id作出相應更改,同時使用了之前知道的media_key值,之后,將會得到錯誤error №1,盡管如此,但在對owner_id和user_id的更改替換中,僅只出現了一種錯誤error №1;而僅在POST方式中對owner_id和user_id作出更改替換,會出現另一種錯誤error №2。那我們再試試其它的?
終于,在POST請求中對owner_id、user_id和media_key作出一系列更改替換之后,響應信息提示我們嘗試的推文發布動作成功執行!對于account №2賬戶來說,可以發現盡管該賬戶本身沒有執行任何推文發布動作,但其實以其身份和相應media_key的上傳圖片已被account №1當成推文發送出去了!
漏洞探索
好了,現在,我們可以以任意用戶賬戶身份發布推文了,但同時也存在一些可能會消弱漏洞嚴重性的限制條件:我們用來發布推文的受害者用戶必須具有一個已經上傳的多媒體文件,而且,還需要知道這個多媒體文件的media_key,但由于media_key包含18位數字,一般來說,很難通過暴力猜解或其它方式知曉該數值,media_key值的獲取存在一定限制性難度。
難道這就歇菜了嗎?就這樣向Twitter上報該漏洞?再想想看!我個人感覺該漏洞可能非常嚴重,想想看,還記得之前可以對任何用戶分享該媒體文件的情況嗎?我想到了一個非常有趣的點子:如果我們向受害者用戶(即用他的賬戶發送推文)分享我們的多媒體文件,那么此時,該受害者用戶也將被視為是這個多媒體文件的所有者, 錯誤error №2情況也將不會發生,而以該賬戶身份發送的推文也能成功發布!經過測試證明,該情景確實能成功實現!
綜合以上場景可知,其實對該漏洞的成功利用并不需要media_key的值,當然,如果我們是多媒體文件的所有者,當然也就知道media_key值了。
最終,可以總結出以下漏洞利用的實現條件:
1、我們上傳自己的多媒體文件;
2、向受害者用戶(推文發布用戶)分享該多媒體文件;
3、攔截監聽向受害者用戶發起的推文發布網絡請求信息,并對owner_id和user_id值進行修改,;
4、之后,就可以接收到以受害者用戶身份成功發布推文的響應信息。
5、利用該漏洞盡情玩耍吧!
好了,可以安心地向Twitter上報漏洞并等待漏洞賞金了!
|