[CVE-2020-5405] spring-cloud-config-server 路径穿越漏洞复现
环境配置
源码:https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.1.1.RELEASE
Configserver.yml文件配置,配置为本地,此漏洞一大限制就是当配置为git时无法进行路径穿越
漏洞分析
根据网上分析路由直接打桩
路由请求方式”http://url/{name}/{profile/{label/**}}"
跟进retrieve
方法中,造成路径穿越的原因之一就是resolveLabel
函数
可以看到对路径符号/
替换为(_)
所以可以构造路径转好符号..(_) => ../
可以构造路径穿越符号,现在关注点就是获取资源是否对路径或者资源进行限制.
确定资源需要跟进findOne方法.
可以看到以下代码都是对locations变量进行操作,具体跟进下
跟进getLocations方法,
获得本地search-Locations路径
替换模版中变量为字符
拼接lable
最后得到Locations结果
循环遍历locations数组,最后返回file对象.其中造成漏洞的参数为
file:///Users/osword/Desktop/config-repo../../../../../../../../../../../../../../../../../etc/
跟进getReource方法
getResource方法中会调用parseUrl方法解析该字符为请求的Url,在经过一次cleanPath方法清洁返回file:/../../../../../../../../../../../../etc/
,最后以此最为URl对象参数并返回
最后调用createRelative指定相对路径参数,这里就是需要读取的文件名.
漏洞复现
漏洞限制
- 无法读取无后缀的文件
- 多传一级目录,parseUrl处理时会删除第一个
/../
- 配置为native
漏洞修复
https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0
在获取返回URL对象时候就对路径穿越符号进行消毒.
参考链接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!