[CVE-2020-5405] spring-cloud-config-server 路径穿越漏洞复现

环境配置

源码:https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.1.1.RELEASE

Configserver.yml文件配置,配置为本地,此漏洞一大限制就是当配置为git时无法进行路径穿越

image-20200316105308980

漏洞分析

根据网上分析路由直接打桩

路由请求方式”http://url/{name}/{profile/{label/**}}"

image-20200316103859841

跟进retrieve方法中,造成路径穿越的原因之一就是resolveLabel函数

image-20200316104524616

可以看到对路径符号/替换为(_)

所以可以构造路径转好符号..(_) => ../

image-20200316104639790

可以构造路径穿越符号,现在关注点就是获取资源是否对路径或者资源进行限制.

确定资源需要跟进findOne方法.

image-20200316104931700

可以看到以下代码都是对locations变量进行操作,具体跟进下

跟进getLocations方法,

  1. 获得本地search-Locations路径

    image-20200316110814614

  2. 替换模版中变量为字符

    image-20200316110824017

  3. 拼接lable

    image-20200316110754084

  4. 最后得到Locations结果

image-20200316105744221

循环遍历locations数组,最后返回file对象.其中造成漏洞的参数为

file:///Users/osword/Desktop/config-repo../../../../../../../../../../../../../../../../../etc/

image-20200316111111940

跟进getReource方法

getResource方法中会调用parseUrl方法解析该字符为请求的Url,在经过一次cleanPath方法清洁返回file:/../../../../../../../../../../../../etc/,最后以此最为URl对象参数并返回

image-20200316112728162

最后调用createRelative指定相对路径参数,这里就是需要读取的文件名.

image-20200316112857209

漏洞复现

image-20200316113734912

漏洞限制

  1. 无法读取无后缀的文件
  2. 多传一级目录,parseUrl处理时会删除第一个/../
  3. 配置为native

漏洞修复

https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0

在获取返回URL对象时候就对路径穿越符号进行消毒.

image-20200316114406175

参考链接

http://www.lmxspace.com/2020/03/09/spring-cloud-config-server-%E8%B7%AF%E5%BE%84%E7%A9%BF%E8%B6%8A%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E3%80%90CVE-2020-5405%E3%80%91/

https://www.cnblogs.com/r00tuser/p/12458518.html

https://blog.riskivy.com/cve-2020-5405-spring-cloud-config-server-%e7%9b%ae%e5%bd%95%e7%a9%bf%e8%b6%8a/