环境搭建:
漏洞未使用数据库功能,直接运行 u8csetup.bat 安装
再运行 startup.bat 启动服务即可

漏洞分析:
查看漏洞补丁,修改了 GateWayUtil.class 和 ServletForGW.class 文件·,新增了 GWWhiteCtrlUtil.class 文件
https://security.yonyou.com/#/patchInfo?identifier=9695976d67dd4786badf91df6cb6578c
对比 GateWayUtil.class 文件,在 checkGateWayToken 增加了校验,原先只是简单的判断和 /resources/nccloud/nccloudgateway.properties 文件中的 nccloud.gateway.nctoken 值是否相等,该值是硬编码。
com.yonyou.nccloud.gateway.adapter.GateWayUtil

使用代码中的加密代码输出为:TJ6RT-3FVCB-DPYP8-XF7QM-96FV3

继续对比 ServletForGW.class 文件,增加了GWWhiteCtrlUtil.getInstance().checkAuthority(serviceClassName, argValues) 对传入的 serviceClassName 和 argValues 进行检查
com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW#callNCService
跟进该方法调用了 checkBlackITFAuthority 方法,将 com.ufida.zior.console.IActionInvokeService 和 nc.bs.pub.util.ProcessFileUtils 加入了黑名单
com.yonyou.nccloud.gateway.adapter.util.GWWhiteCtrlUtil#checkBlackITFAuthority
跟进 com.ufida.zior.console.IActionInvokeService 的具体实现类,没有校验直接通过反射进行功能调用。
com.ufida.zior.console.ActionInvokeService#exec
com.ufida.zior.console.ActionExecutor#exec
跟进 nc.bs.pub.util.ProcessFileUtils,可以看到 openFile 和deleteFile 方法都是传入文件路径后直接命令进行拼接。

继续查看 ServletForGW#doAction 方法,硬编码身份验证后将用户输入转化为 JsonObject 对象,然后调用 callNCService 方法
com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW#doAction
从 json 中取出一系列参数然后调用 MethodUtils.invokeMethod 方法,最终达到反射调用某个服务类方法的效果
com.yonyou.nccloud.gateway.adaptor.servlet.ServletForGW#callNCService
org.apache.commons.beanutils.MethodUtils#invokeMethod
结合上述的两个黑名单类即可实现命令执行的效果。
漏洞复现:

