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 setName
mé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 setAccessible
modificar 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.class
archivo 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/