CommonsCollections5

CommonsCollections5

摘要:CC5

0x01 链子

这条链子是利用了BadAttributeValueExpException这个类来触发TiedMapEntry和LazyMap的链子。

在PoC的注释里提示这条链子只能在jdk8u76版本并且在Security Manager关闭的时候使用。我本地没有安装这个版本,在oracle官网也没找到8u76版本,但奇怪的是:在我本地8u181版本也是可以弹计算器的,只不过不是在PoC上注明的链子那样弹。我就先拿本地版本先调着,把具体的点过一下就可。

1、首先是BadAttributeValueExpException.readObject()方法。

CC51

注意到这里的valObj会为TiedMapEntry对象

2、跟进到TiedMapEntry.toString()方法中。

CC52

3、跟进到getValue()。

CC53

注意到对自身的map属性调用get方法,如若按照PoC,这里的map被置为LazyMap,则成功触发LazyMap链。

至此,触发链分析完毕。

0x02 ysoserial源码分析

第一部分没什么特别的,为典型的Transformer对象数组调用Runtime。

CC54

而后是根据触发规则使用TiedMapEntry对LazyMap对HashMap进行包装。

CC55

再后是使用BadAttributeValueExpException对上面的TiedMapEntry进行包装。

CC56

0x03 一些未解决的疑问

  • 为什么需要特定的u76版本
  • 为什么需要“WITHOUT security manager”

第一个问题,我个人的理解是应该是版本>=8u76,因为readObject触发代码是在8u76时加入的,但我本地调不出来就很诡异了,总是在运行那条toString语句前弹出计算器(跟身边的师傅聊了下,可能是IDEA debug模式的bug,能执行说明>=8u76版本是没有问题的);

第二个问题看追踪的第一步里的源码就可以理解了(我傻*了)


评论