1. 程式人生 > 其它 >利用雅虎小型企業服務平臺的目錄遍歷漏洞檢視客戶的信用卡資訊

利用雅虎小型企業服務平臺的目錄遍歷漏洞檢視客戶的信用卡資訊

在這篇文章中,我將跟大家介紹如何利用雅虎小型企業服務平臺的目錄遍歷漏洞檢視客戶的信用卡資訊。在過去的一年半時間裡,我一直都在對雅虎平臺的安全性進行分析,而本文所要描述的內容也是我在這段時間裡所得到的成果之一。

挖洞過程

在前期的偵察過程中,我首先想要知道的就是伺服器端都執行著哪些東西。雖然這並不能直接讓我拿到漏洞獎金,但這些資訊可以幫助我識別公開的已知漏洞,或者在之後的漏洞利用過程中幫到我。

我們的測試目標是雅虎的小型企業服務平臺,經過一段時間的分析之後,我首先找到了一個包含錯誤配置的頁面,然後通過分析網路請求發現了其使用者控制面板執行的是NodeJS,並且還對外暴露了一個模板。需要注意的是,這個模板本來應該是在客戶端執行的,但這裡卻在伺服器端執行了。

既然我們已經知道了該網站的控制面板部分執行的是NodeJS,那麼我們就可以直接進行測試而不必繞彎路了。

在購買了訂閱服務之後,我發現了一個有意思的頁面。這個簡單的頁面負責給用顯示PDF格式的發票資訊,當用戶點選了“Download”下載按鈕之後,便可以檢視自己的賬單資訊了。

檢視PDF的節點如下:

https://www.luminate.com/my-services/invoices/INV08179455/pdf

一般來說,在面對這種節點地址時,我們首先會嘗試修改其中的“INV08179455”引數。如果這裡存在IDOR漏洞的話,那我們就可以檢視其他人的賬單資訊了。

那麼第一個問題就來了,這裡為什麼使用的是“PDF檔名/pdf”而不是“PDF檔名.pdf”呢?這很可能是因為網站在將PDF提供給使用者之前,需要驗證該賬單確實屬於發起請求的使用者。聽起來貌似是這樣的,但隨著我們不斷地深入分析,這一猜想也被推翻了。

由於我們已經知道了伺服器端運行了NodeJS,那我就可以嘗試呼叫一些特殊引數來進行測試了,例如:

NodeJS "/view/ID"(這跟 PHP的"/view.php?id=ID"是一樣的)

那麼接下來,我們就可以向伺服器傳送一些資料並嘗試讓系統做一些它本不該做的事情了。在研究了幾分鐘與SQL注入有關的控制字元之後,我對網站的原始碼也進行了分析,並以此來確保瀏覽器在請求PDF檔案時不會進行其他不必要的函式呼叫。分析之後我得到了以下結論:

https://www.luminate.com/my-services/invoices/.%2fINV08179455/pdf
https://www.luminate.com/my-services/invoices/INV08179455/pdf

這兩個HTTP請求返回的是相同的結果。雖然很多Web伺服器會直接將”.%2f”當作”./“來處理,並且最終返回相同的目錄以及引數,但NodeJS會將”.%2f”當作實際的發票ID目錄引數來處理。如果真是這樣的話,這就說明系統會使用發票ID目錄引數來獲取某些檔案內容以顯示PDF給使用者,而使用者可以提供”.%2”或者”..%2f”來指定需要提取的目錄。為了證實這一點,我們可以傳送下列請求:

https://www.luminate.com/my-services/invoices/..%2fINV08179455/pdf

果不其然,系統返回了“404-not found”,因為這是一個無效的PDF引數。為了進一步確認,我還需要找到PDF檔案真正所在的目錄,這也就意味著我需要進行“暴力破解”了。此處省略一萬字…最終我還是找到了我的PDF:

https://www.luminate.com/my-services/invoices/..%2finvoices%2fINV08179455/pdf

不知道你是否注意到了地址中“invoices”之前的目錄?接下來,我又傳送瞭如下請求:

https://www.luminate.com/my-services/invoices/..%2f..%2fmy-services%2finvoices%2fINV08179455/pdf

這個請求同樣返回了“404-not found”,這也意味著伺服器很可能在嘗試從一個名叫“invoices”的資料夾中獲取檔案。思考片刻之後,我認為伺服器很可能使用了某種字串識別資訊(例如賬號ID或電子郵箱)來給使用者建立專門的資料夾,之後再通過索引來從中獲取使用者的檔案。這樣的話,當用戶正常呼叫該節點時,則需要提供“accountID/invoices/ID”並禁止他人通過修改ID號來檢視他人的賬單PDF。下面給出的是一些失敗的請求嘗試:

https://www.luminate.com/my-services/invoices/..%2f..%[email protected]%2finvoices%2fINV08179455/pdfhttps://www.luminate.com/my-services/invoices/..%2f..%2faccountIDhash%2finvoices%2fINV08179455/pdfhttps://www.luminate.com/my-services/invoices/..%2f..%2fsamwcurry%40gmail%2ecom%2finvoices%2fINV08179455/pdf

因此,我打算換一個角度來進行嘗試。接下來,我又傳送瞭如下所示的請求嘗試:

https://www.luminate.com/order/confirmation/..%2forders%2forderIdhttps://www.luminate.com/my-services/more-info/json?uid=../subscriptions/subscriptionIDhttps://www.luminate.com/my-services/edit-payment-method?uid=../paymentmethods/paymentMethodID

這些請求可以幫助我找出相關目錄的根目錄,這樣我也許就可以獲取其他使用者的目錄檔案了。此時我突然回想起來,該網站的域名控制面板部分有一個功能允許我們更新域名資訊,你可以將域名修改成其他的東西,而此時伺服器將返回一段非常有意思的錯誤資訊:

{"error":"Id [email protected]#vjdoes not have permission to modify the domain example.com."}

為什麼上面的郵件地址結尾有一個“#vj”呢?說實話,我自己也不清楚…我只知道這裡有這樣一個字元。不過需要注意的是,這個節點是不可利用的。但是,當我們使用這個郵件地址(末尾跟加上“#vj”,URL編碼後為“%23vj”)來訪問我的個人檔案時,竟然成功了!

 https://www.luminate.com/my-services/invoices/..%2f..%[email protected]%23vj%2finvoices%2fINV08179455/pdf

仔細分析下來,大致的情況應該是這樣:

- [email protected]#vj  services    -serviceID (full folder [email protected]#vj/services/serviceID)  invoices    -invoiceID (full folder [email protected]#vj/invoices/invoideID)  paymentmethods-paymentMethodID (full folder [email protected]#vj/paymentmethods/paymentMethodID)

而後續測試也證明,我們可以使用這種方法來訪問其他使用者的檔案。在真實的攻擊場景中,攻擊者只需要知道目標使用者的郵箱地址,就可以檢視到他們的支付資訊了,其中包括使用者信用卡號的最後四位數、卡片到期日、以及賬單地址等等

總結

雅虎的小型企業服務平臺將使用者資料儲存在一系列目錄之中,而他們只是嘗試通過模糊資料夾名稱來保護這些資料的安全。對於攻擊者來說,只要他們知道目標使用者的郵箱地址,他們就能夠使用字典來暴力破解出可猜測的服務ID,並最終從伺服器所返回的請求中檢視到使用者的信用卡支付資訊。

漏洞時間軸

2017年10月21日:漏洞提交

2017年10月23日:漏洞歸類

2017年11月08日:漏洞修復

漏洞獎金未確認