用友U8cloud ServiceDispatcherServlet 反序列化漏洞
type
status
date
slug
summary
tags
category
icon
password
漏洞描述
该漏洞存在于人力资源模块(hrpub)的文件上传函数中。由于该函数对上传路径和文件类型缺乏有效校验,导致存在任意文件上传漏洞。攻击者可绕过入口 ServiceDispatcherServlet 的 token 验证,通过构造请求反射调用 nc.itf.hr.tools.IFileTrans.uploadFile 方法,执行文件上传操作,实现任意文件写入,从而获取系统控制权。
更新补丁:
用友安全中心
代码分析
权限绕过
/ServiceDispatcherServlet ->对应类nc.bs.framework.comn.serv.CommonServletDispatcher其中
会调用

是通过反射调用这个
实例化类的对象

在上面的
web.xml可以看到参数service对应类是nc.bs.framework.comn.serv.ServiceDispatcher然后继续跟踪到
nc.bs.framework.comn.serv.ServiceDispatcher#execCall
这里需要注意的是fw.jar下的这个类
如下这个代码反序列化请求的客户端发来的数据
invInfo 中包含:
- 服务名->
invInfo.getServicename()
- 方法名->
invInfo.getMethodName()
- 参数类型 / 参数->
invInfo.getCallId()
- 认证 Token->
invInfo.getToken()
nc.bs.framework.server.token.TokenUtil#vertifyToken这里如果是可信服务 or 可信客户端IP就无需鉴权,可惜下面要用到的
nc.itf.hr.tools.IFileTrans不属于可信服务。可信IP虽然通过XFF获取,可以伪造,但是默认的可信IP列表为空,也就无从下手了。所以只能继续分析nc.bs.framework.server.token.TokenUtil#vertifyTokenIllegal方法发现只要
curlToken也就是 genToken生成的 token和传入的 token相等就可以绕过token校验了
继续分析
其中
nc.bs.framework.server.token.TokenUtil#getTokenSeed方法返回的是this.tokenSeednc.bs.framework.server.token.TokenUtil#TokenUtil
可以看到
tokenSeedStr从 /ierp/bin/token/tokenSeed.conf文件读取 tokenseed
而这个
tokenseed是一个硬编码,所以我们可以用这个 seek进行合法的伪造 tokenRCE
根据历史漏洞:
这个
实现反序列调用任意类和方法
方法可以文件上传

经过调试只有当
module为 null的时候才能通过反射调用方法
漏洞分析



漏洞修复
replacement/modules/hrpub/META-INF/classes/nc/impl/hr/tools/trans/FileTransImpl.classwebapps/u8c_web路径被拉入黑名单可以尝试:
- 写bat覆盖start.bat或者stop.bat,等后续有好心人双击
- 写class覆盖,等重启
- 直接写一个同名war包,覆盖原有web项目(测试失败)
- 学习Y4的骚姿势,上传war包,META-INF/context.xml放以下内容,触发JNDI注入(暂时失败
参考
感谢le1a:
Loading...