ROME
D^3CTF有考到一个ROME的利用链,正好借此机会跟一下这个链子,和缩小链子的方法思路。
ROME 是一个可以兼容多种格式的 feeds 解析器,可以从一种格式转换成另一种格式,也可返回指定格式或 Java 对象。
ObjectBean
com.sun.syndication.feed.impl.ObjectBean
是 Rome 提供的一个封装类型,初始化时提供了一个 Class 类型和一个 Object 对象实例进行封装。
ObjectBean 也是使用委托模式设计的类,其中有三个成员变量,分别是 EqualsBean/ToStringBean/CloneableBean 类,这三个类为 ObjectBean 提供了 equals
、toString
、clone
以及 hashCode
方法。
这里有个hashCode方法会去调用_obj
的 toString()
方法。
同样要调用tostring也可以使用BadAttributeValueExpException
ToStringBean
在这个类中存在动态方法的调用。
这里的 BeanIntrospector.getPropertyDescriptors()
获取 _beanClass
的全部 getter/setter 方法,然后调用所有的getter方法去打印出值。也就是说这个位置会触发 _obj
实例的全部 getter 方法,那么再联系TemplatesImpl 的利用链就可以达到rce。
1 | import com.example.demo.tools.Tools; |
EqualsBean
在这个类中有和tostringBean类似的代码,在beanEquals中
同样的通过反射去调用了getter方法,可以通过equals触发。
接下来找equals的调用就可以了,在Hashtable,HashMap,HashSet这些都可以有触发equals的地方。
这里说一下用HashMap的触发。
首先我们知道了hashmap在put时key的hashcode一致时会触发equals,而且在map中对象大于1时会调用父类的equals
这个位置可以很明显的看到触发了equals,那么这里有用到一个小trick,就是"yy".hashCode()=="zZ".hashCode()
也就是 Objects.hashCode("yy")==Objects.hashCode("zZ")
。类似的
这样的map1和map2的hashcode是一样的,所以可以正好满足条件,然后让value
为EqualsBean
对象,让 m.get(key)
是一个TemplateImpl
对象,最后通过反射设置有害的恶意类。
用javassist设置恶意类来缩小payload长度。
1 | import com.example.demo.tools.Tools; |
参考链接:
https://www.yuque.com/jinjinshigekeaigui/qskpi5/cz1um4#GVNRu