freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

名侦探土豆:Fastjson反序列化漏洞-JdbcRowSetImpl链
potatosafe 2022-03-13 14:18:29 125483

前言

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就会改变。这里我们就不具体细说了,继续向下。

1647151688_622d8a48b46a473f27e1d.png!small

1647150774_622d86b6815b94b8b341d.png!small

1647151338_622d88eaa4cef86ea49f3.png!small

1647150862_622d870e0cb37112f0de4.png!small

1647150904_622d873832cee61ea58e0.png!small

回到刚才的位置,我们继续向下,走到了createJavaBeanDeserializer,我们跟进查看

1647148624_622d7e502615a3f5970bb.png!small

这里将config和beaninfo全部传入,然后通过构造函数进行实例,将beanInfo.sortedFields中的fieldInfo创建成反序列化器并存入sortedFieldDeserializers中。

1647148788_622d7ef48c9bf32651984.png!small

1647149066_622d800a129a5da12b2ef.png!small

回到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高版本等问题、高版本漏洞利用都是知识点。

# web安全 # 漏洞分析 # 代码审计 # Java代码审计 # JAVA安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 potatosafe 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
名侦探土豆
potatosafe LV.4
这家伙太懒了,还未填写个人描述!
  • 19 文章数
  • 86 关注者
擅长捉弄的内存马同学:Valve内存马
2022-11-02
名侦探土豆:Fastjson反序列化漏洞-TemplateImpt链
2022-03-13
擅长捉弄的内存马同学:Agent内存马(低卡)
2022-03-02
文章目录