Vimeo上傳功能中的SSRF

22.jpg

前言

Vimeo是一個高清視頻播客網站,與大多數類似的視頻分享網站不同,Vimeo允許上傳1280X700的高清視頻,上傳後Vimeo會自動轉碼爲高清視頻,源視頻文件可以自由下載,它達到了真正的高清視頻標準。Vimeo允許每月上傳500MB的高清或普通視頻,用戶可以定製視頻的顯示尺寸。  ————百度百科

我在和Vimeo上傳功能相關的上傳流中發現了某些特性,並藉此發現了一個SSRF漏洞。

過程

某一天,在學習了我最討厭的科目後,我決定休息一下,在HackerOne中找一個漏洞懸賞項目鎬勞自己,很快我便瞄準了“Vimeo”。我打開MacBook,進入測試網站,利用其中的上傳功能直接從Google網盤上傳視頻,同時利用BurpSuite捕捉實時請求:

33.png

如你所見,它發送帶有谷歌授權的文件URL,讓後端服務器從指定URL處獲取文件,且數據包中還有Google雲盤授權的請求頭。

現在讓我們使用WireShark,看看Vimeo網站在向我們的VPS請求一個視頻文件後,會發生什麼:

44.png

在這些請求中,我注意到一個不同尋常的請求頭,比如RangeContent-Range。雖然並不常見,不過它的名字足以告訴我它是幹什麼的。爲此,我們可以假設,在大多數情況下,視頻文件是很大的,所以Vimeo不會直接請求一個特別大的完整文件。如果視頻文件很小,它就會請求完整的文件,如果很大,它就會循環請求文件的一部分,直到獲得完整的視頻文件,具體如下圖所示:

55.png

Vimeo服務器會先發送一個請求來檢查文件的大小,如果文件很小,可以通過單個連接直接獲取,那麼它將請求完整的文件。

那麼,如果我的VPS不把完整的文件發送到Vimeo服務器呢?例如,當Vimeo詢問我視頻文件大小時,告訴它文件只有500B,那麼Vimeo就會請求500B大小的內容,但如果我只給它200B的內容呢?

我用Python編寫了一個Web服務器來進行測試,完整的文件長度是554231B,當Vimeo請求完整的文件時,我的服務器只回復8228B的內容!讓我們看看此時的Range請求頭。

66.png

此時,服務器在存儲了8228B的內容後,再次請求視頻文件的剩餘部分。那麼,是不是存在SSRF呢?

如果當Vimeo請求剩餘的視頻文件時,我的服務器響應一個重定向會發生什麼事呢?Vimeo會跟着重定向嗎?會不會存儲響應的內容?經測試後,最終流程圖如下:

77.png

現成的一些Web服務器很難直接用於這類攻擊,所以我決定編寫一個http服務器來執行攻擊。我編寫了代碼,運行它,併成功利用這個上傳功能進行了攻擊!看來我的猜測是正確的!

注意:在Vimeo中,你可以下載你的原始視頻文件,這樣就可以很容易地找到有問題的請求。

88.png

利用

我已經收集到了關於目標服務器的信息,它是一個谷歌雲實例,我還嘗試檢索實例的元數據,通過重定向到[http://me tadata.google.internal/computeme tadata/v1beta1/instance/service-accounts/default/token](http://me tadata.google.internal/computeme tadata/v1beta1/instance/service-accounts/default/token)來進行攻擊,最終我能夠得到他們的Compute Engine api訪問令牌!這對我來說是一個偉大的時刻,因爲這是我第一次發現高危的SSRF!

99.png

時間線

4月29日:由HackerOne團隊進行分類。

4月29日:Vimeo最初獎勵了100美元。

5月1日:漏洞已修復。

5月1日:再次發放4900美元的獎勵。

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場:https://nosec.org/home/detail/3468.html
來源:https://medium.com/@dPhoeniixx/vimeo-upload-function-ssrf-7466d8630437

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章