
Scanner RCE asincrono per CVE-2025-55182 / CVE-2025-66478 — prototype pollution → esecuzione di codice tramite React Server Actions.
Prototype-pollution → Remote Code Execution via React Server Actions
Rilevamento asincrono, basato su canary di output e orientato alla versione - nessuna supposizione cieca
[!WARNING] Solo per ricerca di sicurezza autorizzata e test di penetrazione. Scansionare sistemi senza esplicita autorizzazione scritta è illegale. L'autore non si assume alcuna responsabilità per l'uso improprio di questo strumento.
Le React Server Actions inviano i dati delle azioni come dati del modulo multipart direttamente in un contesto di esecuzione lato server. A causa di una sanificazione insufficiente della prototype-pollution nelle versioni interessate di react-server-dom-webpack, un attaccante può:
Object.prototype_response._prefix sull'oggetto di risposta internoprocess.mainModule.require('child_process').execSync(cmd)
Questo garantisce Remote Code Execution non autenticata su qualsiasi applicazione Next.js pubblicamente accessibile che utilizza React Server Actions con una versione vulnerabile di React.
CVE-2025-55182 - Generale: colpisce i pacchetti React 19 (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack)
CVE-2025-66478 - Specifica: percorso di sfruttamento specifico di Next.js tramite l'endpoint / delle Server Action
| Componente | Vulnerabile | Corretta |
|---|---|---|
React react-server-dom-* | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Next.js 16.x | 16.0.0 – 16.0.6 | 16.0.7+ |
| Next.js 15.x | 15.0.0-15.0.4, 15.1.0-15.1.8, 15.2.0-15.2.5, 15.3.0-15.3.5, 15.4.0-15.4.7, 15.5.0-15.5.6 | 15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+ |
| Next.js 14.x | Solo build canary 14.3.0-canary.77+ | Tutti i 14.x stabili - NON vulnerabile |
| Next.js 13.x | - | NON vulnerabile |
Questo scanner utilizza la verifica tramite canary basata sull'output - il metodo più affidabile per confermare l'esecuzione di codice reale con zero falsi positivi:
1. POST / con header Next-Action + payload multipart per prototype-pollution
2. Il payload esegue: echo <canary_casuale>
3. Il server vulnerabile solleva NEXT_REDIRECT con base64(canary) nell'URL
4. Header della risposta: X-Action-Redirect: /login?a=<base64(canary)>
5. Lo scanner decodifica base64 → corrisponde al canary → RCE confermato ✓
allow_redirects=False è fondamentale - la conferma risiede nell'header, non nella destinazione del reindirizzamento.
git clone https://github.com/InferiorAK/React2Shell
cd React2Shell
pip install -r requirements.txt
# Necessario solo se si utilizza la modalità --browser per un rilevamento versione migliorato:
playwright install chromium
playwright install-deps chromium
Requisiti: Python 3.10+
# Singolo target
python3 CVE-2025-55182_scanner.py -u https://target.com
# Scansiona una lista di URL
python3 CVE-2025-55182_scanner.py -f urls.txt
# Modalità silenziosa - stampa solo risultati RCE / Vulnerabile
python3 CVE-2025-55182_scanner.py -f urls.txt -q
# Modalità browser - Chromium headless per rilevamento versione accurato
python3 CVE-2025-55182_scanner.py -f urls.txt -b
# Opzioni complete - consigliato per scansioni su larga scala
python3 CVE-2025-55182_scanner.py -f urls.txt -b -q -c 3 -t 20
| Flag | Forma lunga | Predefinito | Descrizione |
|---|---|---|---|
-u | --url | - | URL del singolo target |
-f | --file | - | File contenente un URL per riga |
-o | --output | outputs/vuln.txt | File di output per i target vulnerabili |
-U | --unknown-output | outputs/unknown.txt | File di output per i target con versione sconosciuta |
-c | --concurrency | 5 | Connessioni HTTP concorrenti |
-t | --timeout | 15 | Timeout per richiesta (secondi) |
-q | --quiet | off | Stampa solo righe RCE / VULNERABLE |
-b | --browser | off | Fallback Playwright Chromium headless per rilevamento versione |
A ogni target scansionato viene assegnato uno dei seguenti verdetti:
| Verdetto | Colore | Significato |
|---|---|---|
RCE | 🔴 Rosso | Canary confermato in X-Action-Redirect - esecuzione di codice remoto provata |
VULNERABLE | 🟠 Arancione | Versione in range vulnerabile; il payload RCE non ha fatto eco (WAF / configurazione corretta / endpoint sbagliato) |
Sconosciuto | 🟡 Giallo | Next.js confermato ma versione non rilevabile - RCE comunque tentato; salvato in outputs/unknown.txt per un nuovo tentativo in modalità browser |
Non Vulnerabile | 🟢 Verde | Versione confermata corretta, o RCE esplicitamente restituito come sicuro |
Saltato | ⚪ Bianco | Versione confermata corretta o sito non Next.js - nessun PoC tentato |
Errore | ⚪ Bianco | Host irraggiungibile o connessione fallita |
File di output (salvati nella cartella outputs/, creata automaticamente):
outputs/vuln.txt — Risultati RCE e VULNERABLE (aggiunti in coda a ogni esecuzione)outputs/unknown.txt — Target con versione Sconosciuta; riprova questi con -b per un rilevamento versione accuratoPerché la versione viene mostrata come
sconosciutaper oltre il 90% dei siti?
I moderni Next.js 13+ che utilizzano l'architettura App Router non incorporano mai la versione del framework nell'HTML statico. La versione esiste solo in window.next.version dopo che il JavaScript viene eseguito in un contesto reale del browser.
Senza --browser:
__NEXT_DATA__, script inline e file chunk con hashsconosciuto - il filtraggio basato sulla versione viene bypassato