Java反射

正常类的加载过程:(以Student类为例)

1.当执行new Student()时,会触发JVM加载Student.class文件
2.JVM从本地磁盘找到Sudent.class文件并加载到JVM内存中
3.class文件加载后,JVM会自动创建一个class对象,一个类只能产生一个class对象

Java反射的本质:

在内存中得到class对象,反向获取Student对象的信息

Java反射的步骤:

  • 获取目标类型的Class对象
  • 通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象
  • 通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作

Java Instrumentation

Instrumentation是Java提供的一个来自JVM的接口,该接口提供了一系列查看和操作Java类定义的方法,例如修改类的字节码、向classLoader的classpath下加入jar文件等,使得开发者可以通过Java语言来操作和监控JVM内部的一些状态,进而实现Java程序的监控分析,甚至实现一些特殊功能(如AOP、热部署)

Java agent 通过Instrumentation API与JVM交互

在注入内存马的过程中,我们可以利用java Instrumentation机制,动态的修改已加载到内存中的类里的方法,进而注入恶意的代码

内存马类型

  • servlet-api类:filter型、servlet型、listener型
  • spring类:interceptor型、controller型
  • Java Instrumentation类:agent型

内存马简介

目标:访问url或指定url,带上命令执行参数,即可让服务器返回执行结果

实现:以java为例,客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,我们只要在这个请求的过程中做手脚,在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode,就可以达到我们的目的

内存码原理与实现:

实现:

servlet型:创建一个恶意的servlet,获取当前的standardcontext,将恶意servlet封装成wapper添加到StandardContext的child中,添加servletMapping将访问的URL和wapper进行绑定