Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2025-29927 — This is a CVE-2025-29927 Scanner. | Kitploit
Tools/GitHubGitHub/houmanpashaei/cve-2025-29927
ReconnaissanceVulnerability ScannersWeb Application ExploitationWeb SecurityPenetration TestingCrawler
GitHubhoumanpashaei/cve-2025-29927

CVE-2025-29927

This is a CVE-2025-29927 Scanner.

Repository anzeigen
5vor 1 JahrNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Erweiterter CVE-2025-29927-Schwachstellenscanner

Dies ist ein professioneller Scanner, der die CVE-2025-29927 Middleware-Umgehungsschwachstelle in Next.js-Anwendungen erkennt.

🧠 Was er tut

  • Verwendet einen echten Headless-Browser (Playwright), um eine Zielwebsite tiefgehend zu crawlen (inkl. JS-gerenderter Inhalte)
  • Testet interne Pfade mit manipulierten X-Middleware-Subrequest-Headern, um die Next.js-Middleware zu umgehen
  • Vergleicht HTTP-Status und Antwortlänge, um Umgehungen zu identifizieren
  • Vollständig multithreaded für hohe Leistung

🚀 Schnellstart

Installieren (Lokal)```bash

pip install -r requirements.txt playwright install

root@kitploit:~
### Scanner ausführen```bash
python main.py --domain https://example.com --threads 10 --timeout 10 --save

Alle CLI-Optionen```bash

python main.py --help

root@kitploit:~
| Option         | Beschreibung                                |
|----------------|---------------------------------------------|
| `--domain`     | Basis-URL der Zielseite (erforderlich)      |
| `--user-agent` | Benutzerdefinierter User-Agent (Standard: Chrome-String) |
| `--timeout`    | Anfrage-Timeout (Standard: 10 Sekunden)     |
| `--proxy`      | Proxy-Adresse (optional)                    |
| `--save`       | Ergebnisse in `results.txt` speichern       |
| `--threads`    | Anzahl der Threads (Standard: 10)           |
| `--wordlist`   | Wortliste inklusive Common Path             |

---

## 🐳 Docker-Nutzung

### Docker-Image erstellen```bash
docker build -t cve-scanner .

Scanner ausführen```bash

docker run -it --rm cve-scanner --domain https://example.com --save

root@kitploit:~
---

## ⚙️ GitHub Actions

Dieses Projekt enthält einen GitHub Actions Workflow, um das Setup bei Push zu testen. Er:
- Installiert Abhängigkeiten
- Installiert Playwright-Browser
- Führt einen `--help`-Check durch

Siehe `.github/workflows/python.yml`.

---

## 🧱 Struktur```
.
├── main.py              # Entry point
├── config.py            # CLI parser
├── crawler.py           # Playwright crawler
├── scanner.py           # Multi-threaded vulnerability testing
├── requirements.txt
├── Dockerfile
└── .github/workflows

🧠 Weitere Details

🧨 Fortschrittliches Design eines Scanners für CVE-2025-29927

Überblick über die Schwachstelle CVE-2025-29927

CVE-2025-29927 ist ein kritischer Sicherheitsfehler in Next.js, der es Angreifern ermöglicht, die middlewarebasierte Authentifizierung und Autorisierung zu umgehen. Durch das Einfügen eines speziellen internen Headers (X-Middleware-Subrequest) in HTTP-Anfragen kann ein Angreifer den Next.js-Server dazu bringen, die Middleware-Ausführung zu überspringen, und so Zugriff auf geschützte Routen erhalten​. In der Praxis wird eine Anfrage, die normalerweise von der Authentifizierungs-Middleware blockiert würde (z. B. mit einem 401/403-Fehler oder einer Weiterleitung zur Anmeldeseite), normal verarbeitet, wenn dieser Header vorhanden ist, wodurch die Sicherheitsprüfungen effektiv umgangen werden. Diese Schwachstelle betrifft Next.js-Versionen 11.1.4 bis 15.2.2, und Administratoren werden dringend aufgefordert, einen Patch einzuspielen oder Gegenmaßnahmen zu implementieren (z. B. das Entfernen dieses Headers in Proxys), um ihre Anwendungen zu schützen​.

Umgehung der Next.js-Middleware durch Einfügen des speziellen X-Middleware-Subrequest-Headers, wodurch direkter Zugriff auf eine geschützte Ressource ermöglicht wird (CVE-2025-29927 Exploit)

Die Erkennung dieser Schwachstelle in einer Webanwendung erfordert das Auffinden interner Endpunkte und deren Testen mit dem bösartigen Header, um zu sehen, ob ein unbefugter Zugriff möglich ist. Im Folgenden finden Sie einen Designplan für ein fortgeschrittenes Python-Skript, das eine Zielwebsite (mit vollständiger JavaScript-Unterstützung) crawlt und nach CVE-2025-29927 scannt, wobei alle angegebenen Anforderungen erfüllt werden.

🚀 Werkzeuge und Bibliotheken für dynamisches Crawlen und Scannen

