public Object transform(Object input) {
try {
if (input instanceof Class == false) {
throw new FunctorException(
"InstantiateTransformer: Input object was not an instanceof Class, it was a "
+ (input == null ? "null object" : input.getClass().getName()));
}
Constructor con = ((Class) input).getConstructor(iParamTypes);
return con.newInstance(iArgs);
} catch (NoSuchMethodException ex) {
throw new FunctorException("InstantiateTransformer: The constructor must exist and be public ");
} catch (InstantiationException ex) {
throw new FunctorException("InstantiateTransformer: InstantiationException", ex);
} catch (IllegalAccessException ex) {
throw new FunctorException("InstantiateTransformer: Constructor must be public", ex);
} catch (InvocationTargetException ex) {
throw new FunctorException("InstantiateTransformer: Constructor threw an exception", ex);
}
}
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(TrAXFilter.class),
new InstantiateTransformer(new Class[] { Templates.class }, new Object[] { obj })
};
Commons Collections 3
前面提到了如何利用
TemplatesImpl
加载字节码,只不过那是手动调用newTransformer
来触发的,这里可以利用
cc1
的思路结合字节码的方式来实现调用,实际上就是指用InvokerTransformer
来调用newTransformer
这个方法结合poc:
利用的是
TransformedMap
链子手动触发put
,只需注意用InvokerTransformer
来调用TemplatesImpl
类的newTransformer
方法用之前说到的
Lazymap
的get
来手动触发也是可以的payload:
试着用构造反序列化来触发
LazyMap
的也可以com.sun.org.apache.xalan.interal.xsltc.trax.TrAXFilter
CC3
的目的就是为了绕过一些规则对InvokerTransformer
的限制,因为很多地方已经把InvokerTransformer
放入黑名单了,并没有用InvokerTransformer
来调用任意方法,而是用到了另一个类com.sun.org.apache.xalan.interal.xsltc.trax.TrAXFilter
看看这个类的构造函数:
当然,缺少了
InvokerTransformer
,TrAXFilter
的构造方法也是无法调用的。这里会用到一个新的Transformer
,就是org.apache.commons.collections.functors.InstantiateTransformer
。InstantiateTransformer
也是一个实现了Transformer
接口的类,他的作用就是调用构造方法。所以,我们实现的目标就是,利用
InstantiateTransformer
来调用到TrAXFilter
的构造方法,再利 用其构造方法里的templates.newTransformer()
调用到TemplatesImpl
里的字节码。先看一下
InstantiateTransformer
的transform
方法即会通过反射来调用构造函数,所以可以利用
InstantiateTransformer
来调用TrAXFilter
的构造方法,这样就会直接调用templates.newInstance()
,利用链如下:大概是这样的:
构造出完整的
poc
:输出看看:
最后
这个
POC
和CC1
一样有个通病,就是只支持jdk8u71
及之前的版本。