轉:Uber服務端響應中的API調用缺陷導致的賬戶劫持

Uber服務端響應中的API調用缺陷導致的賬戶劫持

clouds? FreeBuf? 今天

今天分享的writeup是香港白帽Ron Chan (@ngalongc)發現的一個關于Uber網站的漏洞,他通過分析Uber的微服務架構和其中的API調用機制,利用其中的服務端響應缺陷,能以SSRF和目錄遍歷(PAth Traversal)方式獲取到服務端為用戶分配的token信息,從而實現對用戶的賬戶劫持。雖然整個漏洞利用構造鏈亮點不多,但“Old but GOLD”,姜還是老的辣,漏洞還是老的好。

Uber微服務架構

微服務英文名稱Microservice,Microservice架構模式就是將整個Web應用組織為一系列小的Web服務。這些小的Web服務可以獨立地編譯及部署,并通過各自暴露的API接口相互通訊。它們彼此相互協作,作為一個整體為用戶提供功能,也可以獨立地進行修改和擴容。

Uber的Web應用服務體系是基于很多微服務架構部署的,由于微服務中會涉及到大量的REST模式,因此,在與各種Uber應用的交互過程中,Uber服務端難免會調用到一些REST API接口。就比如說,你要查看某位司機的狀態信息,Uber后端會涉及到類似如下的REST API接口調用:

https://localhost:1234/partner/PARTNER_UUID/trips?from=2018-01-01&to=2019-01-01

從請求響應中發現端倪

設計理論上來說,顯然,這種調用都是在Web應用后端(Backend)來執行實現的,因為在調用過程中,其內部的微服務架構沒有針對IDOR攻擊的安全檢查權限。所以,矛盾點來了,如果這類API調用都是以預定的path/variables/host方式進行的,而且,這些調用是用戶無法控制的,那么,Web應用后端(Backend)設置的身份驗證措施又有何用呢?

用戶確實不能控制這類API調用嗎?我覺得這里要打個問號。2018年初,我在Uber網站partners.uber.com下發現了一個有意思的路徑(Endpoint),它用來查詢讀取Uber司機的服務狀態,其前端請求鏈接如下:

https://partners.uber.com/p3/money/statements/view/current

該查詢鏈接涉及的請求看不出什么問題,但服務端對其的響應消息中卻存在一些有意思的參數,如下:

