0x00 產品簡介
Config-Server
和Config-Client
兩個角色。其中Config-Server可以配置多種源獲取配置,如從git,svn,native等。

其中第一個紅框,https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0
在下方測試代碼進行了一定的增改,其中findOne函數里面的payload為上一次CVE-2019-3799的測試代碼,對測試代碼進行了增改想必是為了這一次漏洞做變更,重點留意到這里使用的是native本地倉庫配置
根據上述分析,嘗試配置sping-cloud-config-server的倉庫為本地倉庫,在進行驗證

根據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