前言:
ROME 是一个可以兼容多种格式的 feeds 解析器,可以从一种格式转换成另一种格式,也可返回指定格式或 Java 对象。
正题:
这个链子是通过HashMap调用ObjectBean的hashCode()方法来完成RCE。
这里放一下链子会用到的一些必要代码,接下来进行相应的调试
public int hashCode() {
return this._equalsBean.beanHashCode();
}
当调用hashCode之后会调用beanHashCode(),之后调用到toString()
public int beanHashCode() {
return this._obj.toString().hashCode();
}
public String toString() {
Stack stack = (Stack)PREFIX_TL.get();
String[] tsInfo = (String[])(stack.isEmpty() ? null : stack.peek());
String prefix;
if (tsInfo == null) {
String className = this._obj.getClass().getName();
prefix = className.substring(className.lastIndexOf(".") + 1);
} else {
prefix = tsInfo[0];
tsInfo[1] = prefix;
}
return this.toString(prefix);
}
这里可以看到返回的prefix是TemplatesImpl
private String toString(String prefix) {
StringBuffer sb = new StringBuffer(128);
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);
this.printProperty(sb, prefix + "." + pName, value);
}
}
}
} catch (Exception var8) {
sb.append("\n\nEXCEPTION: Could not complete " + this._obj.getClass() + ".toString(): " + var8.getMessage() + "\n");
}
return sb.toString();
}
在调用完这里之后,我们就会调用TemplatesImpl的链子,这里可以注意到TemplatesImpl的getOutputProperties()是一个无参数的方法,所以刚好可以被调用
这里直接使用ysoserial-master-8eb5cbfbf6-1.jar生成windows下弹计算器的exp并进行base64编码