用友 NC 6.5反序列化漏洞复现与分析
字数 1558 2025-08-20 18:17:47

用友 NC 6.5反序列化漏洞复现与分析教学文档

一、前言

用友NC 6.5存在反序列化漏洞,攻击者可通过构造恶意序列化数据实现远程代码执行。本文将从环境搭建、漏洞分析和漏洞复现三个部分进行详细讲解。

二、环境搭建

1. 安装准备

  • 下载用友NC 6.5安装包
  • 确保安装盘同级目录下有ufjdk文件或已设置JAVA_HOME环境变量

2. 安装步骤

  1. 执行NC安装包根目录下setup.bat文件
  2. 选择安装的产品模块(部分关键模块):
    • nc_uap:客户化
    • nc_portal:企业门户
    • nc_fi:财务会计
    • nc_hr:人力资源
    • nc_iufo:网络报表含合并报表

3. 数据库配置

创建Oracle用户:

SQL> create user NCV6.5 identified by 1 default tablespace nnc_data01 temporary tablespace temp;
SQL> grant dba,connect to NCV6.5;

4. 系统配置

  1. 服务器类型选择UAP SERVER

  2. 配置数据源:

    • 数据库类型选择ORACLE11G
    • 添加数据源名称(不能包含中文)
    • 配置数据库地址、用户名密码等信息
    • 测试连接确保连通性
  3. 部署EJB:

    • 进入"部署"→"全选"→"部署EJB"
  4. 文件服务器配置:

    • 添加服务器IP地址、端口、存储路径
    • 选择元数据仓库

5. 客户端准备

  • 安装专用浏览器UClient
  • 客户端通信代码位于nc_client_home\NCCACHE\CODE\external目录中的jar包

三、漏洞分析

1. 漏洞位置

漏洞存在于客户端与服务端的通信过程中,涉及反序列化操作。

2. 关键调用链

  1. 登录流程入口:nc.login.ui.LoginUISuppor.getLoginRequest()
  2. 获取NCLocator实例:nc.bs.framework.common.NCLocator.getInstance()
  3. 创建RmiNCLocator实例(当svcDispatchURL不为空时)
  4. 调用lookup方法:nc.bs.framework.rmi.RemoteContextStub.lookup()
  5. 最终通过代理调用RemoteInvocationHandler.invoke()

3. 漏洞触发点

关键代码在nc.bs.framework.rmi.RemoteInvocationHandler.sendRequest()方法中:

public Object sendRequest(Method method, Object[] args) throws Throwable {
    InvocationInfo ii = this.newInvocationInfo(method, args);
    // ...
    Object var8 = this.sendRequest(target, ii, method, args);
    return var8;
}

该方法将InvocationInfo对象序列化后发送到服务端,服务端会反序列化该对象,从而可能触发反序列化漏洞。

4. 通信机制

  • 客户端使用HTTP协议与服务端通信
  • 服务端地址格式:http://ip:port/ServiceDispatcherServlet
  • 通信数据使用Java序列化格式

四、漏洞复现

1. 准备工作

  • 搭建好用友NC 6.5环境
  • 准备恶意序列化payload
  • 网络可达目标服务器

2. 复现步骤

  1. 构造恶意序列化数据,包含可执行命令的payload
  2. 通过UClient发送恶意请求到ServiceDispatcherServlet
  3. 观察服务器响应和执行结果

3. 注意事项

  • 需要绕过可能的签名验证
  • 注意Java版本兼容性
  • 不同模块可能有不同的反序列化gadget链

五、修复建议

  1. 升级到最新版本
  2. 限制反序列化类白名单
  3. 对通信数据进行签名验证
  4. 使用安全管理器限制危险操作

六、参考资源

  1. 用友NC反序列化漏洞分析
  2. Java反序列化漏洞原理

