当前位置: 首页 > news >正文

Java安全-类的动态加载

类的加载过程

先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区(静态成员放在静态区,非静态成功放在非静态区),静态代码块在类加载时自动执行代码,非静态的不执行;先父类后子类,先静态后非静态;静态方法和非静态方法都是被动调用,即不调用就不执行。

在这里插入图片描述

public class LoadClassTest {
    public static void main(String[] args) {
        new Person();
		//静态代码块
		//构造代码块
		//无参Person
        new Person("a",22);
        //静态代码块
		//构造代码块
		//有参Person
        Person.staticAction();
        //静态代码块
        //静态方法
        Person.id=1;
        //静态代码块
        Class c=Person.class;
        //无结果
        动态加载
        Class.forName("Person");
        //静态代码块
        ClassLoader cl =ClassLoader.getSystemClassLoader();
        Class.forName("com.example.fastjson122.demos.web.Person",true,cl);//初始化
        //静态代码块
        ClassLoader cl =ClassLoader.getSystemClassLoader();
        Class.forName("com.example.fastjson122.demos.web.Person",false,cl);//不初始化
        //无结果
        c.newInstance();
        //静态代码块
		//构造代码块
		//无参Person
		Class<?>c=cl.loadClass("com.example.fastjson122.demos.web.Person");//不初始化的
        c.newInstance();
        //静态代码块
		//构造代码块
		//无参Person        
    }
}

类加载机制
1、类加载与反序列化
类加载的时候会执行代码
初始化:加载静态代码块
实例化:加载构造代码块、无参构造函数
2、动态类加载方法
Class.forname
初始化/不初始化
ClassLoader.loadClass不进行初始化
底层的原理,实现加载任意的类
ClassLoader(父类)->SecureClassLoader->URLClassLoader->AppClassLoader(继承关系)
(调用关系)loadClass->findClass(重写的方法)->defineClass(从字节码加载类)

public class LoadClassTest {
    public LoadClassTest() {
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {
        ClassLoader cl =ClassLoader.getSystemClassLoader();
        URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{new URL("file:///C:\\JAVA\\")});
        URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("http://localhost:8080/")});
        URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("jar:http://localhost:8080/Test2.jar/")});   
        URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{new URL("jar:file://D:\\tmp\\classes\\Test2.jar/")});
        Class<?> c = urlClassLoader.loadClass("Test2");
        c.newInstance();

        Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass",String.class,byte[].class,int.class,int.class);
        defineClassMethod.setAccessible(true);
        byte[] code= Files.readAllBytes(Paths.get("D:\\tmp\\classes\\Test2.class"));
        Class c=(Class) defineClassMethod.invoke(cl,"Test",code,0,code.length);
        c.newInstance();
    }
}

一下两个类是反序列化中常用的两个类都调用了defineClass
在这里插入图片描述
漏洞利用
URLClassLoader 任意类加载:file/http/jar
ClassLoder.defineClass字节码加载任意类 私有(好用,常用)
Unsafe.defineClass 字节码加载 public 类不能直接生成 Spring里可以直接生成

相关文章:

  • Agent系列——agent领域的mcp协议讲解
  • 如何开发一个你自己的springboot-starter
  • 自动化测试中使用的设计模式
  • 设计模式之单例模式(Singleton Pattern)
  • Kafka--常见问题
  • python-selenium 爬虫 由易到难
  • Linux实时内核 - 启用 RCU(Read-Copy Update)机制的性能测试功能
  • Excel中如何自动计算累计销量,当具体销量为空时公式自动不计算
  • 2025-03-22 学习记录--C/C++-PTA 习题4-11 兔子繁衍问题
  • 2025新版懒人精灵零基础安装调试+lua基础+UI设计交互+常用方法封装+项目实战+项目打包安装板块-视频教程(初学者必修课)
  • Linux中动静态库的创建与原理
  • Electron Forge【实战】桌面应用 —— AI聊天(上)
  • 遨游三防 | IP68热成像三防平板,助力电力智慧巡检
  • git推送代码相关学习——(一)
  • Flutter中常用命令
  • 区块链(Blockchain)—— 概念、架构与应用
  • 信奥赛CSP-J复赛集训(模拟算法专题)(27):P5016 [NOIP 2018 普及组] 龙虎斗
  • 基于AWS Endpoint Security(EPS)的混合云统一安全管理
  • java牛排烧烤技术
  • 标题word技巧 :匹配所有的 [数字],替换成上标
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • 三大猪企4月生猪销量同比均增长,销售均价同比小幅下降
  • 壹基金发布2024年度报告,公益项目惠及937万人次
  • 美联储如期按兵不动,强调“失业率和通胀上升的风险均已上升”(声明全文)
  • 金融监管总局:力争实现全国普惠型小微企业贷款增速不低于各项贷款增速
  • 印对巴军事打击后,巴外交部召见印度驻巴临时代办