电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 1210 人浏览分享

Ysoserial Click1利用链分析

[复制链接]
1210 0
click1 gadget构造思路是基于Commons-Collections2的Sink点(com.sun.org.apache.xalan.internal.xs
ltc.trax.TemplatesImpl和source点(java.util.PriorityQueue)。Commons-Collections2使用Transform
ingComparator方法作为PriorityQueue类中的comparator属性值。再Click1 gadget中,作者使用org.ap
ache.click.control.Column$ColumnComparator类作为替代。在Commons-Collections2分析中可知java
.util.PriorityQueue反序列化可以调用org.apache.click.control.Column$ColumnComparator#compare方法。

155617od6ps2jj267q0sws.png.thumb.jpg

其中compare方法传入的参数 即是构造好的恶意TemplatesImpl对象。

155646rnlgcwglmotvgemo.png

调用this.column.getProperty(row1)方法

155729lvctvmeolelotoqj.png.thumb.jpg

调用this.getName()方法获取Column#name属性值。并调用this.getProperty(name , row)方法。

99.jpg

由于传入的TemplatesImpl对象不是Map的子类 直接跳过if判断,在为methodCache属性初始化HashMap类型
对象后调用PropertyUtils.getValue(row, name, this.methodCache)方法。

29.png

首先将传入的name参数值赋给basePart变量。并在调用getObjectPropertyValue方法时 作为参数传入。

28.png

26.png

由于cache是初始化的HashMap对象,所以从catch中获取不到任何缓存方法 因此会调用source.getClas
s().getMethod(ClickUtils.toGetterName(name))方法。

22.png

此方法是为传入的property属性头部添加"get"三个字符 并返回 因此回到getObjectPropertyValue方法 调用meth
od.invoke(source)方法时,method参数值对应的是"get" + 传入的name变量。在上述的分析中name变量值是由
Column#name属性值决定的。因此控制Column#name属性值,可以调用任意类中以"get"为首的无参方法。

对于Column#name属性的控制也比较简单,通过调用Column构造方法即可。

21.png

根据Commons-Collections2中,最终触发RCE,还需要调用TemplatesImpl#newTransformer方法。而恰巧在
TemplatesImpl#getOutputProperties方法中会调用到newTransformer方法 从而触发自定义恶意类的初始化。

20.png

至此,利用链构造完成。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.