potatosafe
- 关注

前言
fastjson的对抗史就很好玩,本篇文章只是简单说一下漏洞原理,用一个简单的示例来调试走一遍漏洞,废话不多说,直接开始。
漏洞分析
搭建好环境后,我们直接跟进JSON.parse
我们最后会走到parse(String text, int features)下,首先会实例化一个DefaultJSONParser,我们跟进去查看一下。
可以看到我们实例了一个JSONScanner之后,之后判断我们的为{,将token设置为12。我们回到刚才的位置
此时我们进入parser.parse()查看。我们进入DefaultJSONParse#parse
首先做了一个switch,我们直接将token设置为12,我们跳到该位置进行查看
我们实例了一个JSONObject之后,进入parseObject,我们跟进去看一下。
接下来对我们传入的text进行了扫描,将key设置为我们传入的@type。
接下来开始通过我们设置的类名进行加载,并将token设置为16,我们继续向下看。
我们走到了关键的位置,我们去获取我们设置类的反序列化器,进入该方法。
查看该方法,我们可以发现我们无法在config中获取到我们的反序列器,之后我们走进了黑名单机制,通过黑名单后。进行一系列对类的判断,而我们的JdbcRowSetImpl类都不在范围内,所以创建了一个JavaBeanDeserializer,我们跟进该方法。
跟进createJavaBeanDeserializer,这里的asmEnable在fastjson在序列化和反序列化的时候,默认是开启ASM的,安卓默认关闭。接下来的代码就是获取注释、修饰符等等。我们继续往下看,可以看到我们走到了JavaBeanInfo.build这里。我们跟进该方法。
进入该方法,其实这里就是通过反射获取到jdbcRowSetImpl类中所有的信息,然后将所有符合条件的信息筛选出来并将放入fieldList.FieldInfo中,最后带着类的所有信息将这个JavaBeanInfo返回。这里我们的筛选条件为:
Set条件:
- 长度大于等于4
- 不能是static方法
- 返回类型必须是void类型
- 只能传一个参数
- 方法名前三位必须为set
Get条件:
- 长度大于等于4
- 不能是static方法
- 返回类型必须是继承Collection、Map、AtomicBoolean、AtomicInteger、AtomicLong
- 不能传入参数
接下来build方法按照我们说的进行循环,这里我们带着信息返回到javabeaninfo。将fieldList的信息都放入到sortedFields中。接下来回到ParseConfig
区别点:
我们回到ParseConfig,继续向下这时候就开始对我们返回的beaninfo开始进行一系列的判断,而这也最终导致了我们返回的反序列器的类型。下图的templateImpl链的执行,如果方法形参类型数量不为1则getonly为true,然后我们此时的asmEnable就会改变。这里我们就不具体细说了,继续向下。
回到刚才的位置,我们继续向下,走到了createJavaBeanDeserializer,我们跟进查看
这里将config和beaninfo全部传入,然后通过构造函数进行实例,将beanInfo.sortedFields中的fieldInfo创建成反序列化器并存入sortedFieldDeserializers中。
回到DefalultJSONParse类,接下来就是将创建好的deserializer返回到DefaultJSONParser,继续向下执行,我们跟进到deserializer#deserialze
跟进方法,前面的不是很关键,我们直接跟到读到关键位置。
这里我们首先将我们将sortedFieldDeserializers进行遍历,然后开始进行扫描匹配。
我们走了上面的扫描匹配,matchField依旧为false,我们继续向下匹配,首先将我们传入是参数取出,此时key为dataSourceName,接下来经过一系列判断后,最后走到如下图的位置。
我们进入如上图的方法,首先做一次匹配,匹配成功后返回。
接下来继续向下执行parseField,进入方法后获取对应的value值,执行setValue方法。
进入该方法,首先我们在fieldInfo中找到了datasource的方法对应关系,接下来对类进行了一系列的判断,最后执行到了Method.invoke方法
执行成功后返回true,继续进行循环,循环走到了autocommit后依旧按照上面的流程走到了method.invoke。
执行了setAutoCommit方法,再执行connect方法。
获得到我们刚才设置的datasourcename
执行到lookup方法,这里我们就很熟悉了,最后跟进看一看
成功触发漏洞
可爱小尾巴~~~
我只是个基础很差 技术很菜 脚本小子里面的小菜鸡,文章里面有什么写的不对的地方,望师傅们多加指正,我肯定狂奔加小跑的学。fastjson漏洞的还不止这些,本篇只是简单过一遍漏洞触发流程,像不出网情况、JDK高版本等问题、高版本漏洞利用都是知识点。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
