freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Java漏洞分析Spring Cloud Config 目录遍历漏洞(CVE-2020-5405)
Artio 2022-03-21 16:05:10 168437
所属地 北京

一:漏洞简介

Spring Cloud Config为分布式系统的外部配置提供客户端的服务端的支持。使用了它,开发人员就可以在一个中心仓库管理应用程序在所有环境中的外部配置。2020-02-26 Spring 收到漏洞报告, Spring Cloud Config Server 存在目录穿越漏洞。在配置仓库为本地native的情况下,攻击者可以获取config-server服务器上的任意带后缀文件。

二:利用条件

修改配置文件src/main/resources/configserver.yml

主要是设置profiles.active为native,设置search-locations为任意文件夹。

三:影响版本

2.2.x prior to 2.2.2

2.1.x prior to 2.1.7

四:漏洞复现

从github下载spring-cloud-config模块:https://github.com/spring-cloud/spring-cloud-config/archive/v2.1.5.RELEASE.zip

导入IDEA其中的spring-cloud-config-server模块,Maven+SpringBoot项目

修改配置文件src/main/resources/configserver.yml

主要是设置profiles.active为native

设置search-locations为任意文件夹

image

然后从ConfigServerApplication类启动,访问localhost:8888

然后在上方设置的search-locations路径下随便创建一个文件,写点东西,然后尝试读取这个文件

Payload:

http://127.0.0.1:8888/1/1/..()..()..()..()..()..()..()..()..(_)Code/key.txt

http://127.0.0.1:8888/1/1/..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29..%28_%29Code/key.txt

访问后成功读取:

image

五:漏洞分析

Config Server通过路径/{name}/{profile}/{label}/{path}对外提供配置文件,POC会通过路由到这个接口

然后我们先看下org\springframework\cloud\config\server\resource\ResourceController.java

image

传入的参数代表的意思如下:

name:仓库名称

profile:配置文件环境(dev,test,pro)

label:分支(1.0.0)

**:通配子目录

通过断点调试我们可以看到name、profile、label的值

image

没看到path的值,这里path的值是通过getFilePath方法解析之后得到的,跟进getFilePath

image

可以看到getFilePath方法中将path解析成了我们的文件名,然后通过format方法拼接了我们传入的参数,然后return path的值,继续往下

image

可以看到getFilePath方法的值会传入retrieve方法,跟进

image

可以看到retrieve方法中将name和label传入了resolveName和resolveLabel,我们跟进看看

image

resolveName方法的作用是将(_)替换成/ ,但是条件不满足,返回

image

resolveLabel方法也是将(_)替换成 / 并且条件满足,所以我们的数据被替换成了 ../../../../../../../../../Code

继续往下,程序执行到findOne方法,跟进看看

image

image

进入到findOne方法中,可以看到这个方法中this.service.getLocations应该是调用配置文件(也就是我们之前配置的那个),然后跟我们传入的参数重新拼接,得到两个路径:

image

image

后边的getProfilePaths方法是根据profile构造文件路径,最后得到我们传入的值。

在下边我们看到程序做了非法路径的判断,但是是针对path的,而我们的payload是在label中:

image

最后我们成功读取了文件

六:参考链接

https://4ra1n.love/post/hwsaMZANl

https://www.freebuf.com/news/232744.html

# web安全 # java漏洞 # 漏洞分析 # 网络安全技术 # JAVA安全
本文为 Artio 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Artio LV.4
这家伙太懒了,还未填写个人描述!
  • 14 文章数
  • 3 关注者
利用CDN进行攻击以及检测思路
2025-01-06
CSDN挂马事件及其检测思路
2025-01-02
浅谈DNS重绑定攻击
2023-05-19
文章目录