首頁>技術>

Apache Commons Collections是一個擴充套件了Java標準庫裡的Collection結構的第三方基礎庫,它提供了很多強有力的資料結構型別並且實現了各種集合工具類。

1.反序列化原因

如果Java應用對使用者輸入的內容做了序列化,但是使用者輸入的內容是不可信的資料,進行了惡意構造,那麼在對惡意構造的資料做反序列化處理,就會產生的非預期物件,在這個過程中就可能帶來任意程式碼執行。

2.漏洞原理

在進行Map轉換時,修改Map中的key和value會呼叫介面,觸發內建的transform來獲取類名、方法物件進行反射,其中傳入的方法名,引數型別等都是可控的,那麼我們就可以構造ChainedTransformer來進行反射,呼叫任意函式

3.影響版本

commons-collections<=3.2.1存在漏洞

4.下載地址

本文對commons-collections-3.2.1進行漏洞分析,下載地址:https://github.com/SQYY/Apache-Commons-Collections/raw/master/commons-collections-3.2.1-1.0.0.jar

5.漏洞分析

在 org/apache/commons/collections/map/TransformedMap.class中可以看到decorate()方法,它是將一個Map物件,轉換成TransformedMap物件。

可以看到它會把它的三個引數帶入到TransformedMap方法中,並返回例項化的結果。而在這個方法中,如上圖所示,就是將Map中的key和value轉換成TransformedMap中的key和value

而 transform是一個介面,即可實現資料變換的操作。當Map中的任意項的Key或者value被修改,這個介面就會被呼叫。

在 org/apache/commons/collections/functors/InvokerTransformer.class中,也是我們核心的關鍵點,可以看到它實現了transform和Serializable這兩個介面

可以看到transform中,首先會getClass獲取傳入引數的類名,再通過getMethod獲取方法物件,最後呼叫invoke進行反射

就是說只需要傳入方法名、引數型別和引數,我們就可以通過Java的反射機制可以呼叫任意函式。

5.修復方式

commons-collections升級到3.2.2或更高版本。

通過maven配置更新commons-collections,使用3.2.2或者最新版本,參考如下

<dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version></dependency>

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 嵌入式開發C語言實用方法及技巧介紹