
PoC didattico in Python 3 per la CVE-2019-9053, una SQL Injection time-based blind nel CMS Made Simple <= 2.2.9. Questa versione è stata adattata per l'uso in CTF/laboratorio, con prefissi preconfigurati per ridurre il tempo di estrazione e messaggi esplicativi in portoghese.
PoC didattico in Python 3 per la CVE-2019-9053, una vulnerabilità di SQL Injection time-based blind in CMS Made Simple <= 2.2.9.
Questa versione è stata modificata per l'uso in CTF/laboratorio. Possiede prefissi preconfigurati per ridurre il tempo di estrazione e messaggi esplicativi in portoghese per aiutare gli studenti a capire il funzionamento dell'exploit.
Questo progetto è destinato esclusivamente a fini educativi, laboratori controllati e ambienti CTF.
Non utilizzare questo codice contro sistemi di terze parti senza autorizzazione esplicita.
L'autore di questo repository non si assume responsabilità per l'uso improprio di questo materiale.
La CVE-2019-9053 colpisce versioni obsolete di CMS Made Simple, consentendo SQL Injection non autenticata tramite il parametro m1_idlist nell'endpoint:
/moduleinterface.php?mact=News,m1_,default,0
Poiché la risposta della query SQL non appare direttamente sulla pagina, l'exploit utilizza una tecnica chiamata time-based blind SQL Injection.
L'exploit invia payload che fanno eseguire al database sleep(1) quando una condizione è vera.
Esempio concettuale:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
Se il server ritarda la risposta, lo script capisce che il prefisso testato è corretto.
Così, ricostruisce informazioni sensibili carattere per carattere, come:
In questa versione CTF, alcuni prefissi sono già stati inclusi nel codice per ridurre il tempo necessario durante l'attività.
Una SQL Injection si verifica quando l'applicazione inserisce dati controllati dall'utente all'interno di una query SQL senza un adeguato trattamento.
In questo caso, l'iniezione è blind perché il risultato della query non appare direttamente nella risposta HTTP.
È time-based perché l'attaccante usa il tempo di risposta del server come canale di risposta. Se la condizione testata è vera, il database esegue un ritardo con sleep(). Se è falsa, la risposta arriva normalmente.
Esempio semplificato:
Domanda posta dall'exploit:
"L'hash della password inizia con 0c01?"
Se sì:
Il database esegue sleep(1), e la risposta ritarda.
Se no:
La risposta arriva senza ritardo percepibile.
Ripetendo questo processo carattere per carattere, l'exploit riesce a ricostruire i valori del database anche senza vederli direttamente sulla pagina.
Un salt è un valore aggiuntivo usato insieme alla password prima di generare l'hash.
In questa sfida, CMS Made Simple utilizza una logica simile a:
md5(salt + password)
Per esempio:
salt = 1dac0d92e9fa6bb2
password = esempio123
L'hash verrebbe calcolato da:
1dac0d92e9fa6bb2esempio123
Il salt serve a rendere più difficili gli attacchi con tabelle precalcolate e a far sì che password identiche possano generare hash diversi in contesti diversi.
Nonostante ciò, md5(salt + password) è una forma obsoleta e debole di memorizzazione delle password. I sistemi moderni dovrebbero utilizzare algoritmi specifici per password, come:
Questa versione è stata adattata per facilitare l'uso in un'attività pratica.
Principali modifiche:
Valori usati nella sfida:
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: [email protected]
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
Prefissi configurati nell'exploit:
Salt prefix: 1dac0d92
Username prefix: mit
Email prefix: admin@
Hash prefix: 0c01f446
Questi prefissi non rimuovono la logica dell'attacco. Riducono solo il tempo necessario per l'attività in laboratorio.
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
Clona il repository:
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
Crea un ambiente virtuale:
python3 -m venv .venv
Attiva l'ambiente virtuale:
source .venv/bin/activate
Installa le dipendenze:
pip install -r requirements.txt
Il file requirements.txt deve contenere:
requests
termcolor
Esecuzione semplice:
python3 exploit_ctf.py -u http://target/cms
Esecuzione con tentativo di cracking della password usando wordlist:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
Visualizza aiuto dello script:
python3 exploit_ctf.py -h
Il file wordlist-example.txt può contenere:
wrongpassword
admin123
dieema123
password
123456
[+] Salt della password trovato: 1dac0d92e9fa6bb2
[+] Username trovato: mitch
[+] Email trovato: [email protected]
[+] Hash della password trovato: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Password trovata: dieema123
Dopo che l'exploit ha estratto il salt e l'hash della password, può tentare di scoprire la password in chiaro utilizzando una wordlist.
La logica testata è:
md5(salt + password_candidata)
Per ogni password della wordlist, lo script calcola l'hash e lo confronta con l'hash estratto dal database.
Esempio concettuale:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
Se il risultato è uguale all'hash estratto, la password è stata trovata.
La SQL Injection time-based è solitamente lenta, perché ogni carattere deve essere testato tramite molteplici richieste.
Questa versione riduce il tempo usando:
Tuttavia, il tempo può variare in base a:
TIME_DELAY.Se ci sono molti falsi positivi o falsi negativi, aumenta il valore di TIME_DELAY nel codice.
Versione Python 3 modificata per CTF da Derick G. Andrighetti.
Basato su un vecchio PoC pubblico in Python 2 originariamente pubblicato da Daniele Scanu, di Certimeter Group.
Uso educativo.
Questo materiale è stato prodotto per scopi di studio, dimostrazione in laboratorio e attività CTF.