CISCN 2023 初赛 (高版本Commons Collections下其他依赖的利用)
传递一个bugstr参数,后端会对其进行反序列化,若出现异常进行下面处理
catch (Exception var8) {
Myexpect myexpect = new Myexpect();
myexpect.setTypeparam(new Class[]{String.class});
myexpect.setTypearg(new String[]{var8.toString()});
myexpect.setTargetclass(var8.getClass());
try {
result = myexpect.getAnyexcept().toString();
} catch (Exception var7) {
result = var7.toString();
}
}Myexpect类关键方法在getAnyexcept,调用了一个类的构造方法
public Object getAnyexcept() throws Exception {
Constructor con = this.targetclass.getConstructor(this.typeparam);
return con.newInstance(this.typearg);
}熟悉CC3链应该能马上反应过来,CC3中利用的类TrAXFilter的构造方法中调用了TransformerImpl#newTransformer,即TemplatesImpl链动态加载字节码
题目的环境是Commons Collections 3.2.2,该版本在一些危险的Transformer实现类的readObject前加上了FunctorUtils#checkUnsafeSerialization来检测反序列化是否安全。

若没有设置全局配置 org.apache.commons.collections.enableUnsafeSerialization=true,会抛出UnsupportedOperationException异常。
回到上面的处理流程,若直接打CC链,抛出异常被catch,执行Myexpect#getAnyexcept去实例化UnsupportedOperationException类,无法利用。而且这里又把异常类的构造器参数类型限制为String.class。一种思路是找到一个符合条件的可利用异常类,在反序列化过程中将其抛出。不好找遂放弃。
另一种思路是不走上面的异常处理(不进入catch),在反序列化的时候就去调用Myexpect#getAnyexcept。要调用一个类的getter方法,但题目又没有fastjson、rome之类的依赖。
结合放出的hint:cn.hutool.json.JSONObject#put -> com.app.Myexpect#getAnyexcept
不难想到,既然fastjson能调用getter,这个hutool工具类的JSONObject应该也可以
cn.hutool.core.bean.copier.BeanToMapCopier#copy负责将Bean的属性拷贝到Map中,通过反射调用Bean的getter方法。
调用链如下,最终执行TrAXFilter的构造方法,动态加载恶意字节码

cn.hutool.json.JSONObject是Map的子类,通过LazyMap去调用JSONObject#put,剩下的就是CC5的那段链子了。
badAttributeValueExpException#readObject ->
TiedMapEntry#toString ->
TiedMapEntry#getValue ->
LazyMap#get ->
JSONObject#put
需要注意的是LazyMap#get
由于后面调用的getter的目标是这里的value,即factory.transform(key)要返回Myexpect
因此factory设置为ConstantTransformer(这个Transformer类没有重写readObject,不会进行反序列化安全检测),初始化时传入Myexpect。
题目环境貌似不能出网,利用hutool的HttpUtil工具类起个Web服务来写马
完整EXP:
a.java

Last updated
Was this helpful?