用友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
其中
会调用
notion image
是通过反射调用这个
实例化类的对象
notion image
在上面的web.xml可以看到参数service对应类是nc.bs.framework.comn.serv.ServiceDispatcher
然后继续跟踪到nc.bs.framework.comn.serv.ServiceDispatcher#execCall 这里需要注意的是fw.jar下的这个类 如下这个代码反序列化请求的客户端发来的数据
notion image
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校验了
notion image
继续分析
其中nc.bs.framework.server.token.TokenUtil#getTokenSeed方法返回的是this.tokenSeed
nc.bs.framework.server.token.TokenUtil#TokenUtil
notion image
可以看到 tokenSeedStr/ierp/bin/token/tokenSeed.conf文件读取 tokenseed
notion image
而这个 tokenseed是一个硬编码,所以我们可以用这个 seek进行合法的伪造 token

RCE

根据历史漏洞:
这个
实现反序列调用任意类和方法
方法可以文件上传
notion image
经过调试只有当 modulenull的时候才能通过反射调用方法
notion image

漏洞分析

notion image
notion image
notion image

漏洞修复

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

参考

感谢le1a:
Loading...

© thestar 2021-2025