
Async RCE-Scanner für CVE-2025-55182 / CVE-2025-66478 — Prototype-Pollution → Codeausführung über React Server Actions.
Async, zuerst Version, dann ausgabebasierte Canary-Erkennung - kein blindes Raten
[!WARNING] Nur für autorisierte Sicherheitsforschung und Penetrationstests. Das Scannen von Systemen ohne ausdrückliche schriftliche Genehmigung ist illegal. Der Autor übernimmt keine Verantwortung für Missbrauch dieses Tools.
React Server Actions übergeben Aktionsdaten als Multipart-Formulardaten direkt an einen serverseitigen Ausführungskontext. Aufgrund unzureichender Prototype-Pollution-Bereinigung in betroffenen Versionen von react-server-dom-webpack kann ein Angreifer:
Object.prototype verschmutzt_response._prefix am internen Response-Objekt überschreibenprocess.mainModule.require('child_process').execSync(cmd)
Dies ermöglicht nicht authentifizierte Remote Code Execution auf jeder öffentlich erreichbaren Next.js-Anwendung, die React Server Actions mit einer betroffenen React-Version verwendet.
CVE-2025-55182 - Breit: betrifft React-19-Pakete (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack)
CVE-2025-66478 - Eingeschränkt: Next.js-spezifischer Ausnutzungspfad über den Server-Action-Endpunkt /
| Komponente | Verwundbar | Gepatcht |
|---|---|---|
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 | 14.3.0-canary.77+ nur Canary-Builds | Alle stabilen 14.x - NICHT betroffen |
| Next.js 13.x | - | NICHT betroffen |
Dieser Scanner verwendet die ausgabebasierte Canary-Verifizierung - die zuverlässigste Methode, um echte Codeausführung ohne falsch-positive Ergebnisse zu bestätigen:
1. POST / with Next-Action header + multipart prototype-pollution payload
2. Payload executes: echo <random_canary>
3. Vulnerable server throws NEXT_REDIRECT with base64(canary) in the URL
4. Response header: X-Action-Redirect: /login?a=<base64(canary)>
5. Scanner decodes base64 → matches canary → RCE confirmed ✓
allow_redirects=False ist entscheidend - die Bestätigung befindet sich im Header, nicht im Ziel der Weiterleitung.
git clone https://github.com/InferiorAK/React2Shell
cd React2Shell
pip install -r requirements.txt
# Required only if using --browser mode for improved version detection:
playwright install chromium
playwright install-deps chromium
Anforderungen: Python 3.10+
# Single target
python3 CVE-2025-55182_scanner.py -u https://target.com
# Scan a list of URLs
python3 CVE-2025-55182_scanner.py -f urls.txt
# Quiet mode - only print RCE / Vulnerable results
python3 CVE-2025-55182_scanner.py -f urls.txt -q
# Browser mode - headless Chromium for accurate version detection
python3 CVE-2025-55182_scanner.py -f urls.txt -b
# Full options - recommended for large-scale scanning
python3 CVE-2025-55182_scanner.py -f urls.txt -b -q -c 3 -t 20
| Flag | Langform | Standard | Beschreibung |
|---|---|---|---|
-u | --url | - | Einzelne Ziel-URL |
-f | --file | - | Datei mit einer URL pro Zeile |
-o | --output | outputs/vuln.txt | Ausgabedatei für verwundbare Ziele |
-U | --unknown-output | outputs/unknown.txt | Ausgabedatei für Ziele mit unbekannter Version |
-c | --concurrency | 5 | Parallele HTTP-Verbindungen |
-t | --timeout | 15 | Timeout pro Anfrage (Sekunden) |
-q | --quiet | aus | Nur RCE- / VULNERABLE-Zeilen ausgeben |
-b | --browser | aus | Playwright-Headless-Chromium-Fallback zur Versionserkennung |
Jedem gescannten Ziel wird eine der folgenden Bewertungen zugewiesen:

