Java安全反射利用-1

admin 2022年1月11日10:21:52评论85 views字数 3113阅读10分22秒阅读模式

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 ClassNotFoundExceptionzake 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


getMethod 的作用是通过反射获取一个类的某个公有方法)
getMethod(指定方法名,参数类型)
Class.forName("java.lang.Runtime").getMethod("exec", String.class) //String.class指定参数是string型

创建对象:newInstance()


zake  names =  (zake)Class.forName("test.zake").newInstance();
反射创建对象使用newInstrance();
Runtime类对象不能通过newInstance()来获取(class.newInstance等于new class)

创建对象:getRuntime()

Runtime的类构造函数是一个private构造函数,不能用newlnstance(),
只能通过getRuntime返回对象。

执行Invoke()

invoke方法位于Method类下,其的作用是传入参数,执行方法,
exec函数是一个普通方法,需要传入类对象,即invoke(类对象,exec方法传入的参数)
1.非静态方法时:第一个参数是类对象
2.静态方法时:  第一个参数是类.第二个参数是要传递给静态方法的参数
invoke(Class.forName("java.lang.Rumtime").getMethod("getRuntime").invoke(Class.forName("java.lang.Runtime")),"calc.exe")

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类,然后执行

Runtime的类构造函数是一个private构造函数,不能用newlnstance()创建对象,需要在invoke的时候传入类.
Class.forName("java.lang.Rumtime").getMethod("getRuntime")
由于getRuntime是一个静态方法

Java安全反射利用-1

结尾
构建payload有很多种方式,下一篇介绍另外的类如何利用
创建了个java安全交流群

Java安全反射利用-1



 


 


本文始发于微信公众号(安全帮Live):Java安全反射利用-1

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月11日10:21:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java安全反射利用-1http://cn-sec.com/archives/475219.html

发表评论

匿名网友 填写信息