Java反序列化漏洞(序篇)

Java的Class类

什么是Class类

  • 全名为 java.lang.Class
  • 它用来描述一个运行中类的信息,比如这个类的属性,方法等等
  • 官方说法是 Java 使用 Class 对象实现 RTTI (运行时类型识别)
  • Java 程序的运行过程:test.java 编译生成 test.classtest.class 经过类加载器被载入 Java 虚拟机后,生成其对应的 Class 对象

如何获取Class类

  • classname.class 获取 classname 的 Class 对象,这个方法不属于反射
  • obj.getClass() 获取 obj 对应的类的 Class 对象
  • Class.forName(classname) 获取 classname 这个类

  • 上面代码对应的输出结果如下,可以看到,forName() 不会触发构造函数
class test
constructed function called...
class test

Class类有什么

  • Class 类是用来做什么的?用来描述一个运行中的类
  • 一个类里面有什么?属性,方法,构造器......
  • Class 类的方法就可以获取一个类的属性,方法,构造器,以及类加载器

Class获取属性

  • getField(String name) : 获得某个公有属性
  • getFields() : 获得所有公有属性
  • getDeclaredField(String name): 获得某个属性
  • getDeclaredFields(): 获得所有属性

  • 输出结果如下
public int test.a
[Ljava.lang.reflect.Field;@4b67cf4d
protected int test.b
private int test.c
[Ljava.lang.reflect.Field;@7ea987ac

Class获取方法

  • getMethod(String name, Class parameterTypes) : 获得该类某个公有方法
  • getMethods() : 获得该类所有公有方法
  • getDeclaredMethod(String name, Class parameterTypes) : 获得该类某个方法
  • getDeclaredMethods() : 获得该类所有方法

  • 输出结果如下
public java.lang.String test.good()
[Ljava.lang.reflect.Method;@4b67cf4d
protected java.lang.String test.hello(int)
private java.lang.String test.bye()
[Ljava.lang.reflect.Method;@7ea987ac

Class实例化类对象

  • newInstance(Object args) : 实例化一个类的对象

  • 运行结果如下
constructed function called...

Class执行函数

  • invoke(Object obj, Object args) : 传递 object 对象及被调用方法的参数

  • 输出结果如下
hello function called...

Class获取类加载器

  • getClassLoader()

  • 输出如下
sun.misc.Launcher$AppClassLoader@18b4aac2

Class.forName()

  • 这个函数有两种重载
  • Class<?> forName(String name)
  • Class<?> forName(String name, **boolean** initialize, ClassLoader loader)
  • Class.forName(className)
  • 等同于 Class.forName(className, true, currentLoader) ,p牛提到的
  • 那么这个 initialize 初始化的是什么?用如下代码做尝试

  • 结果如下,可以看到 Class.forName() 在初始化时,初始化的是 static 里的内容
2nd called...

反射

  • 即对象可以通过反射获取它的类,类可以通过反射拿到所有方法
  • 和反射相关的方法以上内容已经全部包含,下面就是如何利用

猜你喜欢

转载自www.cnblogs.com/peri0d/p/11909408.html