| Bewertung | Farbe | Bedeutung |
|---|---|---|
RCE | 🔴 Rot | Canary in X-Action-Redirect bestätigt - bewiesene Remote Code Execution |
VULNERABLE | 🟠 Orange | Version liegt im verwundbaren Bereich; das RCE-Payload wurde nicht zurückgespiegelt (WAF / gepatchte Konfiguration / falscher Endpunkt) |
Unknown | 🟡 Gelb | Next.js bestätigt, aber die Version konnte nicht erkannt werden - RCE wurde trotzdem versucht; für einen erneuten Versuch im Browser-Modus in outputs/unknown.txt gespeichert |
Not Vulnerable | 🟢 Grün | Version als gepatcht bestätigt oder RCE explizit als sicher zurückgegeben |
Skipped | ⚪ Weiß | Bestätigt gepatchte Version oder keine Next.js-Website - kein PoC versucht |
Error | ⚪ Weiß | Host nicht erreichbar oder Verbindung fehlgeschlagen |
Ausgabedateien (werden im Ordner outputs/ gespeichert, der automatisch erstellt wird):
outputs/vuln.txt - RCE- und VULNERABLE-Ergebnisse (werden bei jedem Lauf angehängt)outputs/unknown.txt - Ziele mit Unknown-Version; diese mit -b erneut prüfen, um die Version genau zu erkennenWarum wird die Version bei über 90 % der Websites als
unknownangezeigt?
Modernes Next.js 13+ mit App-Router-Architektur bettet die Framework-Version niemals in statisches HTML ein. Die Version existiert nur in window.next.version, nachdem JavaScript in einem echten Browserkontext ausgeführt wurde.
Ohne --browser:
__NEXT_DATA__, Inline-Skripte und gehashte Chunk-Dateienunknown zurück - die versionsbasierte Filterung wird umgangenMit --browser (-b):
window.next.version direkt aus dem Live-DOM# Recommended with browser mode - reduce concurrency (browser pages are resource-heavy)
python3 CVE-2025-55182_scanner.py -f urls.txt -b -c 3
Der Scanner durchläuft bis zu 7 Stufen und stoppt, sobald eine Version gefunden wurde:
Stage 1 │ HTTP Response Headers
│ X-Powered-By: Next.js X.Y.Z
│ x-nextjs-*, x-next-version
Stage 2 │ Inline <script> Blocks (per-block scan)
│ window.next = { version: "X.Y.Z", ... }
│ version:"X.Y.Z", router: ... ← minified bundle adjacent-key pattern
│ "nextVersion":"X.Y.Z"
│ Next.js vX.Y.Z ← plain text in meta / HTML comments
│ __NEXT_VERSION__ = "X.Y.Z"
Stage 3 │ __NEXT_DATA__ JSON Blob
│ Pages Router only - "version":"X.Y.Z" safe in this context
Stage 4 │ Hashed Chunk URLs (extracted from <script src>)
│ /_next/static/chunks/*, /_next/static/app/*, /_next/static/runtime/*
│ Fetches up to 12 real bundle files, scans for version strings
Stage 5 │ Fixed-name Fallback Chunks
│ main.js, framework.js, webpack.js, _app.js, pages/_app.js
Stage 6 │ /package.json endpoint
│ Dev mode / misconfigured servers expose this directly
Stage 7 │ Playwright Headless Browser [--browser / -b only]
│ Evaluates window.next.version after full JS execution
│ Only triggered when stages 1–6 return "unknown"
Dieses Tool wird ausschließlich für Bildungszwecke und autorisierte Sicherheitsforschung veröffentlicht.
Der Autor, InferiorAK, ist nicht für Schäden verantwortlich, die durch Missbrauch entstehen.
Hol immer eine schriftliche Genehmigung ein, bevor du ein System testest, das dir nicht gehört.
Erstellt von InferiorAK
Meine Links