Java反射简介
在Java中反射机制是指在运行状态中,对任意一个类都能够动态的知道这个类所有的属性和方法,并且能够调用任意一个对象里面的任意一个方法;这种动态获取信息以及动态调用对象方法的功能被称为Java语言的反射机制。
通俗描述:(反射就是指定类的路径返回对象,然后进行动态调用对象的方法和属性)
Java反射的几种方式
1. Class.forname
2. getClass()
3. ClassLoader()
4. UrlClassLoader()
5. 对象.class
Class.forName反射
在知道类的名的情况下,可直接使用Class.forname来获取对象.
Demo代码:
public class zake {
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private Long id;
private String name;
private int age;
public static String tesx="HAKER";
public zake() { //构造函数 new时自动调用
System.out.print("构造函数......");
}
public void tests() { //构造函数 new时自动调用
System.out.print("这里是Test");
}
public void shows( String xxx) { //构造函数 new时自动调用
System.out.print(xxx);
}
}
不使用反射:
public static void main(String[] args) throws ClassNotFoundException
zake zk=new zake();
zk.getAge();
zk.shows("没有用反射的shows方法");
}
使用反射:
public static void main(String[] args) throws IOException {
zake names = (zake)Class.forName("test.zake").newInstance(); //newInstance 创建对象
names.shows("使用用反射的shows方法"); //调用方法
names.setAge(7); //set设置变量值
System.out.println(names.getAge()); //Get获取变量值
}
zake names = (zake)Class.forName("test.zake").newInstance();
这和你 zake zk = new zake(); 是一样的效果。
试想如果在反射时候传入的类名的时候可控,那是不是可以调用任意类,然后运行系统命令了呢。
Class.forName反射执行命令
常见的三个执行命令的类
1.Runtime
2.ProcessBuilder
3.Process
Runtime利用
最终要做的是用反射调用Runtime.getRuntime().exec("calc.exe");执行系统命令
最终Payload
Class.forName("java.lang.Runtime").getMethod("exec",String.class).invoke(Class.forName("java.lang.Rumtime").getMethod("getRuntime").invoke(Class.forName("java.lang.Runtime")),"calc.exe")
获取类:forName
指定类的路径通过Class.forName("java.lang.Runtime")来获取Runtime类
获取类下的函数:getMethod
创建对象:getRuntime()
执行Invoke()
1.invoke(Class.forName("java.lang.Rumtime").getMethod("getRuntime") Runtime类的构造函数是private私有构造函数,不能用newInstance() 创建类对象。。。。。。。2.不能使用newInstance创建类对象,需要使用getRuntime返回一个类对象,。。。。。。。。。。3.getRuntime是一个静态方法,invoke(Class.forName("java.lang.Runtime")),"calc.exe") 。静态方法在调用invoke的时传入Runtime类,然后执行
本文始发于微信公众号(安全帮Live):Java安全反射利用-1
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论