用户
搜索

该用户从未签到

安全团队

Rank: 7Rank: 7Rank: 7

29

主题

52

帖子

461

魔法币
收听
0
粉丝
0
注册时间
2020-7-7
发表于 2021-9-27 15:53:57 01088
本帖最后由 深信服千里目安全实验室 于 2021-9-27 15:59 编辑

click1 gadget构造思路是基于Commons-Collections2的Sink点(com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl)和source点(java.util.PriorityQueue)。Commons-Collections2使用TransformingComparator方法作为PriorityQueue类中的comparator属性值。再Click1 gadget中,作者使用org.apache.click.control.Column$ColumnComparator类作为替代。在Commons-Collections2分析中,可知java.util.PriorityQueue反序列化可以调用org.apache.click.control.Column$ColumnComparator#compare方法。
20210927155605.png
其中compare方法传入的参数,即是构造好的恶意TemplatesImpl对象。
图片2.png
调用this.column.getProperty(row1)方法
20210927155718.png
调用this.getName()方法获取Column#name属性值,并调用this.getProperty(name , row)方法。
20210927155740.png
由于传入的TemplatesImpl对象不是Map的子类,直接跳过if判断,在为methodCache属性初始化HashMap类型对象后,调用PropertyUtils.getValue(row, name, this.methodCache)方法。
20210927155803.png
首先将传入的name参数值赋给basePart变量。并在调用getObjectPropertyValue方法时,作为参数传入。
20210927155829.png
20210927155859.png
由于cache是初始化的HashMap对象,所以从catch中获取不到任何缓存方法,因此会调用source.getClass().getMethod(ClickUtils.toGetterName(name))方法。
20210927155921.png
此方法是为传入的property属性头部添加"get"三个字符,并返回,因此回到getObjectPropertyValue方法,调用method.invoke(source)方法时,method参数值对应的是"get" + 传入的name变量。在上述的分析中,name变量值是由Column#name属性值决定的。因此控制Column#name属性值,可以调用任意类中以"get"为首的无参方法。

对于Column#name属性的控制也比较简单,通过调用Column构造方法即可。
20210927155315.png
根据Commons-Collections2中,最终触发RCE,还需要调用TemplatesImpl#newTransformer方法。而恰巧在TemplatesImpl#getOutputProperties方法中会调用到newTransformer方法,从而触发自定义恶意类的初始化。
20210927155339.png
至此,利用链构造完成。
发新帖
您需要登录后才可以回帖 登录 | 立即注册