一、什么是Actuator

Spring Boot Actuators 模块端点信息官方文档:

Spring Boot Actuator Web API Documentation

Spring Boot Actuator 模块提供了健康检查,审计,指标收集,HTTP 跟踪等,是帮助我们监控和管理Spring Boot 应用的模块。这个模块采集应用的内部信息,展现给外部模块,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信以及Web请求的详细信息等。

如果Actuator使用,可能造成信息泄露等严重的安全隐患(外部人员非授权访问Actuator端点)。其中heapdump作为Actuator组件最为危险的Web端点,heapdump因未授权访问被恶意人员获取后进行分析可进一步获取敏感信息。

注意:

SpringBoot 1.x 和 2.x 的 Actuator模块设置有差别,访问功能的路径也有差别,但现在多使用的SpringBoot版本为2.x,这篇文章只讲SpringBoo 2.x Actuator模块带来的信息泄露。

Actuator 其提供的端点分为两类:

1.原生端点

请求方法

端点

描述

GET

/actuator

查看有哪些 Actuator端点是开放的。

GET

/actuator/auditevent

auditevents端点提供有关应用程序审计事件的信息。

GET

/actuator/beans

beans端点提供有关应用程序 bean 的信息。

GET

/actuator/conditions

conditions端点提供有关配置和自动配置类条件评估的信息。

GET

/actuator/configprops

configprops端点提供有关应用程序@ConfigurationPropertiesbean的信息。

GET

/actuator/env 

查看全部环境属性,可以看到 SpringBoot 载入哪些 properties,以及 properties 的值(会自动用*替换 key、password、secret 等关键字的 properties 的值)。

GET

/actuator/flyway

flyway端点提供有关 Flyway 执行的数据库迁移的信息。

GET

/actuator/health 

端点提供有关应用程序运行状况的health详细信息。

GET

/actuator/heapdump

heapdump端点提供来自应用程序 JVM 的堆转储。(通过分析查看/env端点被*号替换到数据的具体值。)

GET

/actuator/httptrace

httptrace端点提供有关 HTTP 请求-响应交换的信息。(包括用户HTTP请求的Cookie数据,会造成Cookie泄露等)。

GET

/actuator/info

info端点提供有关应用程序的一般信息。

GET

/actuator/integrationgraph

integrationgraph端点公开了一个包含所有 Spring Integration 组件的图。

GET

/actuator/liquibase

liquibase端点提供有关 Liquibase 应用的数据库更改集的信息。

GET

/actuator/logfile

logfile端点提供对应用程序日志文件内容的访问。

GET

/actuator/loggers

loggers端点提供对应用程序记录器及其级别配置的访问。

GET

/actuator/mappings

mappings端点提供有关应用程序请求映射的信息。

GET

/actuator/metrics

metrics端点提供对应用程序指标的访问。

GET

/actuator/prometheus

端点以prometheusPrometheus 服务器抓取所需的格式提供 Spring Boot 应用程序的指标。

GET

/actuator/quartz

quartz端点提供有关由 Quartz 调度程序管理的作业和触发器的信息。

GET

/actuator/scheduledtasks

scheduledtasks端点提供有关应用程序计划任务的信息。

GET

/actuator/sessions

sessions端点提供有关由 Spring Session 管理的应用程序 HTTP 会话的信息。

GET

/actuator/startup

startup端点提供有关应用程序启动顺序的信息。

POST

/actuator/shutdown

shutdown端点用于关闭应用程序。

2.用户自定义扩展端点

二、漏洞利用

默认情况下所有Web端点都在/actuator目录下。

查看/actuator:

查看/actuator/env

env包含被脱敏的数据库用户名与密码与redis数据库密码等信息。

访问/actuator/heapdump下载堆转储文件:

一般比较大。

使用安装JDK自带的JVisualVM工具,对Heap Dump进行分析,JVisualVM位于/jdk/bin目录下

装入heapdump文件

涉及系统的一些配置信息:

env中信息存储在heapdump中的java.util.LinkedHashMap$Entry类中(Spring boot 2.X版本)。

根据/actuator/env页面展示的信息去heapdump文件中分析信息。(建议在/actuator/env检索“******”6个星号,去寻找password,key或者secret等信息)

比如:我要找到数据库的密码。

env中数据库登录用户名已经暴露,我们需要去找spring.datasource.password的值。

在OQL控制台执行OQL语句:这个语句是查出key值中包含password字符的数据。

select s from java.util.LinkedHashMap$Entry s where /password/.test(s.key.toString())

逐个查看查询出的结果:找到key值为spring.datasource.password的value就是数据库的登录密码。

下一步就是寻找在哪可以登录数据库了,看看外网有没有开放数据库的管理端口等,不展示了。

查redis数据库密码等信息同样步骤!

除了查找password再查一个其他信息。

这边在/actuator/env看到阿里云oss的信息。

使用OQL语句:

select s from java.util.LinkedHashMap$Entry s where /Secret/.test(s.key.toString())

查找key中包含Secret字符的:

这样就找到了oss的登录信息了。

使用OSS Browser尝试登录。(OSS Browser用法请自行搜索),这样就登录上阿里云OSS了,可以删除下载文件了(不要去做!)。

三、修复方法:

在 Spring Boot 2.x 中为了安全起见,Actuator 只开放了两个端点 /actuator/health 和 /actuator/info。可以在配置文件中设置打开或关闭。

1、Actuator 默认所有的监控点路径都在/actuator/*,当然如果有需要这个路径也支持定制,通过修改配置文件改变端点名避免被扫描发现。

2、关闭不需要使用的端点并引入security依赖,打开安全限制并进行身份验证。同时设置单独的Actuator管理端口并配置不对外网开放。

四、总结

1、Spring boot引起的信息泄露暴露的密码不只我展示的这么多,其他组件碰到后应该多去探索发现。

2、拿到密码后能做的也很多。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