前几天碰到了这样的一个问题,就是在挖掘JAVA反序列化CVE-2019-10173的时候,compareTo()函数在碰到动态代理类的时候,会执行到Invoke方法,但是这个过程由于动态代理类不会生成,所以没有办法看到调用过程,所以就有了此文,记录一下这个过程。
看到许多文章都是说在动态代理测试中加入System.getProperties().put(“sun.misc.ProxyGenerator.saveGeneratedFiles”, “true”);这样的语句,但是在动态代理调试到compareTo()函数的时候就是JDK内部类了,没有办法修改代码,所以也就没办法生成class文件。
后面找到一个内置在JAVA JDK中的小工具:HSDB工具,这个工具主要用来查看主要用来查询在程序执行过程中对象的运行情况,还有很多其他的功能,这里就不说了
打开命令:java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
首先不运行程序的情况下执行jps命令,再开启调试执行jps命令,找到我们的进程的id
打开这个工具,输入id
保存文件,但是会发现这个文件是0kb,而且jd-gui无法打开,直接放到intellij idea里面反编译进行打开
可以看到里面实现了compareTo()方法,这个里面调用了父类的invoke方法,也就是会执行实现了InvocationHandler接口的类的Invoke方法
也就是会执行到EventHandler这个类里面的方法,这样就实现了理解动态代理类的调用CompareTo()函数的过程的理解