用友 NC 6.5反序列化漏洞复现与分析
字数 1558 2025-08-20 18:17:47
用友 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用户:
SQL> create user NCV6.5 identified by 1 default tablespace nnc_data01 temporary tablespace temp;
SQL> grant dba,connect to NCV6.5;
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()方法中:
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. 复现步骤
- 构造恶意序列化数据,包含可执行命令的payload
- 通过UClient发送恶意请求到ServiceDispatcherServlet
- 观察服务器响应和执行结果
3. 注意事项
- 需要绕过可能的签名验证
- 注意Java版本兼容性
- 不同模块可能有不同的反序列化gadget链
五、修复建议
- 升级到最新版本
- 限制反序列化类白名单
- 对通信数据进行签名验证
- 使用安全管理器限制危险操作
六、参考资源
七、常见问题
-
Q:找不到安装包怎么办?
A:可以尝试联系用友官方或通过其他合法渠道获取 -
Q:环境搭建失败可能原因?
A:检查JDK环境、数据库连接、防火墙设置等 -
Q:漏洞复现不成功怎么办?
A:检查payload构造是否正确、网络是否通畅、服务是否正常运行
本教学文档详细介绍了用友NC 6.5反序列化漏洞的环境搭建、分析和复现过程,重点突出了关键代码和配置点,可作为安全研究和漏洞修复的参考。