11.26 又一個反序列化漏洞,我服了...

來源:https://tinyurl.com/y3nzjpmn

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中的keyvalue轉換成TransformedMap中的keyvalue

而 transform是一個接口,即可實現數據變換的操作。當Map中的任意項的Key或者value被修改,這個接口就會被調用。

又一個反序列化漏洞,我服了...

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

又一個反序列化漏洞,我服了...

可以看到transform中,首先會getClass獲取傳入參數的類名,再通過getMethod獲取方法對象,最後調用

invoke進行反射

又一個反序列化漏洞,我服了...

就是說只需要傳入方法名、參數類型和參數,我們就可以通過Java的反射機制可以調用任意函數。

5.修復方式

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

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

又一個反序列化漏洞,我服了...

我自己是一名從事了多年開發的Java老程序員,辭職目前在做自己的Java私人定製課程,今年年初我花了一個月整理了一份最適合2019年學習的Java學習乾貨,從最基礎的JavaSE到Spring各種框架都有整理,送給每一位Java小夥伴,想要獲取的可以關注我的頭條號並在後臺私信我:Java,即可免費獲取。


分享到:


相關文章: