
PoC didactique en Python 3 pour la CVE-2019-9053, une injection SQL aveugle basée sur le temps (time-based blind) dans CMS Made Simple <= 2.2.9. Cette version a été adaptée pour une utilisation en CTF/laboratoire, avec des préfixes préconfigurés afin de réduire le temps d'extraction et des messages explicatifs en portugais.
PoC didactique en Python 3 pour la CVE-2019-9053, une vulnérabilité de SQL Injection time-based blind dans CMS Made Simple <= 2.2.9.
Cette version a été modifiée pour une utilisation en CTF/laboratoire. Elle dispose de préfixes préconfigurés pour réduire le temps d'extraction et de messages explicatifs en portugais pour aider les étudiants à comprendre le fonctionnement de l'exploit.
Ce projet est destiné exclusivement à des fins éducatives, à des laboratoires contrôlés et à des environnements de CTF.
N'utilisez pas ce code contre des systèmes tiers sans autorisation explicite.
L'auteur de ce dépôt ne saurait être tenu responsable d'une mauvaise utilisation de ce matériel.
La CVE-2019-9053 affecte les anciennes versions de CMS Made Simple, permettant une injection SQL non authentifiée via le paramètre m1_idlist sur le endpoint :
/moduleinterface.php?mact=News,m1_,default,0
Comme la réponse de la requête SQL n'apparaît pas directement dans la page, l'exploit utilise une technique appelée time-based blind SQL Injection.
L'exploit envoie des payloads qui font exécuter sleep(1) à la base de données lorsqu'une condition est vraie.
Exemple conceptuel :
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
Si le serveur met du temps à répondre, le script comprend que le préfixe testé est correct.
Ainsi, il reconstruit caractère par caractère des informations sensibles, comme :
Dans cette version CTF, certains préfixes ont déjà été inclus dans le code pour réduire le temps nécessaire pendant l'activité.
Une injection SQL se produit lorsque l'application insère des données contrôlées par l'utilisateur dans une requête SQL sans traitement approprié.
Dans ce cas, l'injection est blind car le résultat de la requête n'apparaît pas directement dans la réponse HTTP.
Elle est time-based car l'attaquant utilise le temps de réponse du serveur comme canal de réponse. Si la condition testée est vraie, la base exécute un délai avec sleep(). Si elle est fausse, la réponse arrive normalement.
Exemple simplifié :
Question posée par l'exploit :
"Le hash du mot de passe commence-t-il par 0c01 ?"
Si oui :
La base exécute sleep(1), et la réponse est lente.
Si non :
La réponse arrive sans délai perceptible.
En répétant ce processus caractère par caractère, l'exploit parvient à reconstruire des valeurs de la base sans les voir directement dans la page.
Un salt est une valeur supplémentaire utilisée avec le mot de passe avant de générer le hash.
Dans ce défi, CMS Made Simple utilise une logique similaire à :
md5(salt + password)
Par exemple :
salt = 1dac0d92e9fa6bb2
password = exemplo123
Le hash serait calculé à partir de :
1dac0d92e9fa6bb2exemplo123
Le salt sert à compliquer les attaques par tables pré-calculées et à faire en sorte que des mots de passe identiques puissent générer des hashs différents dans des contextes différents.
Malgré cela, md5(salt + password) est une forme ancienne et faible de stockage de mots de passe. Les systèmes modernes doivent utiliser des algorithmes dédiés aux mots de passe, comme :
Cette version a été adaptée pour faciliter son utilisation lors d'une activité pratique.
Principaux changements :
Valeurs utilisées dans le défi :
Salt complet : 1dac0d92e9fa6bb2
Username : mitch
Email : [email protected]
Hash complet : 0c01f4468bd75d7a84c7eb73846e8d96
Préfixes configurés dans l'exploit :
Salt prefix : 1dac0d92
Username prefix : mit
Email prefix : admin@
Hash prefix : 0c01f446
Ces préfixes ne suppriment pas la logique de l'attaque. Ils réduisent simplement le temps nécessaire à l'activité en laboratoire.
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
Clonez le dépôt :
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
Créez un environnement virtuel :
python3 -m venv .venv
Activez l'environnement virtuel :
source .venv/bin/activate
Installez les dépendances :
pip install -r requirements.txt
Le fichier requirements.txt doit contenir :
requests
termcolor
Exécution simple :
python3 exploit_ctf.py -u http://target/cms
Exécution avec tentative de cassage du mot de passe à l'aide d'une wordlist :
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
Voir l'aide du script :
python3 exploit_ctf.py -h
Le fichier wordlist-example.txt peut contenir :
wrongpassword
admin123
dieema123
password
123456
[+] Salt da senha encontrado: 1dac0d92e9fa6bb2
[+] Username encontrado: mitch
[+] Email encontrado: [email protected]
[+] Hash da senha encontrado: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Senha encontrada: dieema123
Après que l'exploit a extrait le salt et le hash du mot de passe, il peut tenter de découvrir le mot de passe en clair à l'aide d'une wordlist.
La logique testée est :
md5(salt + senha_candidata)
Pour chaque mot de passe de la wordlist, le script calcule le hash et le compare avec le hash extrait de la base.
Exemple conceptuel :
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
Si le résultat est égal au hash extrait, le mot de passe a été trouvé.
La SQL Injection time-based est généralement lente, car chaque caractère doit être testé via plusieurs requêtes.
Cette version réduit le temps en utilisant :
Même ainsi, le temps peut varier en fonction de :
TIME_DELAY.S'il y a beaucoup de faux positifs ou de faux négatifs, augmentez la valeur de TIME_DELAY dans le code.
Version Python 3 modifiée pour CTF par Derick G. Andrighetti.
Basé sur un PoC public ancien en Python 2 publié à l'origine par Daniele Scanu, de Certimeter Group.
Usage éducatif.
Ce matériel a été produit à des fins d'étude, de démonstration en laboratoire et d'activités de CTF.