ROME是主要用于解析RSS和Atom种子的一个Java框架
rome:rome:1.0
JDK 1.8.0_192
在ysoserial中,用到了com.sun.syndication.feed.impl.ObjectBean类。在反序列化过程中调用了它的toString方法
this._toStringBean可通过两个构造函数控制
ysoserial选取ToStringBean.toString方法来进行进一步的调用
方法最后调用了另一个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做简要分析
pName和pReadMethod两个变量都与pds有关