准备工作

首先要获取heapdump。从http://www.xx.com/heapdump获取调用栈相关信息,如果是 sping boot 2.x 的话路径就是:http://www.xx.com/actuator/heapdump

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled.png

然后下载 Eclipse Memory Analyzer 工具来分析 /heapdump 或 /actuator/heapdump 接口下载的 jvm heap 信息,查找密码明文或者其他敏感信息。

使用 Eclipse Memory Analyzer 是无法直接打开下载的 heapdump 文件的,需要改后缀为 .hprof

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%201.png

更改后缀之后就可以成功打开了

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%202.png

还有个注意事项是,内存如果解压出来,比如当前我解压出来 1.46G ,那么在 MemoryAnalyzer.ini 这个文件当中需要将内存设置为大于这个大小,我设置为 2G ,否则会报错。我的文件没那么大,所以就不需要修改了。

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%203.png

搜索敏感信息

点击 OQL 标签,在查询框中输入语句进行查询

1
select * from org.springframework.web.context.support.StandardServletEnvironment

然后点击红色感叹号执行查询。

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%204.png

也可以定位关键词进行查询

1
select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("user")) or (toString(x.key).contains("pass"))

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%205.png

拓展一下也可以直接搜accessKey

1
select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("accessKey"))

我这个里面没有。。。

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%206.png

借一张xray社区的图

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%207.png

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%208.png

wx,app等等。。。都可以搜

还有一种查看方式就是通过 Top Consumers

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%209.png

然后根据包的结构去查看自己感兴趣的东西,比如我此处的 druid

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%2010.png

比如此处就能看到一台sqlserver的连接信息(ip,账号,密码)。

spring%20boot%E4%B9%8Bheapdump%20d36d51fecf994d9193156304740f3cad/Untitled%2011.png

参考

记一次信息泄漏到RCE

Eclipse Memory Analyzer —— MAT查找内存泄漏工具

评论