一、反射式编程
指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。
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/");
}
}