七、常见问题

  1. Q:找不到安装包怎么办?
    A:可以尝试联系用友官方或通过其他合法渠道获取

  2. Q:环境搭建失败可能原因?
    A:检查JDK环境、数据库连接、防火墙设置等

  3. Q:漏洞复现不成功怎么办?
    A:检查payload构造是否正确、网络是否通畅、服务是否正常运行

本教学文档详细介绍了用友NC 6.5反序列化漏洞的环境搭建、分析和复现过程,重点突出了关键代码和配置点,可作为安全研究和漏洞修复的参考。

用友 NC 6.5反序列化漏洞复现与分析教学文档 一、前言 用友NC 6.5存在反序列化漏洞,攻击者可通过构造恶意序列化数据实现远程代码执行。本文将从环境搭建、漏洞分析和漏洞复现三个部分进行详细讲解。 二、环境搭建 1. 安装准备 下载用友NC 6.5安装包 确保安装盘同级目录下有ufjdk文件或已设置JAVA_ HOME环境变量 2. 安装步骤 执行NC安装包根目录下setup.bat文件 选择安装的产品模块(部分关键模块): nc_ uap:客户化 nc_ portal:企业门户 nc_ fi:财务会计 nc_ hr:人力资源 nc_ iufo:网络报表含合并报表 3. 数据库配置 创建Oracle用户: 4. 系统配置 服务器类型选择UAP SERVER 配置数据源: 数据库类型选择ORACLE11G 添加数据源名称(不能包含中文) 配置数据库地址、用户名密码等信息 测试连接确保连通性 部署EJB: 进入"部署"→"全选"→"部署EJB" 文件服务器配置: 添加服务器IP地址、端口、存储路径 选择元数据仓库 5. 客户端准备 安装专用浏览器UClient 客户端通信代码位于 nc_client_home\NCCACHE\CODE\external 目录中的jar包 三、漏洞分析 1. 漏洞位置 漏洞存在于客户端与服务端的通信过程中,涉及反序列化操作。 2. 关键调用链 登录流程入口: nc.login.ui.LoginUISuppor.getLoginRequest() 获取NCLocator实例: nc.bs.framework.common.NCLocator.getInstance() 创建RmiNCLocator实例(当svcDispatchURL不为空时) 调用lookup方法: nc.bs.framework.rmi.RemoteContextStub.lookup() 最终通过代理调用 RemoteInvocationHandler.invoke() 3. 漏洞触发点 关键代码在 nc.bs.framework.rmi.RemoteInvocationHandler.sendRequest() 方法中: 该方法将InvocationInfo对象序列化后发送到服务端,服务端会反序列化该对象,从而可能触发反序列化漏洞。 4. 通信机制 客户端使用HTTP协议与服务端通信 服务端地址格式: http://ip:port/ServiceDispatcherServlet 通信数据使用Java序列化格式 四、漏洞复现 1. 准备工作 搭建好用友NC 6.5环境 准备恶意序列化payload 网络可达目标服务器 2. 复现步骤 构造恶意序列化数据,包含可执行命令的payload 通过UClient发送恶意请求到ServiceDispatcherServlet 观察服务器响应和执行结果 3. 注意事项 需要绕过可能的签名验证 注意Java版本兼容性 不同模块可能有不同的反序列化gadget链 五、修复建议 升级到最新版本 限制反序列化类白名单 对通信数据进行签名验证 使用安全管理器限制危险操作 六、参考资源 用友NC反序列化漏洞分析 Java反序列化漏洞原理 七、常见问题 Q:找不到安装包怎么办? A:可以尝试联系用友官方或通过其他合法渠道获取 Q:环境搭建失败可能原因? A:检查JDK环境、数据库连接、防火墙设置等 Q:漏洞复现不成功怎么办? A:检查payload构造是否正确、网络是否通畅、服务是否正常运行 本教学文档详细介绍了用友NC 6.5反序列化漏洞的环境搭建、分析和复现过程,重点突出了关键代码和配置点,可作为安全研究和漏洞修复的参考。