Um die Anforderung eines tiefgehenden Crawlings inklusive JavaScript-gerenderter Inhalte zu erfüllen, werden wir Playwright verwenden (bevorzugt gegenüber Selenium aufgrund seiner Geschwindigkeit und modernen API). Playwright ist eine leistungsstarke Bibliothek zur Automatisierung von Headless-Browsern, die dynamische Web-Apps und moderne JS-Frameworks verarbeiten kann. Im Vergleich zu Selenium bietet Playwright eine modernere API (basierend auf dem Chrome DevTools-Protokoll) und unterstützt sowohl synchrone als auch asynchrone Operationen, was für unseren Anwendungsfall eine bessere Leistung bieten kann​. Wichtige Bibliotheken und ihre Installationsanweisungen umfassen:

  • playwright – für die Headless-Browser-Automation (zum Laden von SPAs oder Seiten, die JS erfordern). (Installation: pip install playwright und dann playwright install ausführen, um die Browser-Binärdateien zu erhalten).

  • requests oder httpx – zum Senden von HTTP-Anfragen während der Scan-Phase. Wir können requests aus Einfachheit oder httpx/aiohttp für Async-Unterstützung verwenden. (Installation: pip install requests oder pip install httpx).

  • bs4 (BeautifulSoup) – zum Parsen von HTML und Extrahieren von Links, wenn nötig. Playwright kann direkt das DOM abfragen, aber die Verwendung von BeautifulSoup auf dem HTML-Inhalt der Seite ist einfach, um Anker-Tags zu finden. (Installation: pip install beautifulsoup4).

  • concurrent.futures (eingebaut) oder asyncio – zur Implementierung von Nebenläufigkeit. Für Multithreading wird Pythons concurrent.futures.ThreadPoolExecutor verwendet (keine zusätzliche Installation). Bei einem asynchronen Ansatz können Pythons asyncio mit für parallele Anfragen verwendet werden.

Begründung: Playwright wird aufgrund seiner Fähigkeit ausgewählt, dynamische Inhalte ohne große Komplexität zu scrapen. „Mit Playwright können wir Headless-Browser automatisieren... um das Web genau wie ein Mensch zu navigieren, was es großartig zum Scrapen dynamischer, von JavaScript betriebener Websites macht“​. Dadurch wird sichergestellt, dass unser Crawler Links oder UI-Elemente sehen kann, die von Skripten generiert werden (welche ein einfacher, auf Requests basierender Crawler übersehen würde).

🚀 Crawlen mit JavaScript-Unterstützung (Dynamische Pfaderkennung)

Das Crawler-Modul wird Playwright im Headless-Modus verwenden, um ein tiefgehendes Crawlen der Zielseite durchzuführen. Ziel ist es, interne Pfade (Endpunkte) zum Testen zu entdecken, einschließlich solcher, die erst nach der JS-Ausführung sichtbar werden. Wichtige Designpunkte für den Crawler:

Headless-Browser-Navigation: Starten einer Browserinstanz (z. B. Chromium) im Headless-Modus über Playwright. Verwenden Sie einen Browser-Kontext mit einem benutzerdefinierten User-Agent, falls vom Benutzer angegeben (mehr dazu im nächsten Abschnitt). Beispielsweise können wir einen Kontext mit browser.new_context(user_agent=<user_agent_string>)​ erstellen, um den gewählten User-Agent zu emulieren. Wenn ein Proxy konfiguriert ist, wird dieser beim Start angewendet (Playwright erlaubt das Setzen eines Proxyservers beim Starten des Browsers oder Kontexts​).

Rekursive Crawling-Strategie: Starten von einer gegebenen Basis-URL (Seed). Verwenden Sie page.goto(base_url, timeout=<T>), um die Seite zu laden (Timeout konfigurierbar). Warten Sie auf Netzwerkinaktivität oder eine kurze Verzögerung, um dynamische Inhalte bei Bedarf laden zu lassen. Dann extrahieren Sie Links. Wir können Links entweder extrahieren durch:

  • Ausführen von JavaScript im Seitenkontext, um alle Anker zu sammeln, z. B. links = page.evaluate("Array.from(document.querySelectorAll('a[href]'), a => a.href)"), oder
  • Abrufen des HTML der Seite (content = page.content()) und Verwenden von BeautifulSoup zum Parsen und Finden aller <a href>-Attribute.

