Deserialización / reflexión de Java / generar código de bytes dinámicamente

referencia:

  • https://mp.weixin.qq.com/s/HskIJZtl4fPRyc2G36JFow

Se utiliza mucho conocimiento de reflexión en la vulnerabilidad de deserialización,

Un nuevo objeto ordinario:

// 先拿到Class对象
Class<?> aClass = Class.forName("org.chabug.entity.ReflectionClass");
// new这个Class对应的对象
Object o = aClass.newInstance();

Los métodos públicos ordinarios se pueden llamar directamente: aquí está el setNamemétodo de llamada y el parámetro "jack" se pasa en

Method setName = aClass.getDeclaredMethod("setName", String.class); 
setName.invoke(o, "jack" );

Si es un método privado, un paso más es setAccessiblemodificar el modificador del método:

Method evil = aClass.getDeclaredMethod("evil", String.class);
evil.setAccessible(true);
evil.invoke(o,"calc");

Prueba la función javaassist

Primero hay un archivo Cqq.java:

package ysoserial;

public class Cqq {
    
    
    public static void main(String[] args){
    
    
        System.out.println("test Cqq!");
    }
}

Inserte el bloque de código estático a través del siguiente código (ejecute antes del método principal):

    public static void testJavaAssist2() throws Exception {
    
    
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get(ysoserial.Cqq.class.getName());
        String cmd = "System.out.println(\"evil code\");";
        // 创建 static 代码块,并插入代码
        cc.makeClassInitializer().insertBefore(cmd);
        String randomClassName = "EvilCat" + System.nanoTime();
        // 设置为随机的类名、文件名
        cc.setName(randomClassName);
        // 写入.class 文件
        cc.writeFile();
    }

Después de escribir, se encontró que el EvilCat17158211564099.classarchivo fue generado y el siguiente código java fue descompilado en IDEA:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class EvilCat17158211564099 {
    
    
    public EvilCat17158211564099() {
    
    
    }

    public static void main(String[] args) {
    
    
        System.out.println("test Cqq!");
    }

    static {
    
    
        System.out.println("evil code");
    }
}

Puede encontrar que se ha insertado un bloque de código estático, y el nombre de la clase también debería ser.
Referencia:
https://b1ngz.github.io/java-deserialization-jdk7u21-gadget-note/

Supongo que te gusta

Origin blog.csdn.net/caiqiiqi/article/details/108470039
Recomendado
Clasificación