首页 > 编程语言 >java安全—反射

java安全—反射

时间:2023-01-23 23:35:17浏览次数:42  
标签:反射 forName java String invoke 安全 方法 public

一、java安全 —— 反射

文章是本人java安全漫谈系列文章学习过程的记录,希望通过写博客督促自己学习,如有错误希望各位大佬指正。

1、反射机制浅析

java反射机制是很多java漏洞的基础,尤其在反序列化中,反射十分重要,首先来了解一下反射是什么?

反射在很多语言中都存在,反射使对象能获取他的类,类可以通过反射获取方法,而获取方法后可以进行调用,在java中,反射可以赋予语言动态特性。动态特性是指相对于编译时将已编写代码进行生成对象,获取属性以及调用方法等操作,在程序运行时,根据反射的相关性质动态生成对象,获取属性以及调用方法等。

首先让我们看看反射的基础用法

public void execute(String className, String methodName) throws Exception {
        Class clazz = Class.forName(className);
        clazz.getMethod(methodName).invoke(clazz.newInstance());
    }

这里涉及了反射过程中的一些重要方法:

  • forName:获取类
  • getMethod:获取类的方法
  • invoke:调用方法
  • newInstance:实例化对象

简单描述上述反射过程,forName通过className(类名)获取到一个特定类clazz,接下来Clazz中的getMethod方法通过methodName(方法名)获取需要执行的方法,最后通过newInstance方法对clazz进行实例化并通过invoke方法执行。

编写一个反射的方法类

public class invoke_exec {

    public void execute1(String className, String methodName) throws Exception {
        Class clazz = Class.forName(className);
        clazz.getMethod(methodName).invoke(clazz.newInstance());
    }
}

编写一个测试类

public class invokeTest {
    
    public void print() {
        System.out.println("反射成功");
    }
}

使用反射调用print方法

public class start {

    public static void main(String[] args) throws Exception {
        invoke_exec invokeTest = new invoke_exec();
        invokeTest.execute1("invokeTest", "print");
    }
}

2、forName方法分析

forName是获取class对象的一种方法,通过传入string类型参数,通过jvm查找和加载指定类,返回一个class对象的引用,此时对象没有被实例化。在反射中还需要通过其他方法实例化对象才能调用其中方法,如newInstance

forName有两种重载

Class<?> forName(String className)
Class<?> forName(String name, boolean initialize, ClassLoader loader)

分析源码发现forName方法都会返回forName0,而第一种重载中,initialize=trueloader是当前类的类加载器,在java中默认的ClassLoader通过类名加载类(类的完整路径)。

public static Class<?> forName(String className)
            throws ClassNotFoundException {
    Class<?> caller = Reflection.getCallerClass();
    return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}

这里提一下initialize初始化的问题,这里的初始化是指forName方法的静态初始化,并不会执行指定类的构造函数进行初始化,而是执行static代码块。这意味着恶意代码执行不需要通过invoke方法,仅仅通过forName方法对类进行静态初始化即可执行恶意代码。

这里可以编写恶意类,在static代码块中写入恶意代码

public class hack {

    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String commands = "calc.exe";
            Process p = rt.exec(commands);
            p.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
    public void print() {
        System.out.println("反射成功");
    }
}

用一个简单的方法进行验证

通过反射方法类获取hack类

public class start {

    public static void main(String[] args) throws Exception {
        invoke_exec invokeTest = new invoke_exec();
        invokeTest.execute1("hack", "print");
    }
}

接下来会继续更新

标签:反射,forName,java,String,invoke,安全,方法,public
From: https://www.cnblogs.com/p1a0m1a0/p/17065681.html

相关文章

  • JavaScript 解决冒泡事件导致的性能问题
    在JavaScript中,当有大量的子元素都需要绑定同一个事件时,冒泡事件可能会导致性能问题。这时可以使用以下方法来解决性能问题。使用事件委托:通过在父元素上绑定事件监听......
  • 高性能 Java 框架。Solon v1.12.3 发布(春节前兮的最后更)
    一个更现代感的Java"生态型"应用开发框架:更快、更小、更自由。不是Spring,没有Servlet,也无关JavaEE;新兴独立的轻量生态(已有150来个生态插件)。主框架仅0.1MB。相对......
  • JavaScript 事件委托
    事件委托是一种事件处理方式,它可以通过在父元素上绑定事件,然后利用事件冒泡的特性,让父元素处理子元素上的事件。这样做的好处是可以减少事件监听器的数量,提高性能。在Jav......
  • JavaScript学习笔记—高阶函数
    如果一个函数的参数或返回值是函数,则这个函数就成为高阶函数将函数作为参数,意味着可以对另一个函数动态的传递代码classPerson{constructor(name,age){thi......
  • JavaScript 事件冒泡和事件捕获
    事件冒泡指的是从触发元素开始,向父元素传播事件的过程。事件捕获则是相反,从父元素开始,向触发元素传播事件。在JavaScript中,当一个事件发生时,会先进行事件捕获,然后再进行......
  • (八)Java网络编程
    Java网络编程1、tcp和udp的区别TCP,TransmissionControlProtocol的缩写,即传输控制协议。1)面向连接,即必须在双方建立可靠连接之后,才会收发数据2)信息包头20个字节3)......
  • JAVA进阶--- Properties文件的使用
    properties文件介绍 后缀properties的文件是一种属性文件。这种文件以key=value格式存储内容。Java中可以使用Properties工具类来读取这个文件。项目中会将一些配置信息......
  • JavaScript
    JavaScript第三章--类型、值、变量3.10变量声明与赋值3.10.1let,const//let可以声明的同时赋值,也可以只声明,只声明的变量值为undefinedleti,num;letb=10;//co......
  • Java 枚举
    转:Java枚举知识点概念enum的全称为enumeration,是JDK1.5中引入的新特性。在Java中,被enum关键字修饰的类型就是枚举类型。形式如下:enumColor{RED,GREE......
  • Java socket程序打包为exe闪退
    提问:   我写了个Javasocket的程序,IDE运行没什么问题,但我把程序打包成exe,它就显示这个,然后就闪退了。有没有人知道是怎么回事。解答: 地址已经被绑定了,你先解绑一......