java反射机制


一、反射式编程

指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。

java.lang.Class     //获取类对象
Class.forName(className)  //获取类对象
newInstance     //实例化类对象
getMethod  		//获取类方法
invoke			//执行方法

###1.在JVM中,类加载的过程

加载—–>验证—–>准备—–>解析—–>初始化

初始化:执行类构造器<clinit>()的过程

​ 自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句并产生。

getConstructor    //根据接收的构造函数列表类型参数获取对应的构造函数
Class c = Class.forName("java.lang.ProcessBuilder");
Constructor constructor = c.getConstructor(List.class);
Object o = constructor.newInstance(Array.asList("whoami"));
((ProcessBuilder)o).start();
-----------------------------------------------------------------------------
getDeclaredMethod    //获取当前类声明的所有方法,包括私有方法
setAccessible 		//设置作用域,可以用于字段、方法等

##二、Java序列化原理

readObject()     //反序列化函数
writeObject()	//序列化函数

1.Java反序列化漏洞原理

将带有恶意属性值的对象序列化值进行反序列化操作时,自动执行的函数调用链将恶意属性利用,最终造成恶意函数的执行。

class MyObject implements Serializable{
    public String name;
    //重写readObject()方法
    private void readObject(java.io.ObjectInputStream in) throws IOException,ClassNotFoundException{
        //执行默认的readObject()方法
        in.defaultReadObject();
        //执行打开计算器程序命令
        Runtime.getRuntime.exec("open /Application/Calculator.app/");
    }
}

文章作者: 0x00dream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0x00dream !
  目录