Spring Cloud Config Serve目录遍历漏洞复现分析(CVE-2020-5405)

2020-03-10 14:01:3612825人阅读

1.     环境搭建

我们需要准备IDEA ULTIMATE(COMMUNITY版本无法创建Java Web项目),直接拉取github上的项目主程序https://github.com/shadowsock5/spring-cloud-config-starter,随后点击Import-Project,选中spring-cloud-config-server目录。

1.png

点击打开后,选择Maven model。

2.png

随后一路Next后便成功的创建了项目,此时IDEA会自动为我们下载pom.xml中依赖,其中包含存在漏洞的spring-cloud-config-server 2.2.0版本。

3.png

所有依赖下载完成后,IDEA会自动识SpringConfigServerApplication。

2.    漏洞复现

运行前先打开src/main/resources/application.properities,将spring.cloud.config.server.native.searchLocations属性值修改为刚刚拉取的config-repo目录的绝对路径。

4.png

运行程序,访问本机ip以及8888端口:192.168.31.22:8888。

5.png

我们尝试读取/etc/pf.conf文件,由于程序使用了spring-boot-starter-security模块进行认证,因此需要添加基础认证头,构造的请求如下:

6.png

漏洞利用有以下注意点:1. 需要spring.profiles.active的值为本地文件系统native,且仓库为本地;2. 只能读取带后缀的文件

3.    漏洞分析

漏洞修复的commit在https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0。我们先定位到org/springframework/cloud/config/server/resource/ResourceController.java的retrieve方法进行调试。参数name、profile、label分别赋值为test1、test2以及路径跳转载荷。

7.png

继续跟进到retrieve,label参数被resolveLabel方法处理。

8.png

继续跟进到resolveLabel方法,label参数中的(_)会被替换为/。

9.png

继续跟进findOne方法,此时对profile、label、path等进行拼接处理,返回的file对象,file对象为”/../etc/pf.conf”的句柄。

10.png

返回retrieve方法继续跟进,text即为读取的文件内容,但后面跟着获取文件后缀的方法,若读取的文件无后缀,则StringUtils.getFilenameExtension返回null,而null对象调用toLowerCase则会抛出异常导致程序终止,这就印证了之前说的只能读取带后缀的文件。

11.png

4.    防御措施

及时将spring-cloud-config-server 升级到2.2.2及以上版本。

 

参考:

https://mp.weixin.qq.com/s/sBG-hSzmUde2SF7ZdsF5GQ

https://blog.csdn.net/caiqiiqi/article/details/104729207

 


声明:本文由百度安全原创,转载请注明出处和原文链接

0
现金券
0
兑换券
立即领取
领取成功