漏洞描述
Spring Cloud Config目录遍历漏洞的本质是允许应用程序通过spring-cloud-config-server模块获取任意配置文件。攻击者可以构建恶意URL以利用目录遍历漏洞。
漏洞危害
由于spring-cloud-config-server模块未对传入路径进行安全限制,攻击者可以利用多个…%252f进行目录遍历,查看服务器其他路径的敏感文件,造成敏感信息泄露。
漏洞影响版本
Spring Cloud Config 2.1.0 to 2.1.1
Spring Cloud Config 2.0.0 to 2.0.3
Spring Cloud Config 1.4.0 to 1.4.5
其他较早版本
漏洞分析
Spring Cloud Config Server是Spring为了分布式管理的一个组件,在Server端中负责存储配置,Client可以通过http的形式获取配置值。payload对应的路由存在于org.springframework.cloud.config.server.resource.ResourceController#retrieve()中,其代码
{name}/{profile}/{label}:name对应仓库名,profile对应配置文件,label为git分支名,一般上都有一个master分支。实际测试中name、profile值无所谓,但是label分支名必须存在。调试跟进getFilePath
这边已经把%25urldecode为%了,继续跟retrieve(),这边path传入的是我们的payload
继续跟下findOne,位于org.springframework.cloud.config.server.resource.GenericResourceRepository#findOne
locations目录file:/C:/Users/icu/AppData/Local/Temp/config-repo-6608031716294156148/是配置文件中git仓库被clone的临时位置,然后拼接…/造成跨目录文件读取。
漏洞复现
手动搭建
进入目录 spring-cloud-config-2.1.0.RELEASE,然后执行下面的命令启动 Spring Cloud Config 服务端:
cd spring-cloud-config-server
…/mvnw spring-boot:run
Docker搭建
docker-compose build
docker-compose up –d
注:执行docker-compose up –d命令后,需要等待5分钟以上才能访问,开启过程比较慢。
访问http://IP:8888/foo/label/master/test.json
抓包,正常访问
使用get方法传入/foo/label/master/…%252F…%252F…%252F…%252Fetc%252fpasswd
Poc验证:python3 poc.py –u http://IP:PORT
修复建议
升级Spring Cloud Config至安全版本,并依据Spring官方文档对应用加固:https://cloud.spring.io/spring-cloud-config/multi/multi__spring_cloud_config_server.html#_security