
Scanner RCE asincrono per CVE-2025-55182 / CVE-2025-66478 — prototype pollution → esecuzione di codice tramite 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 bypassatoCon --browser (-b):
window.next.version direttamente dal DOM live# Consigliato con modalità browser - ridurre la concorrenza (le pagine browser consumano risorse)
python3 CVE-2025-55182_scanner.py -f urls.txt -b -c 3
Lo scanner esegue fino a 7 fasi, fermandosi non appena viene trovata una versione:
Fase 1 │ Intestazioni della Risposta HTTP
│ X-Powered-By: Next.js X.Y.Z
│ x-nextjs-*, x-next-version
Fase 2 │ Blocchi <script> Inline (scansione per blocco)
│ window.next = { version: "X.Y.Z", ... }
│ version:"X.Y.Z", router: ... ← pattern di chiave adiacente in bundle minificato
│ "nextVersion":"X.Y.Z"
│ Next.js vX.Y.Z ← testo semplice in meta / commenti HTML
│ __NEXT_VERSION__ = "X.Y.Z"
Fase 3 │ Blob JSON __NEXT_DATA__
│ Solo Pages Router - "version":"X.Y.Z" sicuro in questo contesto
Fase 4 │ URL di Chunk con Hash (estratti da <script src>)
│ /_next/static/chunks/*, /_next/static/app/*, /_next/static/runtime/*
│ Recupera fino a 12 file bundle reali, cerca stringhe di versione
Fase 5 │ Chunk di Fallback a Nome Fisso
│ main.js, framework.js, webpack.js, _app.js, pages/_app.js
Fase 6 │ Endpoint /package.json
│ Modalità di sviluppo / server malconfigurati espongono questo direttamente
Fase 7 │ Browser Headless Playwright [solo --browser / -b]
│ Valuta window.next.version dopo la completa esecuzione JS
│ Attivato solo quando le fasi 1–6 restituiscono "sconosciuto"
Questo strumento è pubblicato solo per scopi educativi e di ricerca di sicurezza autorizzata.
L'autore, InferiorAK, non è responsabile per danni causati da un uso improprio.
Ottenere sempre il permesso scritto prima di testare qualsiasi sistema che non si possiede.
Realizzato da InferiorAK
I miei Link