【web 安全】Spring boot heapdump 获取敏感信息
一、概述
微服务是目前较为热门的技术,Spring boot 是 Spring 的一套快速配置脚手架,可以基于 Spring boot 快速开发单个微服务,微服务的特点决定了功能模块分布式部署,在不同的机器上相互通过服务调用进行交互,业务流会经过多个微服务的处理和传递。
多个微服务下,微服务的监控显得尤为重要。Actuator 组件为 Spring Boot 提供对应用系统的监控和管理的集成功能,可以查看应用配置的详细信息,例如自动化配置信息、创建的 Spring beans 信息、系统环境变量的配置信以及 Web 请求的详细信息等。
如果Actuator
使用不当或者一些不经意的疏忽,可能造成信息泄露等严重的安全隐患。/heapdump
作为Actuator
组件最为危险的 Web 接口,如Actuator
配置不当,攻击者可无鉴权获取heapdump
堆转储文件,分析heapdump
堆转储文件进一步获取敏感信息。
Actuator
用来对应用系统进行自省和监控的功能模块,其提供的执行器端点分为两类:
1.原生端点
2.用户自定义扩展端点
原生端点主要有:
搭建漏洞复现环境:
二、Actuator 配置不当
【→所有资源关注我,私信回复“资料”获取←】1、网络安全学习路线 2、电子书籍(白帽子)3、安全大厂内部视频 4、100 份 src 文档 5、常见安全面试题 6、ctf 大赛经典题目解析 7、全套工具包 8、应急响应笔记
/heapdump
作为Actuator
组件最为危险的 Web 接口之一,如Actuator
配置不当,攻击者可无鉴权获取heapdump
堆转储文件,分析 heapdump 堆转储文件进一步获取敏感信息。 其中 /dump
可获取线程活动的快照, /heapdump
可获取堆转储文件。
堆转储文件,是 Java 进程在某个时间点上的内存快照。HeapDump
记录有 JVM 中堆内存运行的情况,含 Java 对象、类以及线程栈以及本地变量等信息。
通过访问/dump
路径,返回线程活动的快照,可看到 Springboot 线程活动中存在 RMI 监听。
访问/dump
路径,效果如下图所示:
通过访问/heapdump
路径,返回 hprof
堆转储文件压缩包。在JVisualVM
打开该堆转储文件.hprof
,将泄露站点内存信息,比如后台用户的账号密码。
访问/heapdump
路径,效果如下图所示:
三、识别版本
Springboot heapdump 端点存在版本差异
Spring boot 1.x 版本,默认端点为/heapdump
,下载的 heapdump 文件包含时间以及后缀 hprof。
Spring boot 2.x 版本,默认端点为/Actuator/heapdump
,需要将下载的 heapdump 文件加上.hprof 后缀。
四、工具选择
分析堆转储文件工具有几个选择
JVisualVM
:JDK 自带工具,供开发者用于监视,故障排除。
Eclipse MAT
:Eclipse 提供的一款 Heap Dump 分析工具,如使用 Eclipse-UI 内存崩溃,可使用 MAT 脚本解析大容量的 heap dump。
IBM Heap Analyzer
:IBM 公司一款分析 Heap Dump 信息的工具,有效的列举堆的内存使用状况,帮助分析 Java 内存泄漏的原因。
五、OQL 查询语言
因为堆转储文件里面含有大量信息,要准确找到我们想要的信息需要借助一些工具和一些查询技巧。
Springboot OQL 对象查询语言是一种结构化查询语言,将类当作表、对象当作记录行、成员变量当作表中的字段。通过 OQL 可以方便快捷的查询一些需要的信息,加快检出需要的属性值。
版本差异
Spring boot 1.x 版本 heapdump 查询结果存储在 java.util.Hashtable$Entry 实例键值对中:
Spring boot 2.x 版本 heapdump 查询结果存储在 java.util.LinkedHashMap$Entry 实例键值对中:
利用 password 关键字检索,对应的 oql 查询语句
Eclipse MAT
对应查询语句
Spring boot 1.x:select * from java.util.Hashtable$Entry s WHERE (toString(s.key).contains("password"))
Spring boot 2.x:select * from java.util.LinkedHashMap$Entry s WHERE (toString(s.key).contains("password"))
六、具体步骤
此次使用 JDK 自带JVisualVM
工具,对 Heap Dump 进行分析,该工具位于<JDK_HOME>/bin/
目录。
JDK 自带工具,如下图所示:
双击打开JVisualVM
工具。
其主界面,如下图所示:
通过JVisualVM
加载heapdump
文件,在概要栏目系统属性处,可看到部分敏感信息泄露。
部分敏感信息泄露,如下图所示:
切换至 OQL 控制台标签,在输入框输入如下语句,点击执行进行查询。
select s.value.toString() from java.util.Hashtable$Entry s where /password/.test(s.key.toString())
查询结果,如下图所示:
切换至类标签,在下方输入框限制检索条件java.util.Hashtable
,点击结果中第一项java.util.Hashtable$Entry
查询结果,如下图所示:
切换不同的实例进行观察,在第 411 项实例发现后台管理员密码明文。
管理员密码明文,效果如下图所示:
在第 409 项实例中进一步可看到 MySQL 数据库密码。
查看 MySQL 数据库密码,效果如下图所示:
在查找密码上,可结合网站 /env
或 /Actuator/env
接口,检索 关键词,使用被星号 遮掩对应的属性名作为 OQL 过滤条件。
查看遮挡属性值,效果如下图所示:
shiroKey
如目标网站使用 Shiro 安全框架,在过滤规则输⼊org.apache.shiro.web.mgt.CookieRememberMeManager
寻找 decryptionCipherKey
字段,可获取 key,进而rememberMe
反序列化利用。
七、防控措施
在代码白盒审计时,对Springboot
项目重点检测Actuator
依赖,对安全依赖及配置进行复查,建议作为漏洞检出规则加入代码扫描器。
在网络安全风险自查中,将/heapdump
等敏感路径加入扫描器字典。
在使用Actuator
时,不正确的使用或不经意的疏忽,都会造成严重的信息泄露等安全隐患。安全的做法是引入 security 依赖,打开安全限制并进行身份验证。同时设置单独的Actuator
管理端口并配置不对外网开放。
引入 security
依赖,打开安全限制,或禁用不需要接口,endpoints.env.enabled= false
评论