【CVE-2020-5405】spring-cloud-config-server路徑穿越漏洞分析


0x00 產品簡介

Spring Cloud Config是Spirng Cloud下用於分布式配置管理的組件,分為Config-ServerConfig-Client兩個角色。其中Config-Server可以配置多種源獲取配置,如從git,svn,native等。
 
0x01 漏洞簡介
在配置倉庫為本地native的情況下,攻擊者可以獲取config-server服務器上的任意帶后綴文件
 
0x02 漏洞影響版本
2.2.x prior to 2.2.2
2.1.x prior to 2.1.7
 
0x03 漏洞等級
高危(官方評級)
 
0x04 漏洞分析
基礎環境搭建, https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.1.1.RELEASE,拉取zip包解壓,導入至idea
查看官方commit,分析漏洞位置

 

其中第一個紅框,https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0

刪除了resolveName和reolveLabel的代碼,代碼將(_)替換為/,很有可能是造成此次漏洞的原因

 

 

在下方測試代碼進行了一定的增改,其中findOne函數里面的payload為上一次CVE-2019-3799的測試代碼,對測試代碼進行了增改想必是為了這一次漏洞做變更,重點留意到這里使用的是native本地倉庫配置

 

根據上述分析,嘗試配置sping-cloud-config-server的倉庫為本地倉庫,在進行驗證

配置configserver.yml,修改file:///后路徑為本地倉庫路徑,其內容為https://github.com/spring-cloud-samples/config-repo/

 

 根據resolveLabel和resolveName的變動,嘗試下斷點至@RequestMapping("/{name}/{profile}/{label}/**")

 

 在跟蹤至GenericResourceRepository findOne函數時

 

 

對比github commit的變動,新增了一個對location的判斷

 

猜測this.service.getLocations中出現了問題,繼續跟進

 

 繼續跟進getLocations,程序跳至org.springframework.cloud.config.server.environment.NativeEnvironmentRepository getLocations方法

 

在addLableLocations屬性為true時將label與location直接進行拼接,判斷目錄是否存在,存在則添加到output數組中,最后傳進Locations對象中返回,很明顯這里就是問題所在

 

結合前面在retrieve方法中resolveLable將label中的(_)替換為/,基本可以摸清payload的構造

 

 

 

 關鍵點說清楚了,經后續調試,構造payload如下:

payload

 疑點1:按照測試的目錄,應該是跳兩層目錄至根目錄為什么這里用了三層跳?

看到FileUrlResource中先是用createRelcativeURL進行了處理

 

 

 繼續跟進,發現使用URL來處理的

 

跟進內部,發現是parseURL會去除第一個/../,所以實際跳目錄的時候要多傳入

 

 疑點2:為什么會獲取不到沒有后綴的文件?

看到retrieve函數中在獲取到文件內容后面的操作,“StringUtils.getFilenameExtension(resource.getFilename()).toLowerCase();”,嘗試獲取后綴,由於沒有后綴返回null,空對象做toLowerCase操作出現異常,而后又由於沒有做異常捕獲,導致程序直接退出

 

 后續官方在修補漏洞的時候也順帶把這個bug給修補了,https://github.com/spring-cloud/spring-cloud-config/commit/740153b5aa74d960116f28be9c755e3b7debd2a2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM