rome

ROME是主要用于解析RSS和Atom种子的一个Java框架

环境

rome:rome:1.0

JDK 1.8.0_192

ObjectBean.toString

在ysoserial中,用到了com.sun.syndication.feed.impl.ObjectBean类。在反序列化过程中调用了它的toString方法

Untitled

this._toStringBean可通过两个构造函数控制

Untitled

Untitled

ysoserial选取ToStringBean.toString方法来进行进一步的调用

Untitled

方法最后调用了另一个toString方法,截取关键部分

try {
    PropertyDescriptor[] pds = BeanIntrospector.getPropertyDescriptors(this._beanClass);
    if (pds != null) {
        for (int i = 0; i < pds.length; i++) {
            String pName = pds[i].getName();
            Method pReadMethod = pds[i].getReadMethod();
            if (pReadMethod != null && pReadMethod.getDeclaringClass() != Object.class && (pReadMethod.getParameterTypes()).length == 0)
            {
                Object value = pReadMethod.invoke(this._obj, NO_PARAMS);
                printProperty(sb, prefix + "." + pName, value);
            }
                
        } 
}

其中存在Method.invoke可执行方法,分析其中的变量是否可控来执行任意方法。

BeanIntrospector.getPropertyDescriptors

这里我对BeanIntrospector.getPropertyDescriptors做简要分析

pName和pReadMethod两个变量都与pds有关

Untitled