用友U8Cloud 反射调用 → 文件上传漏洞
type
status
date
slug
summary
tags
category
icon
password
AI summary
漏洞分析
首先根据漏洞描述得知:
该漏洞存在于人力资源模块(hrpub)的文件上传函数中。由于该函数对上传路径和文件类型缺乏有效校验,导致存在任意文件上传漏洞。攻击者可绕过入口 ServiceDispatcherServlet 的 token 验证,通过构造请求反射调用 nc.itf.hr.tools.IFileTrans.uploadFile 方法,执行文件上传操作,实现任意文件写入,从而获取系统控制权。
/ServiceDispatcherServlet路径对应的nc.bs.framework.comn.serv.CommonServletDispatcher类。CommonServletDispatcher的doGet会调用serviceHandler.execCall()。serviceHandler从this.getInitParameter("service")获取,在web.xml中配置为nc.bs.framework.comn.serv.ServiceDispatcher下面是复现过程中的插曲….搞忘了这个是在web.xml中配置的了/(ㄒoㄒ)/~~
其中serviceHandler传入service来获取目标全类名。本来以为service可控,能传入2个选择:
- fw.jar的nc/bs/framework/comn/serv/ServiceDispatcher.class
ncdepend.jar的nc/bs/framework/comn/serv/ServiceDispatcher.class 但实际上这里的service只是一个字符串,得到的结果是固定的。由于CommonServletDispatcher是fw.jar中的,所以只能调用到fw.jar的nc/bs/framework/comn/serv/ServiceDispatcher.class
回到正题,继续跟进到
ServiceDispatcher#execCall()从请求中读取输入流,并通过反序列化操作将数据转换为 InvocationInfo 对象,该对象封装了目标服务的调用元信息(包括模块名、服务名、方法名、参数类型及参数值),随后通过反射机制动态调用对应的业务方法。
但这里需要先经过token鉴权。这里跟进
vertifyToken()继续分析:这里如果是可信服务 or 可信客户端IP就无需鉴权,可惜下面要用到的
nc.itf.hr.tools.IFileTrans不属于可信服务。可信IP虽然通过XFF获取,可以伪造,但是默认的可信IP列表为空,也就无从下手了。只能继续分析vertifyTokenIllegal()这里传入userCode的值,通过genToken生成token,与传入的token对比,相同即可绕过。继续分析
genToken()
非常明显,这里的token种子是硬编码,所以直接把代码迁移出来即可。
我们根据历史漏洞:https://github.com/rix4uni/nucleihub-templates/blob/3cca879652a20bc80af95e97e41ae158862be4f4/nucleihub-templates/yongyou-u8c-esnserver-fileupload.yaml
得知
nc.itf.hr.tools.IFileTrans#uploadFile()可以上传文件,接下来看看如何构造InvocationInfo对象跟进
this.invokeBeanMethod(invInfo.getModule(), invInfo.getServiceName(), invInfo.getMethodName(), invInfo.getParametertypes(), invInfo.getParameters());
这里需要moudle为空,才能反射调用方法。那么构造如下PoC即可:
漏洞复现



漏洞修复
在文件上传这里,把webapps/u8c_web拉到黑名单了,无论是../还是大小写都没能绕过...../(ㄒoㄒ)/~~
一些其他思路:
- 写bat覆盖start.bat或者stop.bat,等后续有好心人双击
- 写class覆盖,等重启
- 直接写一个同名war包,覆盖原有web项目(测试失败)
- 学习Y4的骚姿势,上传war包,META-INF/context.xml放以下内容,触发JNDI注入(暂时失败)
Loading...