{

? "request": {

? ? "uri": {

? ? ? "protocol": "http:",

? ? ? "slashes": true,

? ? ? "auth": null,

? ? ? "host": "127.0.0.1:123",

? ? ? "port": "123",

? ? ? "hostname": "127.0.0.1",

? ? ? "hash": null,

? ? ? "search": "?earnings_structure_type=&locale=en&user_id=xxxxx",

? ? ? "query": "earnings_structure_type=&locale=en&user_id=xxxxx",

? ? ? "pathname": "/v1/partners/xxxxx/statements/current",

? ? ? "path": "/v1/partners/xxxxxx/statements/current?earnings_structure_type=&locale=en&user_id=xxxxx",

? ? ? "href": "http://127.0.0.1:123/v1/partners/xxxxx/statements/current?earnings_structure_type=&locale=en&user_id=xxxxxx"

? ? },

? "token":"ACCESS_TOKEN_OF_USER",

....

從上述響應消息可看出,涉及該查詢鏈接的后端API GET請求調用如下所示:

http://127.0.0.1:123/v1/partners/xxxx/statements/current?earnings_structure_type=&locale=en&user_id=xxxx

這是一個典型的后端REST API調用。

仔細觀察上述響應消息,可見其中的API調用對current的請求來自于原始前端請求鏈接:https://partners.uber.com/p3/money/statements/view/current,而且還會把current添加到 “pathname”參數的結尾,形成 “/v1/partners/xxxxx/statements/current“ 。另外,調用中還包含其它查詢相關參數,如涉及收入結構類型的earnings_structure_type,以及查詢區域locale=en等。

上述響應消息的有意思之處在于,第一,其中包含了應用用戶的訪問token鍵值對 - “token”:”ACCESS_TOKEN_OF_USER”,這里還曾出現過一個Uber第三方應用的token撤銷漏洞;第二,在查詢請求request中缺乏驗證調用者身份的 X-Auth-Token 頭,但是,在服務端響應消息中竟然還返回了用戶的訪問token!

構造漏洞利用

這樣來看,在請求中,如果我們能以某種方式,通過把我當前賬戶相關的用戶ID數值(user_id或my_user_uuid) 更改為其他用戶對應的用戶ID數值(victim_id或victim_uuid),就可能實現對請求調用的操縱。之后,服務端通過這個其他用戶的用戶ID數值,會響應回來與其對應的賬戶token,那么,有了這個token,我們就能實現對該用戶的賬號劫持了。

基于以上思路,需要找到一個具備以下條件的前端請求路徑(Endpoint):

能從其GET請求中傳遞任意相關參數;

能從其GET請求中傳遞經過編碼轉義的字符,防止一些不必要的字符解析和參數傳遞錯誤,如 %23 或 # 會截斷URL中的參數截斷;

服務端對GET請求能完整響應并可讀。

漏洞實現

最終,經過查找分析,我發現了滿足以上測試條件的一個前端請求路徑(Endpoint):

https://partners.uber.com/p3/money/statements/view/4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa

Uber服務端對這個請求路徑的響應包含了如下的API GET請求調用:

"href": "http://127.0.0.1:123/v1/statements/4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa?earnings_structure_type=&locale=en&statement_uuid=4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa&user_id=your_user_id"

我覺得其中的uuid - 4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa,是用來在API GET請求調用中傳遞給path和query參數的,所以,我對原始的前端請求路徑(Endpoint)做了如下修改:

https://partners.uber.com/p3/money/statements/view/4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa%2f..%2f4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa

“/” 經url編碼后為%2f,哪想到,上述查詢鏈接的請求發起后,服務端響應的消息竟然和修改之前是一樣的!那么,也就間接說明可用 “../”來對目錄路徑進行轉義編碼,還能用它來進行目錄遍歷。接下來,我們可以用 .. / 這種目錄遍歷方式,構造直達服務端根目錄的前端請求鏈接,然后,到達根目錄后,可以構造請求,獲得服務端包含用戶token和API調用的響應,另外,還可以用 # 來截斷一些不必要的請求字段。其實,這就是一種間接的服務端請求偽造(SSRF)結合目錄遍歷(PAth Traversal)的漏洞利用。

預想一下,我們希望在服務端響應中能返回的API GET請求調用如下:

http://127.0.0.1:123/v1/partners/victim_uuid/statements/current?earnings_structure_type=&locale=en&user_id=victim_uuid

這樣,我們可以對它進行控制修改的樣式就為:

http://127.0.0.1:123/v1/statements/INJECTION_HERE?earnings_structure_type=&locale=en&statement_uuid=INJECTION_HERE&user_id=your_user_id

因此,基于要在服務端響應中獲得以上預想的API GET請求調用,我構造了如下的前端請求鏈接:

https://partners.uber.com/p3/money/statements/view/15327ef1-2acc-e468-e17a-576a7d12312%2f..%2f..%2f..%2Fv1%2Fpartners%2FVICTIM_UUID%2Fstatements%2Fcurrent%3Fearnings_structure_type%3D%26locale%3Den%26user_id%3DVICTIM_UUID%23

最終,我們執行以上前端請求鏈接后,在服務端響應中,獲得了預想的如下API GET請求調用:

http://127.0.0.1:123/v1/statements/15327ef1-2acc-e468-e17a-576a7d12312/../../../v1/partners/VICTIM_UUID/statements/current?earnings_structure_type=&locale=en&user_id=VICTIM_UUID#……

因為服務端響應回來的消息包含了當前請求用戶的token,所以,我們只要在上述構造的前端請求鏈接中,修改VICTIM_UUID為其他用戶的的UUID,就能在服務端響應中獲得該用戶的token信息,從而間接實現了對該賬戶的賬號劫持了。

以上即為Ron Chan對于這個漏洞的分享,整個過程就 是SSRF + Path Tranversal = Account Takeover?;赨ber漏洞賞金政策和漏洞的嚴重性來看,該漏洞的獎勵賞金應該不會低于$4,000美金。

*參考來源:Ron Chan,clouds編譯,轉載請注明來自FreeBuf.COM

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容