
Spring-Cloud-Spel-RCE
En clonant le code d'environnement déjà écrit sur Github.
//⚠️ Attention : le chemin de téléchargement du code d'environnement ne doit pas contenir de caractères chinois ni d'espaces
git clone https://github.com/Ha0Liu/CVE-2022-22947.git

Ouvrez le paquet de code que nous venons de télécharger avec IDEA : Open ---> chemin du fichier téléchargé ---> Open.
En créant manuellement un projet et en construisant l'environnement.
(1) Nouveau projet, configurez puis cliquez sur Next jusqu'à la fin ;

(2) Analyse de la structure du répertoire du projet :
(3) Ajoutez les dépendances Maven dans le fichier pom.xml (le dépôt Maven contient tous les détails des dépendances).


(4) Modifiez le fichier de configuration Spring (chemin : src -> main -> resources -> application.properties), détails ci-dessous :

(5) Modifiez la classe Java générée automatiquement après la création du projet (le nom de la classe est généralement nomDuProjet+Application, chemin : src -> main -> java -> com.xxx.xxx -> xxxApplication). Voir l'image ci-dessous pour les détails :

(6) Démarrez le projet. Voir l'image ci-dessous pour les détails :

(7) Accédez à http://localhost:9000. Si la page affichée correspond à la capture d'écran, l'environnement est correctement mis en place.

(1) Examinons d'abord le correctif officiel, diff disponible ici : https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e. Officiellement, dans la fonction org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue, StandardEvaluationContext a été remplacé par GatewayEvaluationContext pour exécuter les expressions SPEL.

D'après l'image ci-dessus, ce correctif modifie principalement la méthode d'analyse des expressions SPEL. La ligne 66 montre une instruction if qui vérifie si l'expression SPEL commence par #{ et se termine par }. La fonction getValue sert à analyser les expressions SPEL. On voit donc que cette vulnérabilité est une vulnérabilité RCE déclenchée par une expression SPEL.
(2) En cliquant sur le champ getValue avec Ctrl + clic gauche, vous remontez jusqu'à l'énumération org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.

La méthode default mentionnée ci-dessus montre que la méthode DEFAULT de l'énumération est appelée. Détails de la méthode :
default ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}

(3) Remontez jusqu'à org.springframework.cloud.gateway.support.ConfigurationService.class#normalizeProperties().

Cette méthode normalizeProperties() analyse les propriétés des filtres. Elle transmet les propriétés de configuration du filtre à normalize, qui entre finalement dans getValue pour exécuter l'expression SPEL, provoquant une injection d'expression SPEL.
(1) D'après la documentation [https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html](https://cloud.spring.io/spring-cloud-gateway/multi/multi actuator_api.html), les utilisateurs peuvent créer et supprimer des routes dans la passerelle via l'actuator. L'image ci-dessous montre la structure de base de la passerelle.
