Heapdump,即堆转储文件,是一个Java进程在某个时间点上的内存快照。HeapDump记录了JVM中堆内存运行的情况,保存了Java对象、类以及线程栈以及本地变量等信息。

  • 路径:/actuator/heapdump
  • 工具:https://github.com/wyzxxz/heapdump_tool ```shell $ java -jar heapdump_tool.jar

    选择模式

    0,不加载文件,速度较快但精度较低,不能用某些条件 1,加载文件,需要花几分钟加载,可以查询heapdump中所有的数据

关键字查询

password secret

获取字符串中的URL/File/IP

geturl getfile getip

设置字符长度

len=10 # 获取长度为10的所有key或者value值

获取指定顺序

num=1-100 # 获取顺序1-100的字符

默认不输出查询结果非key-value格式的数据

all=true # 获取所有值

  1. <a name="ag0oS"></a>
  2. ## 利用方式
  3. 1、使用JDK自带工具`jvisualvm`打开该文件。(该工具在`<JDK_HOME>/bin`目录下,Windows为`jvisualvm.exe`)<br />2、打开文件后已经可以看到部分敏感信息泄露<br />3、点击“类”,搜索`Hashtable`<br />4、点击进入`Hashtable$Entry`,寻找敏感信息
  4. ```sql
  5. # 部分ODL查询语句
  6. # 模糊查询
  7. select * from java.lang.String s WHERE toString(s) LIKE ".*SESSION*."
  8. # 查询字符串是否在Key中,返回实例ID
  9. select s from java.util.Hashtable$Entry s where /jdbc/.test(s.key.toString())
  10. # 查询字符串是否在Key中,返回Key全部内容
  11. select s.key.toString() from java.util.Hashtable$Entry s where /jdbc/.test(s.key.toString())
  12. # 查询字符串是否在Key中,返回Value的内容
  13. select s.value.toString() from java.util.Hashtable$Entry s where /jdbc/.test(s.key.toString())
  14. # 查询字符串是否在Value中,返回Value全部内容
  15. select s.value.toString() from java.util.Hashtable$Entry s where /jdbc/.test(s.value.toString())

实战案例

  • 通过浏览器访问对应路径将heapdump文件进行下载

堆转储文件泄露 - 图1

堆转储文件泄露 - 图2

  • 其实通过JVisualVM加载heapdump文件时,已经可以看到部分敏感信息泄露

堆转储文件泄露 - 图3

  • 打开后进入ODL控制台,输入如下语句,点击执行进行查询 ```shell select s.value.toString() from java.util.Hashtable$Entry s where /password/.test(s.key.toString())

```

堆转储文件泄露 - 图4

  • 也可以点击”类”,搜索Hashtable,然后点击进入第一个java.util.Hashtable$Entry

堆转储文件泄露 - 图5

  • 通过对左侧实例进行观察,这里发现了JDBC明文密码以及路径

堆转储文件泄露 - 图6

堆转储文件泄露 - 图7