Link-Filterung: Filtern Sie Links heraus, die nicht zur Zieldomäne gehören (um intern zu bleiben). Ignorieren Sie auch statische Datei-URLs wie Bilder, CSS, JS usw. Überspringen Sie z. B. jede URL mit Dateierweiterungen wie .css, .js, .jpg, .png, .gif, .svg, .woff usw. Ein praktischer Ansatz (inspiriert von der ProjectDiscovery-Vorlage) besteht darin, jeden Pfad zu ignorieren, der nach dem anfänglichen Schrägstrich einen „Punkt“ enthält. Sie extrahierten Endpunkte mit einem Regex-Muster href=['"](https://github.com/houmanpashaei/cve-2025-29927/blob/HEAD/%5C/%5B%5E.%5C%22%27%5D+)['"] – dies erfasst interne Pfade, die keinen Punkt enthalten (und überspringt somit Assets)​. Wir werden ähnliche Logik im Code implementieren, um das Einreihen von statischen Ressourcen oder externen Links zu vermeiden.

Nachverfolgung und Tiefenkontrolle: Verwalten Sie eine Menge besuchter URLs, um Endlosschleifen oder Wiederholungen zu vermeiden. Verwenden Sie eine Warteschlange (FIFO) für die BFS-Durchquerung des Linkgraphen der Seite. Optional kann der Benutzer eine Crawling-Tiefenbeschränkung oder eine maximale Anzahl zu besuchender Seiten angeben, um ein unendliches Durchlaufen großer Seiten zu verhindern.

JavaScript-gerenderte Inhalte: Da wir einen echten Browser verwenden, sind sogar Links, die von Skripten zum DOM hinzugefügt werden (z. B. eine React-App, die ein Menü nach dem Abrufen von Daten rendert), für unseren Crawler sichtbar. Wir sollten in Betracht ziehen, bei Bedarf zu klicken oder zu interagieren (z. B. wenn bestimmte Seiten erst nach einer Benutzeraktion geladen werden). Um die Sache einfach und schnell zu halten, konzentriert sich das anfängliche Design jedoch auf das Sammeln von -hrefs auf jeder geladenen Seite. Wir können später erweitern, um Dinge wie unendliches Scrollen oder Inhalte hinter Klicks zu behandeln, wenn die Zielanwendung dies erfordert.

Effizienz: Playwright unterstützt paralleles Ausführen mehrerer Seiten/Tabs über seine async API. Wir könnten mehrere Seiten mit asyncio.gather instanziieren, um mehrere Links gleichzeitig abzurufen. Für eine erste Implementierung ist ein sequenzielles Crawlen einfacher (einfacher zu implementieren) und wir verlassen uns auf Multithreading beim Scannen für die Leistung. Falls nötig, könnte eine erweiterte Optimierung ein asynchrones Crawlen beinhalten (mit async with async_playwright() und dem Abwarten mehrerer page.goto-Aufrufe). Da die Browserautomatisierung jedoch ressourcenintensiver ist, ist ein vorsichtiger Ansatz, vielleicht ein oder wenige Browser-Seiten gleichzeitig zu behalten, um das System nicht zu überlasten.

🚀 Benutzerkonfigurationsmenü und Optionen

Das Skript wird beim Start ein benutzerfreundliches Konfigurationsmenü anzeigen, das es dem Benutzer ermöglicht, Scan-Parameter anzupassen oder Standardwerte zu akzeptieren. Dies könnte über ein interaktives Konsolenmenü (unter Verwendung von input()-Eingabeaufforderungen) oder über Kommandozeilenargumente (unter Verwendung von argparse für ein professionelleres CLI-Gefühl) erfolgen. Die Optionen umfassen:

  • Benutzerdefinierter User-Agent: Der Benutzer kann eine benutzerdefinierte User-Agent-Zeichenfolge für den Crawler und Scanner angeben. Diese wird auf den Playwright-Browserkontext und auf alle direkten HTTP-Anfragen angewendet. Die Verwendung eines nicht standardmäßigen User-Agents kann helfen, eine triviale Bot-Erkennung zu vermeiden. (Standardmäßig könnte Playwright etwas Identifizierbares verwenden; wir können dies einfach wie oben gezeigt überschreiben.) Beispielsweise könnte der Benutzer eine Zeichenfolge eingeben, die Chrome unter Windows identifiziert, die wir in die Erstellung des Playwright-Kontexts übergeben​.

  • Anfrage-Timeout: Der Benutzer kann ein Timeout (in Sekunden) für Seitenladevorgänge und HTTP-Anfragen festlegen. Dies verhindert, dass der Scanner zu lange auf nicht reagierenden Endpunkten hängt. Wir werden diese Einstellung in für das Crawlen und in den Anfragen (z. B. ) für das Scannen anwenden.

Tool herunterladen
httpx
  • (Optional) argparse – zum Parsen von Kommandozeilenargumenten, falls wir eine CLI-Schnittstelle anstelle eines interaktiven Menüs wünschen. (eingebautes Modul)

  • (Optional) rich oder colorama – für farbige oder formatierte Konsolenausgaben zur Verbesserung der Lesbarkeit. (Installation: pip install rich oder pip install colorama).

  • page.goto(timeout=...)
    requests.get(timeout=...)
  • Proxy-Einstellungen: Wenn der Benutzer den Datenverkehr über einen Proxy leiten möchte (für Anonymität oder um interne Hosts zu erreichen), kann er die Proxy-URL (und bei Bedarf Anmeldeinformationen) eingeben. Das Skript konfiguriert den Playwright-Browser so, dass dieser Proxy beim Start verwendet wird (z. B. browser.launch(proxy={"server": "http://<proxy_host>:<port>", "username": "...", "password": "..."}) wie in Beispielen gezeigt). Ebenso werden wir für Anfragen den Parameter proxies (oder Umgebungsvariablen) entsprechend setzen.

  • Ausgabe in Datei: Das Menü wird fragen, ob der Benutzer Ergebnisse in einer Datei (z. B. results.txt) speichern möchte. Wenn ja, schreibt das Skript alle gefundenen anfälligen Endpunkte und Details in diese Datei, zusätzlich zur Anzeige auf dem Bildschirm. Wenn nicht, werden Ergebnisse nur auf stdout ausgegeben. (Wir werden trotzdem möglicherweise alle gescannten Pfade in einem ausführlichen Protokoll protokollieren, falls benötigt, aber die Datei würde speziell positive Ergebnisse oder einen vollständigen Bericht basierend auf Benutzerpräferenzen aufzeichnen.)

  • Weitere Optionen: Wir können Schalter wie „Ausführlicher Modus“ für Debug-Protokollierung oder „Maximale Crawling-Tiefe/Seiten“ einfügen, falls benötigt. Diese können dem Benutzer helfen, den Scan fein abzustimmen. Für den anfänglichen Umfang reichen die vier Hauptoptionen oben aus.

  • Das Menüsystem wird in einem dedizierten Konfigurations-/Einrichtungsmodul implementiert. Dies könnte einfach eine Funktion sein, die Eingabeaufforderungen ausgibt und Eingaben sammelt, mit sinnvollen Standardwerten, wenn der Benutzer die Eingabetaste drückt (z. B. standardmäßiger User-Agent zu einem Standard, standardmäßiges Timeout = 10 Sekunden, kein Proxy, keine Dateiausgabe). Dies hält die Interaktion klar und ermöglicht es dem Skript, auch nicht interaktiv zu laufen (wenn wir später Kommandozeilenargumente hinzufügen, können wir die interaktiven Eingabeaufforderungen umgehen, indem wir alle erforderlichen Konfigurationen über Argumente bereitstellen).

    🚀 Nebenläufigkeit und Leistungsverbesserungen

    Leistung ist entscheidend für einen Scanner, insbesondere wenn viele Endpunkte gefunden werden. Das Skript wird Nebenläufigkeit zur Geschwindigkeitssteigerung einsetzen, entweder durch Multithreading oder asyncio (oder eine Kombination):

    • Multithreaded-Scannen: Da das Scannen entdeckter Pfade (Senden von HTTP-Anfragen mit Headern) eine I/O-gebundene Aufgabe ist, können wir sicher Python-Threads zur Parallelisierung verwenden. I/O-Operationen geben die Global Interpreter Lock frei, sodass mehrere Threads gleichzeitig Netzwerkanfragen bearbeiten können​. Mit concurrent.futures.ThreadPoolExecutor können wir einen Pool von Worker-Threads haben, die jeweils eine Teilmenge der Scan-Aufgaben bearbeiten. Dies kann den Prozess dramatisch beschleunigen: Beispielsweise könnte das parallele Ausführen von 5 Threads die Scan-Zeit ungefähr um den Faktor 5 reduzieren, wie in anderen Web-Scraping-Kontexten gezeigt​. Wir werden die Anzahl der Threads entweder konfigurierbar machen oder einen sinnvollen Standardwert wählen (z. B. 10 Threads), der Geschwindigkeit und Serverlast ausgleicht. Jeder Thread nimmt URLs aus einer gemeinsamen Warteschlange der zu testenden Endpunkte.

    • Asyncio-Alternative: Alternativ kann ein asynchroner Ansatz verwendet werden, insbesondere wenn Playwright im Async-Modus oder httpx für HTTP-Anfragen verwendet wird. Wir könnten await für mehrere Anfragen gleichzeitig verwenden. Zum Beispiel kann httpx.AsyncClient viele Anfragen gleichzeitig senden und Ergebnisse sammeln. Dieser Ansatz vermeidet Thread-Overhead und kann für eine große Anzahl von Endpunkten sehr effizient sein. Das Mischen von asyncio mit Playwright (das selbst asynchron verwendet werden kann) könnte die Sache jedoch verkomplizieren. Eine pragmatische Lösung ist die Verwendung von Threading für die HTTP-Scan-Phase (da das Crawlen mit Playwright möglicherweise einfacher im synchronen Modus zu verwalten ist).

    • Gleichzeitiges Crawlen: Wir sollten auch das Parallelisieren des Crawls in Betracht ziehen, wenn die Seite groß ist. Playwright kann mithilfe eines async-Kontexts mehrere Seiten gleichzeitig öffnen. Wir könnten eine begrenzte Nebenläufigkeit (z. B. 2-3 Seiten gleichzeitig) für das Crawlen implementieren. Wenn wir beispielsweise neue URLs extrahieren, könnten wir für jede eine neue Seite starten, wenn wir asyncio verwenden. Dies kann bei Bedarf eine erweiterte Optimierung sein. Anfangs ist ein single-threaded Crawl einfacher und für moderate Seitengrößen ausreichend, aber das Design kann dies als Erweiterungspunkt vermerken.

    • Thread-Sicherheit: Wir werden eine threadsichere Handhabung gemeinsam genutzter Daten sicherstellen. Die Liste der zu scannenden URLs kann einfach mit ThreadPoolExecutor.map verarbeitet werden, oder wir können eine threadsichere Warteschlange (Pythons queue.Queue) verwenden und Threads daraus ziehen lassen, bis sie leer ist. Die visited-Menge für das Crawlen wird nur vom Crawler selbst (single-threaded, es sei denn, wir machen gleichzeitiges Crawlen) zugegriffen. Die Scanner-Threads lesen nur aus ihrer Liste von URLs (keine Änderung gemeinsam genutzter Strukturen, außer möglicherweise Protokollierung von Ergebnissen, die wir mit einem Lock schützen oder einfach in einer threadsicheren Liste sammeln können).

    • Ratenbegrenzung und Höflichkeit: Da dies ein Sicherheitstest-Tool ist, ist Geschwindigkeit eine Priorität, aber wir möchten dennoch vermeiden, das Ziel zu überlasten. Dem Benutzer kann geraten werden, eine angemessene Thread-Anzahl einzustellen. Wir können auch eine kleine Verzögerung implementieren oder Semaphore verwenden, um die Nebenläufigkeit bei Bedarf zu begrenzen. Beispielsweise könnten wir nicht alle Threads auf einmal starten, wenn das Netzwerk des Benutzers oder der Server überlastet werden könnte. In einem erweiterten Szenario könnte ein asynchroner Ansatz ein Semaphore verwenden, um z. B. 5 gleichzeitige Anfragen auf einmal zu erlauben. Diese Details können basierend auf Tests der Skriptleistung angepasst werden.

    Zusammenfassend wird die Nebenläufigkeit hauptsächlich auf die Scan-Phase angewendet, um mehrere Endpunkte parallel zu testen. Dies macht den Scanner viel schneller, ohne die Genauigkeit wesentlich zu beeinträchtigen (da jede Anfrage unabhängig ist). Wie eine Referenz feststellt: „Multithreading mit concurrent.futures kann hier einen signifikanten Schub geben. Wir können I/O-Aufgaben gleichzeitig über mehrere Threads ausführen und einen großen Geschwindigkeitszuwachs sehen“​. Multithreading ist hier geeignet, weil netzwerkgebundene Aufgaben selbst in Python davon profitieren​.

    🚀 Kern-Scan-Logik: Testen von Endpunkten auf die Schwachstelle

    Das Herzstück des Skripts ist das Scan-Modul, das die Liste der entdeckten Endpunkte (Pfade) nimmt und jeden auf Anzeichen der CVE-2025-29927-Schwachstelle prüft. Der Prozess für jeden Endpunkt wird sein:

      1. Basisanfrage: Senden einer HTTP-GET-Anfrage an den Endpunkt ohne den speziellen Header, um eine normale Benutzeranfrage zu simulieren. Notieren Sie den Statuscode und die Länge des Antworttexts (oder einen Hash des Texts) zum Vergleich. Beachten Sie auch alle interessanten Antwort-Header. Insbesondere, wenn die Antwort einen der Next.js-Middleware-Header wie x-middleware-rewrite, x-middleware-next oder x-middleware-redirect enthält, deutet dies darauf hin, dass diese Route durch Middleware geschützt ist​. Wir prüfen auch, ob der Status nicht 200 ist (was bedeutet, dass der Zugriff verweigert oder umgeleitet wurde), da dies diejenigen sind, die wahrscheinlich umgangen werden. (Wenn der Status bereits 200 ist und der Inhalt normal geladen wird, handelt es sich entweder um eine öffentliche Seite oder die Schwachstelle trifft nicht zu; wir könnten sie trotzdem testen, aber das eigentliche Interesse gilt geschützten Seiten.)
      1. Erstellen bösartiger Anfragen: Senden zusätzlicher Anfragen an denselben Endpunkt, diesmal mit dem X-Middleware-Subrequest-Header. Wir werden eine Vielzahl von Header-Werten ausprobieren, um die Erkennung über Next.js-Versionen hinweg sicherzustellen:
    • Ein generischer Wert wie "1" oder "true" (einige Quellen deuten darauf hin, dass bereits das Setzen des Headers auf einen beliebigen Wert das Überspringen auslöst​).

    • Die spezifische Nutzlast, die in öffentlichen Exploits verwendet wird, z. B. "middleware:middleware:middleware:middleware:middleware" (fünf Wiederholungen von "middleware")​. Dies ist bekannt dafür, den Bypass für die neuesten Versionen (13+) zu induzieren. Wir werden genau diesen Wert einfügen.

    • Die alternative Nutzlast für Projekte, die das /src-Verzeichnis verwenden, z. B. "src/middleware:src/middleware:src/middleware:src/middleware:src/middleware"​

    • Optional, Ein-Segment-Werte wie "middleware" oder "src/middleware" der Vollständigkeit halber (ältere Next.js-Versionen könnten eine _middleware-Datei im pages-Verzeichnis verwenden, mit einer etwas anderen benötigten Nutzlast​, aber die Multi-Segment-Nutzlasten oben decken bekannte Fälle weitgehend ab). Jede dieser Anfragen wird mit dem benutzerdefinierten Header gesendet. Wir stellen auch sicher, dass dieselbe Methode (GET) verwendet wird und alle Header aus der Basisanfrage enthalten sind, die benötigt werden könnten (wie Cookies oder Auth-Tokens, falls der Benutzer welche für einen eingeloggten Scan bereitgestellt hat, obwohl wir normalerweise ohne Authentifizierung scannen).

      1. Vergleichen der Antworten: Für jeden Header-Test vergleichen Sie die Antwort mit der Basisantwort:
    • Wenn die Basisantwort ein Fehler oder eine Weiterleitung war (z. B. 401 Nicht autorisiert, 403 Verboten oder eine Weiterleitung zur Anmeldung) und eine der mit Header versehenen Antworten 200 OK mit einem signifikant größeren Textkörper (oder anderweitig angibt, dass die Seite geladen wurde), ist dies ein starker Indikator für eine Schwachstelle. Wenn beispielsweise /admin normalerweise 403 zurückgab, aber mit dem Header 200 zurückgibt und das Admin-Dashboard-HTML enthält, markieren wir es.

    • In einigen Fällen könnte der Unterschied ein 302 gegenüber einem 200 oder ein 404 gegenüber einem 200 sein. Wir betrachten eine Statuscode-Änderung von einem Nicht-200 zu 200 als wahrscheinliches Anzeichen. Auch wenn der Status 200 bleibt, sich die Inhaltslänge jedoch drastisch ändert, könnte dies darauf hindeuten, dass der Header das Verhalten verändert hat (weniger häufig für diesen speziellen Fehler, aber eine Möglichkeit, wenn die Seite normalerweise eine Sache ausgeliefert hat und mit Header eine andere).

    • Wir werden Prüfungen implementieren wie: if base_status_code != 200 and test_status_code == 200: (und vielleicht auch sicherstellen, dass test_body_length > base_body_length ist oder ein authentifiziertes Schlüsselwort enthält) dann als anfällig markieren. Wenn die Basis eine Weiterleitung war (z. B. 307 zu /login) und der Test 200 liefert, ebenfalls markieren. Im Wesentlichen: „War der Zugriff zuvor verweigert und ist jetzt erlaubt?“.

    • Wenn der Antwortstatus mit dem Header 404 oder 500 ist, während die Basis eine Weiterleitung war, könnte dies das Szenario einer Cache-Vergiftung sein (Umgehung der Middleware-Weiterleitung, die einen 404 am Ursprung verursacht​). Dieses Szenario ist mit nur einer Anfrage etwas schwieriger zu erkennen, aber das Vorhandensein eines 404 mit Header, wenn die Basis eine Weiterleitung war, könnte ebenfalls notiert werden (obwohl es keine Authentifizierungsumgehung ist, ist es dennoch ein Effekt der Schwachstelle). Unser Fokus liegt jedoch auf der Erkennung einer Authentifizierungsumgehung (200 OK-Zugriff).

      1. Protokollieren der Ergebnisse: Für jeden getesteten Endpunkt protokolliert das Skript das Ergebnis. Wenn kein Unterschied gefunden wird (nicht anfällig), können wir es in einem ausführlichen Protokoll belassen oder verwerfen. Wenn eine potenzielle Schwachstelle gefunden wird, notieren wir den Endpunkt, den Basisstatus und welcher Header-Wert einen 200 verursacht hat usw. Diese werden auf der Konsole ausgegeben und in results.txt gespeichert, wenn der Benutzer sich für das Speichern der Ergebnisse entschieden hat. Wir sollten dies klar formatieren, z. B.:
    • [*] /admin -> baseline 403, with X-Middleware-Subrequest (payload X) got 200 [VULNERABLE]

    • Wir können auch etwas wie die Antwortlänge oder einen Ausschnitt der Antwort zur Bestätigung ausgeben (vielleicht nur die Länge der Kürze halber, z. B. „len: 0 -> 10240 Bytes“). Wenn mehrere Nutzlasten ausprobiert wurden, könnten wir auflisten, welche erfolgreich waren.

    • Wenn die Seite überhaupt keine Next.js-Anwendung zu sein scheint (z. B. haben wir kein /_next/static/ auf der Startseite gefunden, was ein verräterisches Zeichen ist​), könnten wir eine Notiz ausgeben: „No Next.js indicators found, the target may not be using Next.js – likely not vulnerable.“ Aber wir können trotzdem generisch vorgehen, da eine Next.js-Überprüfung eher eine Optimierung als eine Notwendigkeit ist.Diese Logik wird sauber gekapselt. Beispielsweise könnte eine Funktion scan_endpoint(url, session, header_payloads) ein Ergebnisobjekt oder Dictionary zurückgeben, das angibt, ob die Anfälligkeit besteht und mit Details. Wir werden robuste Prüfungen implementieren, um Fehlalarme zu vermeiden. Insbesondere hilft die Anforderung einer Statuscode-Änderung auf 200 (oder anderer eindeutiger Beweise) sicherzustellen, dass wir nur tatsächliche Umgehungen markieren. Wie in der Analyse von ProjectDiscovery erwähnt, prüft der Scanner auf Antwortstatus 200, wenn der spezielle Header enthalten ist, um die Verwundbarkeit zu bestätigen​.

    🚀 Ausgabeformatierung und Berichterstellung

    Die Ausgabe des Skripts sollte leicht lesbar und interpretierbar sein sowie optional in einer Datei gespeichert werden können. Wir werden die Konsolenausgabe mit klaren Überschriften und ggf. Einrückungen formatieren. Einige Überlegungen:

    • Nach dem Scan eine Zusammenfassung der Ergebnisse ausgeben. Beispiel: „Scan abgeschlossen: 3 anfällige Endpunkte gefunden (von 45 getesteten).“ Dann die anfälligen Endpunkte mit Details auflisten.

    • Verwenden Sie ein konsistentes Format für jede Ergebniszeile, wie oben gezeigt, möglicherweise mit [ANFÄLLIG]-Tags, um die Aufmerksamkeit zu lenken. Wenn eine Bibliothek wie rich verwendet wird, könnten wir „ANFÄLLIG“ sogar rot oder gelb einfärben. Auch ohne zusätzliche Bibliotheken können wir ANSI-Codes über colorama verwenden, um hervorzuheben, oder einfach Großbuchstaben.

    • Wenn keine Verwundbarkeiten gefunden werden, dies explizit angeben: „Keine Verwundbarkeiten für CVE-2025-29927 erkannt.“

    • Wenn die Ergebnisse gespeichert werden sollen, stellen Sie sicher, dass sie in einem ähnlichen Format wie auf dem Bildschirm in die Datei geschrieben werden. Möglicherweise in einer etwas ausführlicheren Form oder als CSV für die programmatische Verwendung, aber da der Benutzer speziell eine Textdatei erwähnte, werden wir wahrscheinlich einfach dieselben Zeilen in results.txt schreiben.

    • Auch kritische Fehler oder Ausnahmen (z. B. wenn eine bestimmte Seite nicht geladen werden kann) sollten in der Ausgabe auf elegante Weise gemeldet werden (anstatt eines Stacktrace). Wir können Ausnahmen abfangen und eine einzeilige Warnung pro fehlgeschlagener URL ausgeben: z. B. „Timeout beim Laden von /blog (übersprungen)“. So weiß der Benutzer, dass einige Pfade nicht getestet wurden.

    Während der Ausführung könnten wir einen Spinner oder Fortschritt anzeigen (bei langen Läufen) oder zumindest ausgeben, welche Seite gecrawlt oder welcher Endpunkt getestet wird, wenn der ausführliche Modus aktiviert ist. Für eine sauberere Ausgabe könnten wir nur die entdeckten anfälligen Fälle am Ende anzeigen, aber ein Laufprotokoll (vielleicht in eine separate Protokolldatei geschrieben) kann zur Transparenz beitragen.

    Angesichts der Betonung eines klaren Formats könnte die Verwendung von Aufzählungspunkten oder einer Tabelle beim Drucken mehrerer Ergebnisse hilfreich sein:

    • Wir könnten tabellarisch darstellen: Endpunkt | Basis-Status | Basis-Länge | Bypass-Status | Bypass-Länge | Headerwert verwendet | Ergebnis

    • Eine einfache Satzform könnte jedoch für eine breite Benutzergruppe lesbarer sein. Wir werden sicherstellen, dass jedes Ergebnis in einer neuen Zeile steht und klar beschriftet ist.

    Durch die Bereitstellung sowohl einer Bildschirmausgabe als auch einer optionalen Dateispeicherung ist das Tool sowohl für die interaktive Nutzung als auch für automatisiertes Scannen nützlich (bei dem der Benutzer die Datei später überprüfen oder in Berichte integrieren kann).

    🚀 Modularer Codeaufbau und bewährte Methoden

    Um das Skript wartbar und professionell zu gestalten, werden wir den Code in Module organisieren, die jeweils einen bestimmten Aspekt der Funktionalität behandeln. Eine mögliche Projektstruktur:

    • crawler.py: Enthält die Crawling-Logik mit Playwright. Es wird Funktionen wie crawl_site(start_url, config) -> List[str] geben, die eine Liste der entdeckten internen Pfade zurückgibt. Dieses Modul kümmert sich um das Starten des Browsers, das Abrufen von Seiten, das Extrahieren von Links und das Durchsetzen von Filtern (Domain, statische Dateiausschlüsse). Es könnte auch Hilfslogik zur Normalisierung von URLs enthalten (z. B. Entfernen von URL-Fragmenten, Verarbeitung relativer Pfade mittels urllib.parse.urljoin).

    • scanner.py: Enthält die Scan-Logik für die Verwundbarkeit. Es wird Funktionen wie scan_paths(url_list, config) -> List[ScanResult] enthalten. Dies verwaltet das Erstellen von HTTP-Anfragen (mit requests.Session oder einem httpx-Client), das Anwenden von Headern, das Vergleichen von Antworten und das Sammeln von Ergebnissen. Wenn Multithreading verwendet wird, würde dieses Modul den ThreadPool erstellen und Aufgaben verwalten. Es könnte eine kleine Datenklasse ScanResult definieren, um Informationen zu jedem Pfad zu speichern (Pfad, anfällig: bool, Details).

    • config.py (oder settings.py): Enthält Code für das Benutzermenü und die Konfiguration. Z. B. eine Funktion get_user_config(), die mit dem Benutzer interagiert und ein Konfigurationsobjekt/-wörterbuch mit allen gewählten Einstellungen (User-Agent, Timeout, Proxy, Ausgabedatei-Flag usw.) zurückgibt. Wenn CLI-Argumente verwendet werden, könnte dieses Modul alternativ argparse.ArgumentParser parsen. Im Wesentlichen isoliert dieser Teil alle Benutzereingaben und die Konfigurationshandhabung.

    • utils.py: Hilfsfunktionen, z. B. zum Drucken von Bannern, Formatieren von Ausgabezeichenfolgen, Behandeln von Farbausgabe oder gemeinsame Hilfsfunktionen wie is_static_resource(url) (um zu prüfen, ob eine URL wahrscheinlich auf eine statische Datei verweist). Könnte auch eine Funktion für das kontrollierte Herunterfahren enthalten (die bei SIGINT aufgerufen wird).

    • main.py: Das Einstiegsskript, das alles zusammenhält. Es wird:

      1. Benutzerkonfiguration parsen oder sammeln (mit config.py).
      1. Den Crawler aufrufen, um die Liste der Endpunkte zu erhalten.
      1. Den Scanner aufrufen, um diese Endpunkte zu testen.
      1. Ergebnisse empfangen und im angeforderten Format ausgeben.
      1. Sicherstellen, dass Bereinigung (Schließen des Browsers, Schließen von Dateien usw.) durchgeführt wird. Wenn das Skript als einzelne Datei verteilt wird, könnte main einfach am Ende einer Datei stehen, aber aus Gründen der Sauberkeit ist eine Aufteilung besser.

    Jedes Modul wird so gestaltet, dass es modular und wiederverwendbar ist. Beispielsweise könnte man crawler.py für andere Zwecke wiederverwenden, um Seitenlinks zu erhalten, oder scanner.py, um diese Verwundbarkeit an einer bestimmten Liste von URLs zu testen (sogar ohne Crawling).

    Ausnahmebehandlung und kontrolliertes Herunterfahren: Wir werden eine robuste Ausnahmebehandlung implementieren:

    • Netzwerkoperationen mit try/except umschließen (Timeouts, Verbindungsfehler usw. abfangen). Wenn das Crawlen einer Seite fehlschlägt, protokollieren und mit anderen fortfahren. Wenn eine Scan-Anfrage fehlschlägt (z. B. Proxy-Fehler), diesen Endpunkt als Fehler markieren, aber die restlichen Scans fortsetzen.

    • finally-Blöcke oder Kontextmanager verwenden, um sicherzustellen, dass Ressourcen freigegeben werden. Beispielsweise den Kontext async_playwright() verwenden oder sicherstellen, dass browser.close() am Ende des Crawlings aufgerufen wird. Ähnlich sicherstellen, dass Dateihandles nach dem Schreiben geschlossen werden.

    • KeyboardInterrupt (Strg+C) behandeln: Wir können den KeyboardInterrupt in der Hauptschleife abfangen und ein kontrolliertes Herunterfahren einleiten – z. B. „Stoppen, Aufräumen…“ ausgeben, Threads beenden (vielleicht durch Verwendung von ThreadPoolExecutor.shutdown(wait=False), um keine neuen Aufgaben zu starten) und den Browser schließen. Dies verhindert verwaiste Prozesse oder gesperrte Dateien, wenn der Benutzer abbricht.

    • Logging für Debug-Meldungen verwenden (vielleicht über die logging-Bibliothek von Python). In einem professionellen Tool hätte man Logging-Stufen; z. B. könnten Debug-Logs jede gesendete Anfrage enthalten, während die Info-Stufe nur den Fortschritt auf hoher Ebene anzeigt. Der Benutzer könnte ein ausführliches Flag setzen, um dies umzuschalten. Standardmäßig könnten wir minimale Informationen protokollieren, um die Ausgabe nicht zu überladen.

    Codequalität: Wir werden uns an bewährte Codierungspraktiken halten:

    • PEP8-Stilrichtlinien für Lesbarkeit befolgen.

    • Aussagekräftige Funktions- und Variablennamen verwenden.

    • Docstrings zu Funktionen hinzufügen, die deren Zweck und Verwendung erklären.

    • Typannotationen (Python 3-Typannotationen) für Funktionssignaturen verwenden, um den Code leichter verständlich zu machen und Typfehler frühzeitig zu erkennen.

    • Konstanten modularisieren (wie die Liste der Header-Payloads, Listen der zu ignorierenden statischen Dateierweiterungen usw.) am Anfang oder in einer Konfiguration, sodass sie leicht aktualisiert werden können. Beispiel: HEADER_PAYLOADS = ["middleware:middleware:...","src/middleware:..."] usw., an einem Ort definiert.

    • Möglicherweise Komponententests für einige Hilfsfunktionen einfügen (wenn dies ein größeres Projekt wäre, könnte dies für ein Einzelskript übersprungen werden; dennoch ist ein testbares Design von Vorteil).

    Professionelle Erweiterungen: Um das Skript robuster und produktionsreifer zu machen, können wir weiterhin Folgendes in Betracht ziehen:

    • Authentifizierungsunterstützung: Dem Benutzer erlauben, Cookies oder Anmeldeinformationen bereitzustellen, wenn er einen authentifizierten Abschnitt der Website scannen möchte (obwohl es bei der Verwundbarkeit um die Umgehung der Authentifizierung geht, könnte es Szenarien geben, in denen man sich zuerst anmelden muss, um bestimmte Links zu erreichen, um dann die Umgehung an diesen zu testen – obwohl die Umgehung vermutlich ohne gültige Authentifizierung funktioniert, könnte dies beim Crawlen von tiefen Links helfen, die nicht öffentlich sind).

    • Konfigurationsdatei: Anstelle von (oder zusätzlich zu) interaktiver Eingabe das Lesen von Optionen aus einer Konfigurationsdatei oder Umgebungsvariablen ermöglichen, was für automatisierte Bereitstellungen des Scanners nützlich ist.

    • Ausgabeformate: Ausgabe in mehreren Formaten wie JSON oder CSV zur Integration mit anderen Tools bereitstellen. Beispielsweise könnte ein --json-Flag die Ergebnisse als maschinenlesbares JSON ausgeben.

    • Integration mit bestehenden Frameworks: Die Logik könnte in ein größeres Scan-Framework integriert werden (z. B. als Modul für OWASP ZAP oder Integration mit ProjectDiscovery’s Nuclei durch Ausgabe eines kompatiblen Berichts). Stellen Sie zumindest sicher, dass die Ausgabe des Skripts die Verwundbarkeit und die betroffenen URLs klar identifiziert, sodass sie in Berichten verwendet werden kann.

    • Parallele Browser-Sitzungen: Bei sehr großen Anwendungen erwägen, mehrere Browser-Kontexte parallel für das Crawlen verschiedener Abschnitte zu starten. Playwright kann mehrere Kontexte verarbeiten (jeder Kontext ist isoliert, ähnlich wie separate Browserprofile)​. Dies könnte das Crawlen erheblich beschleunigen, jedoch auf Kosten eines höheren Ressourcenverbrauchs.

    • Kontrollierte Degradierung: Wenn Playwright fehlschlägt (z. B. der Umgebung fehlt ein Display oder die ordnungsgemäße Installation), könnte das Skript auf ein einfacheres requests-basiertes Crawlen zurückfallen (das möglicherweise einige Links verpasst, aber besser als nichts ist). Dies macht das Tool in verschiedenen Umgebungen robuster. Wenn die Parallelität zu hoch eingestellt ist und Probleme verursacht, diese abfangen und dem Benutzer vorschlagen, die Thread-Anzahl zu reduzieren.

    Durch das Befolgen einer sauberen Struktur und dieser bewährten Methoden wird das Skript leichter zu warten und zu erweitern sein. Jede Komponente kann unabhängig voneinander bearbeitet werden – z. B. die Verbesserung der Crawler-Fähigkeit, JavaScript-lastige Navigation zu parsen, oder die Aktualisierung des Scanners mit neuen Header-Payload-Varianten, falls zukünftige Forschung zusätzliche Exploit-Muster findet.

    Zusammenfassend beschreibt dieser Entwurf einen umfassenden Ansatz zur Erkennung von CVE-2025-29927 in Webanwendungen. Er nutzt einen Headless-Browser für tiefgehendes Crawlen, Multithreading für effizientes Scannen und robuste Codierungspraktiken für Zuverlässigkeit. Durch den Vergleich von Antworten mit und ohne den speziellen Header kann er zuverlässig anfällige Endpunkte identifizieren, bei denen die Next.js-Middleware umgangen wird​. Das Ergebnis ist ein professionelles Tool, das Sicherheitsingenieuren und Entwicklern hilft, diese kritische Verwundbarkeit in ihren Anwendungen schnell zu finden und zu beheben.