前言
ROME是一个用于RSS和Atom提要的Java框架。它是开源的,并遵循Apache 2.0许可证。
ROME包含一组用于各种类型的联合提要的解析器和生成器,以及将一种格式转换为另一种格式的转换器。解析器可以返回特定于要处理的格式的Java对象,也可以返回一个通用的规范化SyndFeed类,让您在处理数据时不必担心传入或传出提要类型。
经常用来XML与Java互转。
依赖
1 | <dependencies> |
ToStringBean
提供深入的toString方法对Java Bean进行操作。
1 | private String toString(String prefix) { |
BeanIntrospector.getPropertyDescriptors(_beanClass)
获取到 _beanClass
中的任意 getter 方法,在获取完任意 getter 方法后,做了一系列基本的判断 —— 确保 getter 方法不为空,确保能够调用类的 getter 方法,确保 getter 方法含参数。满足所有判断后执行Object value = pReadMethod.invoke(this._obj, NO_PARAMS);
也就实现了调用任意对象getter方法的能力。
因此如果有对象在反序列化过程中会调用任意对象的 toString 方法就可以调用其他任意对象的 getter 方法。通过getter可以调用TemplatesImpl#getOutputProperties()
接着加载恶意类。
ObjectBean
com.sun.syndication.feed.impl.ObjectBean#hashCode
方法调用了com.sun.syndication.feed.impl.EqualsBean#beanHashCode
方法
就可以触发ToStringBean类的ToStringBean方法。
调用链
1 | TemplatesImpl.getOutputProperties() |
POC
1 | import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl; |
后记
学过CB链再看这个链子感觉不是特别难理解,不过明白调用链后,还是没有自己独立写出POC,反思一下:
com.sun.syndication.feed.impl.ObjectBean
不需要将_equalsBean
值设置为EqualsBean
因为在ObjectBean
类内部已经有方法设置为传入的参数的方法了,就会自动调用hashCode
方法。- 创建一个
toStringBean
对象,传对象新建一个人畜无害的ConstantTransformer
对象,如果是其他对象也可以。 - beanclass一定为类名的小写