CommonsCollection在java反序列化的源流中现已存在了4年多了,关于其间的剖析也是层出不穷,本文旨在整合剖析一下ysoserial中CommonsCollection反序列化缝隙的多种运用手法,从中讨论一下缝隙的思路,而且关于ysoserial的代码做一下遍及,提高咱们关于ysoserial的代码阅览才干。
ysoserial的要害编码技能介绍
首要咱们先去了解一下ysoserial的源码中的一些常用技能做一个简略的科普。
动态署理
动态署理比较常见的用途便是:在不修正类的源码的情况下,经过署理的办法为类的办法供给更多的功用。
举个比如来说(这个比如在开发中很常见):我的开发们完成了事务部分的一切代码,遽然我希望在这些事务代码中多增加日志记载功用的时分,一个一个类去增加代码就会十分费事,这个时分咱们就能经过动态署理的办法对等待增加日志的类进行署理。
看一个简略的demo:
Work接口需求完成work函数
public interface Work {
public String work();
}
Teacher类完成了Work接口
public class Teacher implements Work{
@Override
public String work() {
System.out.println("my work is teach students");
return "Teacher";
}
}
WorkHandler用来处理被署理目标,它有必要承继InvocationHandler接口,并完成invoke办法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class WorkHandler implements InvocationHandler{
//署理类中的实在目标
private Object obj;
//结构函数,给咱们的实在目标赋值
public WorkHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在实在的目标履行之前咱们能够增加自己的操作
System.out.println("before invoke。。。");
//java的反射功用,用来调用obj目标的method办法,传入参数为args
Object invoke = method.invoke(obj, args);
//在实在的目标履行之后咱们能够增加自己的操作
System.out.println("after invoke。。。");
return invoke;
}
}
在Test类中经过Proxy.newProxyInstance进行动态署理,这样当咱们调用署理目标proxy目标的work办法的时分,实际上调用的是WorkHandler的invoke办法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
//要署理的实在目标
Work people = new Teacher();
//署理目标的调用途理程序,咱们即将署理的实在目标传入署理目标的调用途理的结构函数中,终究署理目标的调用途理程序会调用实在目标的办法
InvocationHandler handler = new WorkHandler(people);
/**
* 经过Proxy类的newProxyInstance办法创立署理目标,咱们来看下办法中的参数
* 之一个参数:people.getClass().getClassLoader(),运用handler目标的classloader目标来加载咱们的署理目标
* 第二个参数:people.getClass().getInterfaces(),这儿为署理类供给的接口是实在目标完成的接口,这样署理目标就能像实在目标相同调用接口中的一切办法
* 第三个参数:handler,咱们将署理目标相关到上面的InvocationHandler目标上
*/
Work proxy = (Work)Proxy.newProxyInstance(handler.getClass().getClassLoader(), people.getClass().getInterfaces(), handler);
System.out.println(proxy.work());
}
}
看一下输出成果,咱们再没有改动Teacher类的前提下经过署理Work接口,完成了work函数调用的重写。
before invoke。。。
my work is teach students
after invoke。。。
Teacher
javassist动态编程
ysoserial中基本上一切的歹意object都是经过动态编程的办法生成的,经过这种办法咱们能够直接对现已存在的java文件字节码进行操作,也能够在内存中动态生成Java代码,动态编译履行,关于这样做的优点,作者在东西中也有说到:
could also do fun things like injecting a pure-java rev/bind-shell to bypass naive protections
关于javassist动态编程,我就只把要害的函数及其功用罗列一下了
//获取默许类池,只要在这个ClassPool里边现已加载的类,才干运用
ClassPool pool = ClassPool.getDefault();
//获取pool中的某个类
CtClass cc = pool.get("test.Teacher");[1][2][3][4][5][6][7][8][9][10][11][12][13][14]黑客接单网