用友U8cloud-esnserver接口RCE

影响版本
1.0,2.0,2.1,2.3,2.5,2.6,2.65,2.7,3.0,3.1,3.2,3.5,3.6,3.6sp,5.0,5.0sp,5.1
poc
1 | import io |
漏洞原理
token加密密钥硬编码,加密流程固定,可绕过鉴权;EsnServlet的调用链中,存在任意方法调用。其实不是任意方法,而是能被nc.bs.framework.common.NCLocator找到的类。
漏洞分析
访问/service/esnserver后,会进入EsnServlet,最终都会进入doAction。不知道为什么要访问这个路由的,看我之前写的环境搭建那篇文章。
先会做一个json字符串的解析,然后把传入的内容存储到jsonObject中。
然后会根据传入的invocationInfo进行一系列赋值,这里面最重要的是ucode,其他无所谓。
接着进入token鉴权。tokenSeed就是上面传入的ucode,拼接后形成硬编码的密钥,然后调用com.nc.mobile.bo.DigestUtil#signatureByMD5计算token。所以我们完全可以伪造token来绕过鉴权。
之后跟进service.processBusi:
这里就是一个很典型的method.invoke任意方法调用。
这里可以调用nc.impl.hr.tools.trans.FileTransImpl#uploadFile,实现任意写文件。不过要注意,文件的生成是有要求的:
要和这里的解压过程相对应。
漏洞修复
限制反射调用的包名前缀: