
Exploit de preuve de concept pour CVE-2025-55182, une vulnérabilité RCE critique dans les Server Actions de Next.js. Exploite la désérialisation non sécurisée dans le protocole React Flight pour exécuter des commandes arbitraires via la pollution de prototype et le contournement de sandbox.
Un script de Preuve de Concept (PoC) pour React2Shell (CVE-2025-55182), une vulnérabilité critique d'exécution de code à distance (RCE) affectant les applications Next.js utilisant les Server Actions.
[!WARNING] Avertissement: Cet outil est destiné uniquement à des fins éducatives et de test autorisé. Je ne suis pas responsable de toute utilisation abusive.
Ce script exploite une vulnérabilité de désérialisation non sécurisée dans le protocole "Flight" des React Server Components. Il permet à des attaquants non authentifiés d'exécuter du code JavaScript arbitraire sur le serveur, conduisant à une exécution de code à distance (RCE) partielle.
require (global.require ou via le constructeur de module), garantissant son fonctionnement sur les versions modernes de Node.js (v14+).pip install -r requirements.txt
python3 react2shell.py -u <TARGET_URL> [-c <COMMAND>]
| Argument | Description | Défaut |
|---|---|---|
-u, --url | Requis. L'URL cible (par ex., http://localhost:3000/). | N/A |
-c, --cmd | Optionnel. La commande à exécuter sur le serveur. | id |
Vérifier l'identité de l'utilisateur :
python3 react2shell.py -u http://127.0.0.1:3000/
Lister le contenu d'un répertoire :
python3 react2shell.py -u http://127.0.0.1:3000/ -c "ls -la"
Lire un fichier sensible :
python3 react2shell.py -u http://127.0.0.1:3000/ -c "cat /etc/passwd"
L'exploit exploite une chaîne de Pollution de Prototype et de Désérialisation non sécurisée dans la gestion des Server Actions de Next.js pour les React Server Components (RSC).
Next-Action indique au serveur de traiter une Server Action.then malveillante ("$1:__proto__:then"). Cela trompe le gestionnaire de requêtes asynchrones du serveur en lui faisant considérer le payload comme un objet "Thenable" (semblable à une Promise)._response. Le champ _prefix est normalement utilisé pour la mise en tampon interne du flux, mais en le manipulant, nous pouvons injecter du JavaScript brut.require est souvent retirée de la portée globale pour empêcher la RCE. Le script contourne cela en parcourant la chaîne de prototypes de process.mainModule :
var require = global.require || global.process.mainModule.constructor._load;
Cela récupère le chargeur de modules interne, nous permettant d'importer child_process et d'exécuter des commandes système.execSync), et la sortie est lancée comme un objet Error. Cette erreur est sérialisée et renvoyée au client dans le corps de la réponse HTTP, nous permettant de voir la sortie de la commande.Cet outil a été développé avec l'assistance de Gemini 3 Pro.