文章目录
反射简介
反射是大多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可以调⽤,总之通过“反射”,我们可以将Java这种静态语⾔附加上动态特性。
动态特性:一段代码,改变其中的变量,将会导致这段代码产生功能性的变化。
获取Class的途径:
forName函数
正常情况下,如果想拿到一个类,需要先import引用这个类才能使用,而使用forName就不需要,这样对于攻击者来说十分有利,我们可以加载任意类。
forName函数第二个参数initialize=true表示类是否初始化。但是初始化的时候,构造函数是不会执行的
初始化方法和执行顺序
类名包含$符号
示例
main方法
package com.chaitin;
public class JavaTest {
public static void main(String[] args) throws ClassNotFoundException {
Class clazz = Class.forName("com.chaitin.TouchFile");//初始化时会调用static方法
}
}
run方法
package com.chaitin;
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
System.out.println("a");
String[] commands = {"calc.exe"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
class.newInstance()
getMethod()
invoke()
反射执行Runtime示例
Class clazz = Class.forName("java.lang.Runtime");//获取Runtime类
Method execMethod = clazz.getMethod("exec", String.class);//获取exec方法
Method getRuntimeMethod = clazz.getMethod("getRuntime");//获取getRuntime方法
Object runtime = getRuntimeMethod.invoke(clazz);//执行getRuntime方法来获取Runtime实例
execMethod.invoke(runtime, "calc.exe");//通过runtime示例执行命令