Fastjson反序列化漏洞

news/2024/10/1 7:43:10

image

Fastjson简介

Fastjson是一个Java库,可以实现json和对象之间的转换。

将数据与对象进行转化,这个操作涉及到了反序列化。

与原生的 Java 反序列化不同,FastJson 反序列化并未使用 readObject 方法,而是自定义了反序列化的过程。

通过在反序列化的过程中自动调用类属性的 setter 方法和 getter 方法

将JSON转化成对象

fastjson的格式

{"【对象名】":{
    "@type":"【类名】",
    "【成员变量名1】":【成员变量值1】,
    "【成员变量名2】":【成员变量值2】
    }
}

AutoType的作用:

fastjson提供了AutoType这种方式来指定需要还原的对象以及值 {"@type":"Java_deserialization.User","id":"66666"}其中@type对应的值就是类名,后面的内容就是成员变量名与值

同时还会在一定的条件下调用get和set方法,熟悉的配方熟悉的味道--反序列化漏洞

利用链

待补充

修复与绕过

出现漏洞之后autoTypeSupport属性默认为false,并且增加了checkAutoType()函数,通过黑白名单的方式来防御Fastjson反序列化漏洞

L; 绕过

版本< 1.2.41

com.sun.rowset.jdbcRowSetlmpl在1.2.25版本被加入了黑名单,fastjson有个判断条件判断类名是否以"L"开头、以";"结尾,是的话就提取出其中的类名在加载进来

那么在类名前后分别加上L和;就能绕过黑名单检测

[ 绕过

版本< 1.2.42

随后再次修复

会先去除一次L和;再进行黑名单判断,但是被双写绕过

之后修复了双写绕过,又遇见了和L&;类似的 [ 绕过,在类名前加上 [ 也可以绕过检测

通过严格匹配L;和[修复了漏洞

autoType开关绕过

版本1.2.48通过关闭缓存修复

在autoType关闭的前提下,先利用一个特殊类(java.lang.Class会在checkAutoType之前以常见类的身份加载进缓存)将payload加载进缓存,然后因为autoType关闭,fastjson优先去缓存寻找该类,并将该类反序列化出来(此反序列化存在漏洞)

在fastjson中有一个全局缓存,在类加载的时候,如果autotype没开启,会先尝试从缓存中获取类,如果缓存中有,则直接返回。黑客正是利用这里机制进行了攻击。

抛出异常绕过

版本v1.2.69修复,版本v1.2.68可以使用safeMode修复

在checkAutoType中,有这样一约定,那就是如果指定了expectClass ,那么也会通过校验

在fastjson中, 如果,@type 指定的类为 Throwable 的子类,那对应的反序列化处理类就会使用到 ThrowableDeserializer

而在此方法中,当有一个字段的key也是 @type时,就会把这个 value 当做类名,然后进行一次 checkAutoType 检测。且会指定expectClass,这样就绕过来检测。

且异常类中有get类型的方法,会在反序列化时直接调用达到rce

safeMode

彻底关掉相关功能,在黑白名单之前结束,在checkAutoType时抛出异常

写文件

在与黑白名单的博弈中,还衍生出了写文件的攻击形式(利用链不同)


工具&漏洞复现

环境搭建

使用vulhub搭建环境

使用插件检测

配置好相关的fastjson插件,发送json格式的POST包,burp就会自动检测

image

开启rmi服务

使用工具开启rmi服务

  • -C 参数指定恶意类执行的命令

  • -A 参数指定本机ip地址

image

发送payload

ps:如果是在本机复现,Host填写本地ip,不要写回环地址

先将数据包修改为POST请求,然后body加入带payload的json字符串

image

攻击成功

image


参考文章

从FastJson库的不同版本源码中对比学习绕过方法_fastjson如何关闭autotype-CSDN博客

fastjson-BCEL不出网打法原理分析-腾讯云开发者社区-腾讯云 (tencent.com)

干货|最全fastjson漏洞复现与绕过-腾讯云开发者社区-腾讯云 (tencent.com)

fastjson到底做错了什么?为什么会被频繁爆出漏洞? (baidu.com)

工具链接

welk1n/JNDI-Injection-Exploit: JNDI注入测试工具

https://github.com/pmiaowu/BurpShiroPassiveScan

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

mysql事务

1. 事务事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 2. 控制事务控制事务一查看/设置事务提交方式SELECT @@autocommit ;SET @@autocommit = 0 ;提交事务COMMIT…

2022年windows的Visual Studio常用插件及使用手册

前景提要Viusual Studio 是一款很好用的C/C++集成开发工具,具有强大的扩展功能,好用的插件,但是,很多人都是只写了有什么插件,但是,没写怎么使用这种插件,使得使用的时候很是不方便,所以,笔者最近本着自己的学习,在这里写下自己关于好用的插件的研究,希望对您的学习/工作有帮助…

JDK源码阅读-------自学笔记(二十六)(java.util.Map 自定义讲解)

一、简介Map就是用来存储“键(key)-值(value)”对的. 通过键寻找value,所以键不能重复. 数组的本质也是一种键值对,区别就是索引一般是数字,而Map的Key可以是任意对象(字符串,数字),相当于把数组的索引范围扩的更大,使用更方便. 实际开发中较为常用.二、Map的常用方法实例(1)存…

Oracle修改字段长度及属性

首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486117&idx=1&sn=02e2cd05e5db7eaa5758c70e81cf3972&chksm=ea375ed5dd40d7c367727562bdb00788f3bd139cbbda377f599586a47ce13ad9d04c56fd4d2d&token…

C#/.NET/.NET Core优秀项目和框架2024年4月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项…

localhost 重定向次数过多

在完成javaweb作业时出现了错误初始页面只有两个功能, 但是无论是点击登录还是注册,都会跳转到login.jsp页面从网上找到的答案是代码陷入死循环,因为总是跳转到login.jsp, 所以我查看了所有servlet类中跳转到login.jsp页面的代码,逻辑上并没有问题;然后我又查看了过滤器以…

Windows平台使用CMake+MinGW64编译OpenCV

Windows平台使用CMake+MinGW64编译OpenCV (注:2年前写的笔记, 可能有些地方过时了) 目录Windows平台使用CMake+MinGW64编译OpenCV1.安装及配置环境1.1 MinGW-w641.2 CMake1.3 OpenCV源码2.CMake配置及生成2.1 新建目录2.2 CMake-GUI2.3 编译配置2.4 生成2.5 Make编译和安装3.配…

[转帖]TLAB(Thread Local Allocation Buffer)

https://www.cnblogs.com/Chary/p/18034613 TLAB是虚拟机在堆内存的eden划分出来的一块专用空间,是线程专属的。在虚拟机的TLAB功能启动的情况下,在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,…