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

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

點(diǎn)擊該圖片放大,請(qǐng)注意查看上圖中顯示的功能,將出現(xiàn)以下情景:

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

可以發(fā)現(xiàn)網(wǎng)絡(luò)請(qǐng)求包中包含以下參數(shù):
account_id:賬戶ID,為已登錄入庫(kù)的賬戶ID;
owner_id:圖片文件所有者ID;
user_id:推文分享用戶的ID;
media_key:媒體文件發(fā)布ID,如下圖的地址欄URL后部分?jǐn)?shù)字:

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