内存对象搜索原理剖析
字数 1837 2025-08-26 22:11:51
Java内存对象搜索工具原理与使用详解
一、工具概述
java-object-searcher是一款Java内存对象搜索工具,能够快速定位内存中关键变量的具体位置。该工具不仅可以快速找到特定的中间回显方法,还能定位到用户自定义的任何关键词路径。
二、工具结构
工具分为三个主要包:
-
entity包:包含核心数据结构类
- Blacklist - 黑名单类
- Keyword - 关键词类
- NodeT - 节点跟踪类
-
searcher包:包含搜索器实现
- JavaObjectSearcher - 普通搜索器
- SearchRequestByBFS - 广度优先搜索器
- SearchRequestByDFS - 深度优先搜索器
-
utils包:包含实用工具类
三、核心类详解
1. Blacklist类
作用:定义需要过滤的对象黑名单,减少搜索范围,提高搜索效率。
主要属性:
field_name:需要过滤的类名field_value:需要过滤的值field_type:需要过滤的类型
典型黑名单对象:
- 基本数据类型包装类:
java.lang.Byte、java.lang.Short等 - 其他常见类:
java.io.File、java.lang.String等
2. Keyword类
作用:定义需要搜索的对象特征。
主要属性:
field_name:目标对象名称field_value:目标对象值field_type:目标对象类型
3. NodeT类
作用:记录搜索过程中的节点信息。
主要属性:
chain:利用链记录field_name:当前节点名称field_object:当前节点类对象current_depth:当前节点相对于入口的深度
四、搜索器实现
1. SearchRequestByBFS(广度优先搜索器)
特点:
- 使用队列实现
- 按层级逐步扩展搜索范围
- 适合寻找最短路径
核心流程:
- 初始化时传入目标对象和关键词列表
- 将初始节点加入队列
- 循环处理队列中的节点:
- 检查搜索深度限制
- 检查对象是否为null
- 检查是否为系统类型
- 检查是否在黑名单中
- 对象匹配:
- 使用
MatchUtil.matchObject方法 - 支持模糊匹配(contains方法)
- 使用
- 对象拆解:
- Map对象:处理所有values
- 数组对象:处理所有元素
- Class对象:处理所有属性和父类属性
2. SearchRequestByDFS(深度优先搜索器)
特点:
- 使用递归/即时匹配实现
- 沿一条路径深入到底
- 适合探索完整路径
核心流程:
- 检查搜索深度限制
- 筛选目标对象
- 根据对象类型处理:
- Map对象:递归处理所有values
- 数组对象:递归处理所有元素
- Class对象:递归处理所有属性和父类属性
五、使用方法
基本使用示例
// 设置搜索类型包含Request关键字的对象
List<Keyword> keys = new ArrayList<>();
keys.add(new Keyword.Builder().setField_type("Request").build());
// 定义黑名单
List<Blacklist> blacklists = new ArrayList<>();
blacklists.add(new Blacklist.Builder().setField_type("java.io.File").build());
// 新建广度优先搜索器
SearchRequstByBFS searcher = new SearchRequstByBFS(Thread.currentThread(), keys);
// 设置黑名单
searcher.setBlacklists(blacklists);
// 打开调试模式,生成log日志
searcher.setIs_debug(true);
// 设置挖掘深度
searcher.setMax_search_depth(20);
// 设置报告保存位置
searcher.setReport_save_path("D:\\apache-tomcat-7.0.94\\bin");
// 开始搜索
searcher.searchObject();
部署方式
-
源码打包:
- 从GitHub下载源码
- 使用Maven打包成jar
-
加载方式:
- 添加到目标项目的classpath中
- 或添加到JDK的ext目录下(随JDK一起加载)
六、匹配原理
-
匹配流程:
- 遍历keyword_list中的每个Keyword对象
- 检查field_name/field_value/field_type是否匹配
- 使用
isIn方法进行模糊匹配(转为小写后contains)
-
匹配成功处理:
- 调用
CommonUtil.write2log记录调用链 - 根据is_debug设置决定是否输出日志
- 调用
七、性能优化
-
黑名单机制:
- 排除不可能包含目标对象的类型
- 显著减少搜索对象数量
-
深度控制:
- 通过max_search_depth限制搜索范围
- 避免无限递归或过深搜索
-
去重机制:
- 使用visited属性避免重复匹配
八、实际应用
在Spring Boot 2.5.0环境中,使用该工具可以找到构造回显的调用链。通过分析搜索结果,可以定位到可用于漏洞利用的关键对象和方法。
九、总结
java-object-searcher工具通过:
- 灵活的黑名单和关键词设置
- 两种搜索算法选择(BFS/DFS)
- 完善的节点跟踪和日志记录
实现了高效的内存对象搜索功能,是Java安全研究和漏洞挖掘中的实用工具。
关键点:
- 合理设置黑名单可大幅提高搜索效率
- 根据需求选择BFS(最短路径)或DFS(完整路径)
- 调试模式和日志记录对分析非常有帮助
- 深度控制避免资源耗尽