
Questo è uno scanner CVE-2025-29927.
Questo è uno scanner di livello professionale progettato per rilevare la vulnerabilità di bypass del middleware CVE-2025-29927 nelle applicazioni Next.js.
X-Middleware-Subrequest appositamente costruiti per bypassare il middleware di Next.jspip install -r requirements.txt playwright install
### Esegui lo scanner```bash
python main.py --domain https://example.com --threads 10 --timeout 10 --save
python main.py --help
| Option | Description |
|----------------|--------------------------------------------|
| `--domain` | URL base del sito di destinazione (obbligatorio) |
| `--user-agent` | User-agent personalizzato (predefinito: stringa Chrome) |
| `--timeout` | Timeout della richiesta (predefinito: 10 secondi) |
| `--proxy` | Indirizzo proxy (facoltativo) |
| `--save` | Salva i risultati in `results.txt` |
| `--threads` | Numero di thread (predefinito: 10) |
| `--wordlist` | Wordlist include percorsi comuni |
---
## 🐳 Utilizzo Docker
### Crea l'immagine Docker```bash
docker build -t cve-scanner .
docker run -it --rm cve-scanner --domain https://example.com --save
---
## ⚙️ GitHub Actions
Questo progetto include un workflow di GitHub Actions per testare la configurazione al push. Esso:
- Installa le dipendenze
- Installa i browser di Playwright
- Esegue un controllo `--help`
Vedi `.github/workflows/python.yml`.
---
## 🧱 Struttura```
.
├── main.py # Entry point
├── config.py # CLI parser
├── crawler.py # Playwright crawler
├── scanner.py # Multi-threaded vulnerability testing
├── requirements.txt
├── Dockerfile
└── .github/workflows
Panoramica della vulnerabilità CVE-2025-29927
CVE-2025-29927 è una grave falla di sicurezza di Next.js che consente agli attaccanti di bypassare l'autenticazione e l'autorizzazione basate su middleware. Includendo uno speciale header interno (X-Middleware-Subrequest) nelle richieste HTTP, un attaccante può ingannare il server Next.js facendogli saltare l'esecuzione del middleware, ottenendo così accesso a rotte protette. In pratica, una richiesta che normalmente sarebbe bloccata dal middleware di autenticazione (ad esempio restituendo un 401/403 o reindirizzando al login) viene elaborata normalmente se questo header è presente, bypassando di fatto i controlli di sicurezza. La vulnerabilità riguarda le versioni di Next.js dalla 11.1.4 alla 15.2.2, e gli amministratori sono invitati ad applicare patch o implementare mitigazioni (come rimuovere questo header a livello di proxy) per proteggere le proprie applicazioni.
Individuare questa vulnerabilità in un'applicazione web richiede di scoprire gli endpoint interni e testarli con l'header dannoso per verificare se è possibile un accesso non autorizzato. Di seguito viene presentato un piano di progettazione per uno script Python avanzato che esegue il crawling di un sito web target (con pieno supporto JavaScript) e cerca CVE-2025-29927, soddisfacendo tutti i requisiti specificati.
Per soddisfare il requisito di un crawling approfondito che includa contenuti renderizzati da JavaScript, utilizzeremo Playwright (preferito a Selenium per velocità e API moderna). Playwright è una potente libreria di automazione di browser headless in grado di gestire applicazioni web dinamiche e moderni framework JS. Rispetto a Selenium, Playwright offre un'API più moderna (basata su Chrome DevTools Protocol) e supporta sia l'operazione sincrona che asincrona, il che può garantire prestazioni migliori per il nostro caso d'uso. Le librerie chiave e le relative istruzioni di installazione includono:
playwright – per l'automazione di browser headless (per caricare SPA o pagine che richiedono JavaScript). (Installazione: pip install playwright ed eseguire playwright install per ottenere i binari del browser).
requests o httpx – per inviare richieste HTTP durante la fase di scansione. Possiamo usare requests per semplicità oppure httpx/aiohttp per il supporto asincrono. (Installazione: pip install requests oppure pip install httpx).
bs4 (BeautifulSoup) – per analizzare l'HTML ed estrarre i link quando necessario. Playwright può interrogare direttamente il DOM, ma usare BeautifulSoup sul contenuto HTML della pagina è semplice per trovare i tag anchor. (Installazione: pip install beautifulsoup4).
concurrent.futures (built-in) o asyncio – per implementare la concorrenza. Per il multi-threading, verrà usato concurrent.futures.ThreadPoolExecutor di Python (nessuna installazione aggiuntiva). Se si utilizza un approccio asincrono, si possono usare asyncio con httpx per richieste parallele.
(Opzionale) argparse – per analizzare gli argomenti della riga di comando se vogliamo un'interfaccia CLI invece di un menu interattivo. (modulo integrato)
(Opzionale) rich o colorama – per output console colorati o formattati, per migliorare la leggibilità. (Installazione: pip install rich oppure pip install colorama).
Motivazione: Playwright è stato scelto per la sua capacità di estrarre contenuti dinamici senza eccessive complessità. «Con Playwright possiamo automatizzare browser headless... per navigare sul web proprio come farebbe un essere umano, il che lo rende ideale per lo scraping di siti web dinamici basati su JavaScript». Questo garantisce che il nostro crawler possa vedere link o elementi UI generati dagli script (che un semplice crawler basato su requests non vedrebbe).
Il modulo crawler userà Playwright in modalità headless per eseguire un crawling approfondito del sito target. L'obiettivo è scoprire i percorsi interni (endpoint) da testare, inclusi quelli visibili solo dopo l'esecuzione di JavaScript. Punti chiave di progettazione del crawler:
Navigazione con browser headless: Avviare un'istanza del browser (ad es. Chromium) in modalità headless tramite Playwright. Usare un Browser Context con un User-Agent personalizzato se specificato dall'utente (maggiori dettagli nella prossima sezione). Ad esempio, possiamo creare un context con browser.new_context(user_agent=<user_agent_string>) per emulare lo User-Agent scelto. Se è configurato un proxy, applicarlo all'avvio (Playwright consente di impostare un server proxy quando si avvia il browser o il context).
Strategia di crawling ricorsivo: Partire da un URL di base (seed). Usare page.goto(base_url, timeout=<T>) per caricare la pagina (timeout configurabile). Attendere che la rete sia inattiva o un breve intervallo per consentire il caricamento dei contenuti dinamici, se necessario. Poi estrarre i link. Possiamo estrarre i link in due modi: