赏金猎人捡漏:公网一个 /heapdump,数据库密码 Redis 密钥全裸奔
原创
升斗安全XiuXiu
升斗安全XiuXiu
升斗安全
2026年11月3日 18:38
广东
去阅读
【文章说明】
- 目的:本文内容仅为网络安全技术研究与教育目的而创作。
- 红线:严禁将本文知识用于任何未授权的非法活动。使用者必须遵守《网络安全法》等相关法律。
- 责任:任何对本文技术的滥用所引发的后果自负,与本公众号及作者无关。
- 免责:内容仅供参考,作者不对其准确性、完整性作任何担保。
阅读即代表您同意以上条款。
【内容概述】
一篇红蓝双视角的实战短文。本文从\"一个 40MB 堆转储里躺着数据库密码、Redis 密码、对象存储 AccessKey 和测试账号明文\"的真实场景切入,讲清 Spring Boot Actuator 暴露 /heapdump 后为何能裸奔凭据:堆转储不打码、jasypt 配置加密在启动时就已解密成明文、连接池长期持有密码清不掉。附 strings 粗筛和 MAT 精查的自查手法,以及按性价比排序的五条加固项。重事实、讲人话,红队看\"捡漏面\",蓝队看\"封堵面\"。
干这行久了,见过的\"没用任何漏洞就丢凭据\"的案例,比正经 RCE 还多。
前两天看到一个真实情况:一个 40MB 的堆转储文件,里面安安静静躺着数据库密码、Redis 密码、对象存储的 AccessKey,还有一个测试账号的明文。整个过程没用到半个漏洞利用技巧,完全靠有人把 Spring Boot 的 actuator 暴露在了公网。
堆转储不是日志,它是程序运行时的完整记忆。记忆里一定有密码,否则程序连不上数据库。这篇文章从红蓝两边讲清楚:hunters 怎么用它做授权范围内的自查捡漏,defenders 怎么把这道门焊死。
底线先撂这儿:下面这些只用于你拿到授权的自有资产自查和防护加固。拿去扫别人没授权的系统,那是另一回事,咱不干那活。
一、暴露长什么样
访问 /actuator,如果返回一段带 \_links 的 JSON,说明端点清单被公开了。里面高危的三个:env(配置项)、heapdump(堆转储)、threaddump(线程栈)。
env 更直接,但被限制得狠,Spring Boot 2.x 之后敏感字段默认打码成星号,你看到的 password 是 \\\\\\,挖不出东西。heapdump 相反,它不打码,只是把内存原样倒出来。threaddump 能看到线程栈里的参数,价值低一些。
所以 hunter 扫目标,看到 /actuator 能列端点,第一时间就奔 heapdump 去,这是整张暴露清单里最肥的那块肉。
二、堆转储到底是什么
一句话:JVM 在某一刻把所有存活对象序列化成一个文件。字符串常量、连接池配置、Spring 的 Environment、每一个被 new 出来的对象,全在里面。
内存里有什么,文件里就有什么。而内存里一定有密码——这是数据源连接池能工作的前提,不是谁的疏忽。你想,DataSource 不拿着明文密码,它怎么连数据库?所以\"内存里没密码\"这个假设本身就不成立,堆转储天然就是个凭据保险箱。
三、为什么你上了 jasypt 也救不了
很多团队觉得,配置加了 jasypt 这类加密就安全了。错,解密发生在启动时:密文进,明文出,明文被直接塞进 DataSource 的 password 字段。堆里躺的是明文,加密从那一刻起就失效了。
还有人把密码存成 char[]、用完就清空,理论上是防内存 dump 被翻。但这招对连接池无效——连接池会长期持有密码,根本清不掉。你清了一个临时变量,池子里的那份还在。
一句话点破:配置加密防的是\"配置文件被拿走\",不是\"内存被拿走\"。这两件事的风险模型完全不同。前者是静态文件泄露,后者是运行时内存泄露,你拿对付前者的手段去防后者,等于拿雨伞防火。
四、从里面能捞出什么(自查视角)
工具向的做法是用 MAT(Eclipse Memory Analyzer)打开,写 OQL 查所有 java.lang.String,正则过滤 password、secret、accessKey、jdbc,开源工具能一次性把数据源、Redis、邮箱、Shiro key 几类提出来。
自查时先用系统自带工具粗筛,成本最低:
strings heapdump.bin | grep -iE ”password|passwd|secret|accessKey|jdbc:” | sort -u | head -50strings heapdump.bin | grep -oE ”jdbc:[a-z]+://[^\\”' ]+” | sort -u
两个实操细节:strings 对 HPROF 有效但不精确,只能定性;真要定量得上 MAT 的 OQL。另外大堆要调 -Xmx,4GB 的转储打开能卡十分钟,别在笔记本上硬扛。
五、防守:五条按性价比排序
- 关端点。
management.endpoints.web.exposure.include=health,info,这一条能消灭绝大部分暴露。默认全开的时代早过去了,别懒。 - 改监听地址。
management.server.address=127.0.0.1,让管理端口不跟业务端口共享,外网根本摸不到。 - 加认证。
/actuator/**全部纳入 Spring Security,别指望\"URL 猜不到\"当防线。 - 网关兜底。 反向代理层 deny
/actuator,内部服务忘了配也不至于直接暴露到公网。 - 改凭据模型。 密码走 Vault 或 KMS 短期令牌,即使泄露也只是几个小时有效期。这条最贵,但只有它能把\"泄露即失守\"降级成\"泄露即过期\"。
再加一个动作:把 /actuator 加进外网资产季度扫描清单。这类暴露不是一次配置失误,是每次上线都可能重新带回来的默认值。
套路都是一线踩出来的。防御那章能直接打印当巡检项用。
底线再念一遍:只在明确授权范围内做这些自查。本文红蓝双视角,怎么捡漏、怎么封堵、怎么不被打。碰别人没授权的系统,咱不干那活,也劝你别干。
如果这篇把一个 /heapdump 从\"暴露\"到\"裸奔凭据\"再到\"焊死\"的全链路给你讲明白了
👍点个赞,让更多兄弟别把 actuator 裸奔在公网;
💬关注我,后面接着扒那些\"配置对了却还是漏\"的坑;
🔁顺手转发给还在拿 jasypt 当万能药的队友;
📣推荐给做防守的兄弟,这五条 checklist 贴工位上,比事后救火强。
守住边界,保持敏锐。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论