用友 U8Cloud NCCloudGatewayServlet 命令执行漏洞

环境搭建:

漏洞未使用数据库功能,直接运行 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

结合上述的两个黑名单类即可实现命令执行的效果。

漏洞复现: