文章总结: 本文深入介绍了Javaheapdump文件的分析利用方法,除了常规工具外,还提供了多种自定义OQL查询技巧,包括查询依赖版本、session信息、HTTP数据包和SpringBoot路由信息,帮助渗透测试人员获取更多敏感信息如登录凭据和API接口,提升heapdump的利用价值。
综合评分: 91
文章分类: 渗透测试,WEB安全,漏洞分析,代码审计,应急响应
heapdump深度利用之信息泄露篇
原创
killer
漫漫安全路
2025年7月30日 14:01
江西
前言
在Java里有一些渗透场景可以获得堆内存也即是heapdump比如有的应用存在某个功能可以获取heapdump、springboot的/actuator/heapdump也可以获取。但是网上比较多的分析文章讲的都比较浅导致挺多人不知道heapdump里到底有什么东西,这篇文章讲一讲对heapdump进行深入分析获取某些特定信息。
常规信息获取
先讲一下大多数人的分析方式。最早的时候大家都是使用MAT、jhat、jvisualvm然后使用oql语句去查询字符串里的敏感信息。我当时刚接触的时候对这个的分析文章比较少我记得最早讲的比较清楚的文章是下面这篇。
https://zen-sec.github.io/fr/java-heapdump-extraction/
这个时期的oql语句主要集中在查询配置信息,以及内存中可能存在的user|pass|email|oss|aksk|jwt|shiro-key等信息后来有人写了自动化的分析工具
主要是下面两款
https://github.com/wyzxxz/heapdump_tool
https://github.com/whwlsfb/JDumpSpider
距离工具发布到现在已经有好几年的时间了,然后我发现很多朋友已经不会使用oql语句自定义查询信息了,都是使用这两款工具执行一下就结束。但是实际上有挺多信息是使用上面两款工具获取不到的,或者说某些情况下使用工具获取到的账号密码可能都很难对应起来。
深度信息获取
假设我们利用上述两款工具没有获取到什么有用信息还可以使用下面的方式进行利用,这里仅列举出一些案例有其他感兴趣的东西可以自己构造语句查询。使用MAT打开heapdump,现在MAT的主要版本需要使用jdk17+才能使用,如果JDK环境是1.8的话可以使用命令行vm参数指定一个jdk17路径打开MemoryAnalyzer.exe -vm "C:\Users\admin\.jdks\jbr-17.0.12\bin\javaw.exe"从这里打开你下载的
heapdump然后点击下面图标进行oql查询
查询依赖版本
我们首先可以查看这个应用有什么依赖以及他们具体是什么版本,直接从字符串中搜索DISTINCT用于去重(也可通过类加载器查询)。
SELECT DISTINCT toString(s) FROM java.lang.String s WHERE (toString(s) LIKE "file.*\.jar!/")
比如这里发现
fastjson依赖在漏洞范围内即可尝试fastjson漏洞。
查询session
这里以springboot默认容器为例tomcat默认的session储存在org.apache.catalina.session.StandardSession中所以可以写出如下oql语句
SELECT * FROM org.apache.catalina.session.StandardSession
我这里因为这个网站好像是被很多人扫描了导致产生了大量无效
session总计有1w+,所以需要想办法排除掉一些无效session这种无效session的产生大多数是扫描器直接访问一个路由然后返回包就会返回一个session这种的话比较好筛选。我们可以注意点每个session实例里都储存了以下信息根据上面的分析我们可以加一个判断
(s.lastAccessedTime - s.creationTime) > 6000也就是最后访问时间需要大于创建时间6秒钟我们即认为是有效session。但是这还不足以判断session是否被设置了访问权限。一般登陆成功后都会使用setAttribute往session里设置属性加上一些其他判断我们可以写出如下oql语句直接获取有效的sessionid
SELECT s.id.toString() FROM org.apache.catalina.session.StandardSession s WHERE ((s.isValid = true) and (s.attributes != null) and ((s.lastAccessedTime - s.creationTime) > 6000))
有的
session属性里甚至会直接存放账号密码
查询http数据包
上面我们查询到了session但是有很多时候并不是使用默认的session鉴权,所以可以获取http数据作为补充。我们知道springboot默认使用tomcat作为容器,经过代码分析可知可以通过org.apache.coyote.http11.Http11InputBuffer和org.apache.tomcat.util.net.SocketBufferHandler分别获取我们heapdump期间或之前尚未处理完的http数据包。
获取请求包
SELECT h.byteBuffer.hb.toString() FROM org.apache.coyote.http11.Http11InputBuffer h
先全选然后右键
COPY->Selection即可复制所有数据获取响应包,最开始以为会记录在
Http11OutputBuffer里面经过分析发现Http11OutputBuffer里只记录返回包header数据,完整数据记录需要使用下面的语句查询
SELECT rp.writeBuffer.hb.toString() FROM org.apache.tomcat.util.net.SocketBufferHandler rp
获取某些
http缓存数据段
SELECT DISTINCT bc.buff.toString() FROM org.apache.tomcat.util.buf.ByteChunk bc WHERE (bc.buff != null)
注意这里的数据不和请求包完全重叠,有可能记录一些更早的请求数据.比如这里直接获取了登陆的user、pass从请求包那里查询是没获取到的
查询springboot路由信息
根据之前分析springboot的经验可知路由信息储存在org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#mappingRegistry中我们使用oql语句查询它的实例
SELECT * FROM org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry
成功找到路由信息注意到他最后都储存在
java.util.LinkedHashMap$Entry所以我们可以直接使用下面语句获取所有路由
SELECT key.toString() FROM java.util.LinkedHashMap$Entry entry WHERE (key.toString() LIKE "/.*")
也可通过
MappingRegistration获取路由对应的方法
可以注意到这里已经获取路由对应的方法了且包含参数个数以及参数类型,还差获取参数名研究了一下发现有的情况是可以获取到参数名的。需要之前触发过这个路由,且缓存信息没被删除。
select * from org.springframework.web.method.support.HandlerMethodArgumentResolverComposite
总结
本文介绍了Java heapdump的深度分析方法。除了使用常规的自动化工具获取基础敏感信息外,还可以通过自定义OQL语句进行更深入的信息挖掘。这些方法能够在常规工具无法发现敏感信息时,提供更深层次的数据挖掘能力,帮助渗透测试人员获取更多有价值的信息,如登录凭据、API接口、会话数据等。掌握这些技巧可以大大提升heapdump文件的利用价值。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:漫漫安全路 killer《heapdump深度利用之信息泄露篇》