2020-03-10 14:01:3613802人阅读
我们需要准备IDEA ULTIMATE(COMMUNITY版本无法创建Java Web项目),直接拉取github上的项目主程序https://github.com/shadowsock5/spring-cloud-config-starter,随后点击Import-Project,选中spring-cloud-config-server目录。
点击打开后,选择Maven model。
随后一路Next后便成功的创建了项目,此时IDEA会自动为我们下载pom.xml中依赖,其中包含存在漏洞的spring-cloud-config-server 2.2.0版本。
所有依赖下载完成后,IDEA会自动识SpringConfigServerApplication。
运行前先打开src/main/resources/application.properities,将spring.cloud.config.server.native.searchLocations属性值修改为刚刚拉取的config-repo目录的绝对路径。
运行程序,访问本机ip以及8888端口:192.168.31.22:8888。
我们尝试读取/etc/pf.conf文件,由于程序使用了spring-boot-starter-security模块进行认证,因此需要添加基础认证头,构造的请求如下:
漏洞利用有以下注意点:1. 需要spring.profiles.active的值为本地文件系统native,且仓库为本地;2. 只能读取带后缀的文件
漏洞修复的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以及路径跳转载荷。
继续跟进到retrieve,label参数被resolveLabel方法处理。
继续跟进到resolveLabel方法,label参数中的(_)会被替换为/。
继续跟进findOne方法,此时对profile、label、path等进行拼接处理,返回的file对象,file对象为”/../etc/pf.conf”的句柄。
返回retrieve方法继续跟进,text即为读取的文件内容,但后面跟着获取文件后缀的方法,若读取的文件无后缀,则StringUtils.getFilenameExtension返回null,而null对象调用toLowerCase则会抛出异常导致程序终止,这就印证了之前说的只能读取带后缀的文件。
及时将spring-cloud-config-server 升级到2.2.2及以上版本。
参考:
https://mp.weixin.qq.com/s/sBG-hSzmUde2SF7ZdsF5GQ
https://blog.csdn.net/caiqiiqi/article/details/104729207
声明:本文由百度安全原创,转载请注明出处和原文链接