不求甚解之考古某企业数字化平台
字数 1368 2025-08-19 12:40:52

企业数字化平台反序列化漏洞分析与利用教学文档

漏洞概述

本文详细分析某企业数字化平台中存在的两种反序列化漏洞利用方式,包括传统的命令执行方式和针对特殊环境的代码执行方式。该漏洞存在于/servlet/~aert/com.ufida.zior.console.ActionHandlerServlet接口中,通过Java反序列化机制实现远程代码执行。

漏洞分析

基础反序列化漏洞

  1. 漏洞入口

    • 接口路径:/servlet/~aert/com.ufida.zior.console.ActionHandlerServlet
    • 处理流程:接收数据流 → GZIP解码 → readObject()反序列化
  2. 关键调用链

    • 反序列化后调用ActionExecutor.exec()方法
    • 该方法通过反射机制动态调用指定类的方法
  3. 参数控制

    • msg:类名(String类型)
    • methodName:方法名(String类型)
    • parameter:参数对象(Object类型)
    • currentLanguagelogModule:其他参数

反射调用机制

  1. 方法查找流程

    • 首先检查map_method静态Map中是否缓存了方法
    • 若未缓存,则动态查找方法:
      • 参数为数组类型:获取精确匹配的方法
      • 参数非数组类型:获取参数类型为Object.class的方法
  2. 方法缓存机制

    • 缓存键:类名+方法名+方法参数数量
    • 同名同参数数量的方法只能缓存一个
  3. 方法调用逻辑

    • 找到方法后,根据是否有参数分别调用:
      • 有参方法:method.invoke(obj, parameter)
      • 无参方法:method.invoke(obj)

传统利用方式

利用条件

  1. 目标类中存在单参数的可利用方法
  2. 方法名在目标类中唯一(或同名方法参数数量不同)

利用步骤

  1. 选择利用类

    • 使用freemarker.template.utility.Execute类的exec方法
    • 该方法接受单个String参数,执行系统命令
  2. 构造Payload

    oos.writeObject("freemarker.template.utility.Execute"); // msg
    oos.writeObject("exec"); // methodName
    oos.writeObject("calc.exe"); // parameter
    oos.writeObject(null); // currentLanguage
    oos.writeObject(null); // logModule
    
  3. 利用限制

    • 需要知道Web绝对路径才能写文件
    • 可能被杀毒软件或RASP拦截命令执行函数
    • 目标机器出网受限时难以利用

高级利用方式(代码执行)

适用场景

  1. 命令执行被拦截
  2. 目标机器不出网
  3. 需要更隐蔽的执行方式

利用步骤

  1. 选择利用类

    • 使用bsh.Interpretereval方法执行JavaScript代码
  2. 参数类型问题

    • eval方法有两个重载版本:
      • eval(String)
      • eval(Reader)
    • 需要确保调用的是String参数的版本
  3. 两阶段利用

    第一阶段:缓存String参数的方法

    oos.writeObject("bsh.Interpreter"); // msg
    oos.writeObject("eval"); // methodName
    oos.writeObject(new String[]{"代码"}); // 使用数组参数确保精确匹配
    

    第二阶段:实际执行

    oos.writeObject("bsh.Interpreter"); // msg
    oos.writeObject("eval"); // methodName
    oos.writeObject("代码内容"); // parameter
    
  4. 替代方案

    • 直接使用StringReader作为参数:
    oos.writeObject(new StringReader("代码内容"));
    

防御建议

  1. 开发者

    • 避免使用Java原生序列化机制
    • 对反序列化操作进行严格的白名单控制
    • 升级相关组件到安全版本
  2. 管理员

    • 部署RASP防护方案
    • 监控可疑的反序列化操作
    • 限制危险类的加载和使用

总结

本文详细分析了该企业数字化平台中的反序列化漏洞,从基础的命令执行到高级的代码执行利用方式,提供了完整的利用链分析和实际利用方法。针对不同环境提供了多种利用方案,同时也给出了相应的防御建议。

企业数字化平台反序列化漏洞分析与利用教学文档 漏洞概述 本文详细分析某企业数字化平台中存在的两种反序列化漏洞利用方式,包括传统的命令执行方式和针对特殊环境的代码执行方式。该漏洞存在于 /servlet/~aert/com.ufida.zior.console.ActionHandlerServlet 接口中,通过Java反序列化机制实现远程代码执行。 漏洞分析 基础反序列化漏洞 漏洞入口 : 接口路径: /servlet/~aert/com.ufida.zior.console.ActionHandlerServlet 处理流程:接收数据流 → GZIP解码 → readObject() 反序列化 关键调用链 : 反序列化后调用 ActionExecutor.exec() 方法 该方法通过反射机制动态调用指定类的方法 参数控制 : msg :类名(String类型) methodName :方法名(String类型) parameter :参数对象(Object类型) currentLanguage 和 logModule :其他参数 反射调用机制 方法查找流程 : 首先检查 map_method 静态Map中是否缓存了方法 若未缓存,则动态查找方法: 参数为数组类型:获取精确匹配的方法 参数非数组类型:获取参数类型为 Object.class 的方法 方法缓存机制 : 缓存键: 类名+方法名+方法参数数量 同名同参数数量的方法只能缓存一个 方法调用逻辑 : 找到方法后,根据是否有参数分别调用: 有参方法: method.invoke(obj, parameter) 无参方法: method.invoke(obj) 传统利用方式 利用条件 目标类中存在单参数的可利用方法 方法名在目标类中唯一(或同名方法参数数量不同) 利用步骤 选择利用类 : 使用 freemarker.template.utility.Execute 类的 exec 方法 该方法接受单个String参数,执行系统命令 构造Payload : 利用限制 : 需要知道Web绝对路径才能写文件 可能被杀毒软件或RASP拦截命令执行函数 目标机器出网受限时难以利用 高级利用方式(代码执行) 适用场景 命令执行被拦截 目标机器不出网 需要更隐蔽的执行方式 利用步骤 选择利用类 : 使用 bsh.Interpreter 的 eval 方法执行JavaScript代码 参数类型问题 : eval 方法有两个重载版本: eval(String) eval(Reader) 需要确保调用的是String参数的版本 两阶段利用 : 第一阶段 :缓存String参数的方法 第二阶段 :实际执行 替代方案 : 直接使用 StringReader 作为参数: 防御建议 开发者 : 避免使用Java原生序列化机制 对反序列化操作进行严格的白名单控制 升级相关组件到安全版本 管理员 : 部署RASP防护方案 监控可疑的反序列化操作 限制危险类的加载和使用 总结 本文详细分析了该企业数字化平台中的反序列化漏洞,从基础的命令执行到高级的代码执行利用方式,提供了完整的利用链分析和实际利用方法。针对不同环境提供了多种利用方案,同时也给出了相应的防御建议。