zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Java代码审计——Commons Collections5 BadAttributeValueExpException

2023-04-18 14:21:03 时间

0x00 前言

反序列化总纲
cc链无非就是不同的调用拼接在一起形成的,比如cc5就是在cc1的基础上进行调用调整的。

0x01 BadAttributeValueExpException

在LazyMap的基础上,发现了一个新的调用方式,就是通过 TiedMapEntry+BadAttributeValueExpException的方式进行调用的。

在之前,我们知道LazyMap需要调用get方法才可以触发,那么我们的主题就是如果去触发LazyMap的get方法。

1.TiedMapEntry

首先来看这个类的构造方法。
可以看到存储了一个Map对象
在这里插入图片描述
然后找此类中调用map.get的地方
在这里插入图片描述
然后继续找getValue的地方,可以看到三个方法equals,hashcode,toString
在这里插入图片描述
那么也就是说只要找到一个类的readObject中可以触发这四个方法就可以续上我们的LazyMap。

2.BadAttributeValueExpException

来看这个类的readObject方法,可以看到toString的方法

在这里插入图片描述
要想执行到toString方法,那么val就不能为空,所以我们需要对val进行一个赋值。

poc:

Field valfield = val.getClass().getDeclaredField("val");
      Reflections.setAccessible(valfield);
valfield.set(val, entry);

当val有值了之后就会触发toString方法,就会走到TiedMapEntry,然后调用LazyMap的get方法,然后走迭代链或者其迭代链。

0x03 使用条件

  • 除最新版本无限制

0x04 要点笔记

  • 通过TiedMapEntry包裹LazyMap
  • 通过BadAttributeValueExpException调用toString方法

有空可以关注一下公众号鸭

在这里插入图片描述