挖洞经验:通过Vimeo的文件上传功能发现其SSRF漏洞
漏洞發(fā)現(xiàn)過程
之前我一直在學(xué)校學(xué)習(xí)我比較討厭的科目知識(shí),所以最近我決定放松休息一下,我告訴自己必須要在HackerOne平臺(tái)中的Vimeo漏洞眾測(cè)中有所發(fā)現(xiàn)。于是,我就直接想測(cè)試一下Vimeo平臺(tái)的上傳功能,尤其是通過Google云端硬盤 (Google Drive)上傳到Vimeo的一些功能特性,所以,在我的Google云端硬盤中我選擇了一個(gè)特定視頻文件,把它執(zhí)行到Vimeo的上傳操作,然后用BurpSuite查看它的具體上傳請(qǐng)求信息。
從上圖可見,上傳視頻文件的具體URL鏈接中包含了Google云盤中的相關(guān)身份驗(yàn)證信息,以便讓Vimeo后端服務(wù)器能有權(quán)限從Google云盤中獲取到相應(yīng)文件,具體的驗(yàn)證信息存在于請(qǐng)求頭的header參數(shù)中。
所以,看到這里我就想在自己的VPS中架設(shè)一個(gè)環(huán)境,發(fā)起上傳視頻文件到Vimeo平臺(tái)的操作,看看上傳請(qǐng)求發(fā)起后,在Vimeo后端服務(wù)器和我的VPS服務(wù)器之間會(huì)發(fā)生什么情況。經(jīng)測(cè)試,從我VPS端上傳到Vimeo后,我VPS中的具體網(wǎng)絡(luò)情況如下,Vimeo后端響應(yīng)回來的消息有些奇怪,尤其是其黃色部分。
其黃色部分的Range,和Content-Range等引起了我的注意,但從其名字中我也大概能猜測(cè)到其大致用途。可以這樣假設(shè),大多數(shù)時(shí)候,因?yàn)橛脩羯蟼鞯囊曨l文件都是比較大的,所以Vimeo不會(huì)用一個(gè)上傳請(qǐng)求來實(shí)現(xiàn)對(duì)整個(gè)文件的上傳。但如果用戶需要上傳的視頻文件較小,那么Vimeo就會(huì)實(shí)現(xiàn)一次請(qǐng)求上傳了。所以這樣來看,Vimeo對(duì)用戶需要上傳的大視頻文件都是采取每次請(qǐng)求部份文件,然后多次請(qǐng)求,再實(shí)現(xiàn)最終整個(gè)文件的組裝完成。整個(gè)上傳流程大概的邏輯如下:
也就是說,Vimeo服務(wù)器請(qǐng)求用戶需要上傳的視頻文件時(shí),它會(huì)判斷如果文件足夠小,那么建立一次連接就可以上傳完成,就不需要后續(xù)再建立連接了。基于此,我突然想到,如果我不向Vimeo服務(wù)端發(fā)送整個(gè)上傳文件會(huì)如何呢?比如,按以上原理,如果我的VPS告訴Vimeo后端服務(wù)器,我需要上傳的文件有500B,那么Vimeo后端服務(wù)器就會(huì)來取走這500B,但是,如果現(xiàn)在我的VPS告訴Vimeo后端服務(wù)器我的文件只有200B,那么之后會(huì)發(fā)生什么呢?說白了,也就是看看Vimeo后端對(duì)大文件上傳的具體操作行為,來試試看。
在此,我用Python編寫了一個(gè)腳本來監(jiān)測(cè)Vimeo的這種取大文件的操作,我需要上傳的視頻文件長度共554231B。測(cè)試發(fā)現(xiàn),當(dāng)Vimeo后端服務(wù)器來取我的這個(gè)554231B大文件時(shí),監(jiān)測(cè)腳本顯示,第一次Vimeo后端只會(huì)讀取8228B長度的部份文件內(nèi)容!
Cool,Vimeo后端在取完8228B長度的部份文件后,會(huì)再接著往下取文件的其余部份,由此,一個(gè)SSRF場(chǎng)景在我腦海中油然而生。如果我的VPS告訴Vimeo后端服務(wù)器一個(gè)重定向響應(yīng),那Vimeo后端服務(wù)器會(huì)跟著跳轉(zhuǎn)嗎?還是會(huì)存儲(chǔ)這個(gè)重定向響應(yīng)?還是繼續(xù)接著往下讀取文件其余部份?我的構(gòu)思場(chǎng)景邏輯如下,Vimeo后端在取完第一次的8228B長度的部份文件內(nèi)容后,會(huì)繼續(xù)發(fā)起對(duì)后續(xù)文件的讀取,這個(gè)時(shí)候,我在后續(xù)文件內(nèi)容中插入一個(gè)惡意文件內(nèi)容-http://evil.com/Hello.txt,其文件內(nèi)容為HelloWorld!zzz,共15個(gè)字節(jié)。那么Vimeo后端在讀取余下的546094字節(jié)文件時(shí),會(huì)一并請(qǐng)求我們惡意插入的鏈接http://evil.com/Hello.txt,把HelloWorld!zzz也順利讀取到。
由于一些Web托管服務(wù)端對(duì)上述攻擊場(chǎng)景作了安全限制,所以我自己動(dòng)手搭建了一個(gè)主機(jī)網(wǎng)站進(jìn)行測(cè)試實(shí)現(xiàn),很幸運(yùn),我的猜想是對(duì)的!按照以上思路在對(duì)Vimeo后端的視頻文件上傳中,可以成功實(shí)現(xiàn)上述預(yù)計(jì)的攻擊測(cè)試場(chǎng)景。
Notice: 在Vimeo服務(wù)中,我們可以下載原始的上傳文件,所以根據(jù)這種下載路徑,我們也能輕松構(gòu)造對(duì)響應(yīng)的一些假冒偽造操作。
漏洞利用
經(jīng)過測(cè)試,我發(fā)現(xiàn)Vimeo后端服務(wù)相關(guān)操作是建立在Google云上的,它后端部署了一個(gè)谷歌云實(shí)例,而且請(qǐng)求這個(gè)實(shí)例http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token,可以發(fā)現(xiàn)其默認(rèn)的API訪問token!那么有了這個(gè)token之后,我就能把我的公共SSH密鑰添加到實(shí)例中,然后再通過我的私鑰去連接它,就能連接到Vimeo在Google云上的實(shí)例,按照上述我們預(yù)設(shè)的步驟成功實(shí)現(xiàn)SSRF。(此處可參考另一Vimeo SSRF漏洞)
總結(jié)
以上是生活随笔為你收集整理的挖洞经验:通过Vimeo的文件上传功能发现其SSRF漏洞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python paho-mqtt消息队列
- 下一篇: Docker 的4种网络模式