
PoC didáctico en Python 3 para CVE-2019-9053, una SQL Injection time-based blind en CMS Made Simple <= 2.2.9. Esta versión fue adaptada para uso en CTF/laboratorio, con prefijos preconfigurados para reducir el tiempo de extracción y mensajes explicativos en portugués.
PoC didáctico en Python 3 para la CVE-2019-9053, una vulnerabilidad de SQL Injection time-based blind en CMS Made Simple <= 2.2.9.
Esta versión ha sido modificada para uso en CTF/laboratorio. Posee prefijos preconfigurados para reducir el tiempo de extracción y mensajes explicativos en español para ayudar a estudiantes a entender el funcionamiento del exploit.
Este proyecto está destinado exclusivamente para fines educativos, laboratorios controlados y entornos de CTF.
No utilice este código contra sistemas de terceros sin autorización explícita.
El autor de este repositorio no se responsabiliza por el uso indebido de este material.
La CVE-2019-9053 afecta versiones antiguas de CMS Made Simple, permitiendo SQL Injection no autenticado a través del parámetro m1_idlist en el endpoint:
/moduleinterface.php?mact=News,m1_,default,0
Como la respuesta de la consulta SQL no aparece directamente en la página, el exploit utiliza una técnica llamada time-based blind SQL Injection.
El exploit envía payloads que hacen que la base de datos ejecute sleep(1) cuando una condición es verdadera.
Ejemplo conceptual:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
Si el servidor tarda en responder, el script entiende que el prefijo probado es correcto.
Así, reconstruye información sensible carácter por carácter, como:
En esta versión de CTF, algunos prefijos ya han sido incluidos en el código para reducir el tiempo necesario durante la actividad.
Una SQL Injection ocurre cuando la aplicación inserta datos controlados por el usuario dentro de una consulta SQL sin un tratamiento adecuado.
En este caso, la inyección es blind porque el resultado de la consulta no aparece directamente en la respuesta HTTP.
Es time-based porque el atacante usa el tiempo de respuesta del servidor como canal de respuesta. Si la condición probada es verdadera, la base de datos ejecuta un retardo con sleep(). Si es falsa, la respuesta llega normalmente.
Ejemplo simplificado:
Pregunta que hace el exploit:
"¿El hash de la contraseña comienza con 0c01?"
Si es así:
La base de datos ejecuta sleep(1), y la respuesta tarda.
Si no:
La respuesta llega sin retardo perceptible.
Repitiendo este proceso carácter por carácter, el exploit logra reconstruir valores de la base de datos aunque no los vea directamente en la página.
Un salt es un valor extra que se usa junto con la contraseña antes de generar el hash.
En este desafío, CMS Made Simple usa una lógica similar a:
md5(salt + password)
Por ejemplo:
salt = 1dac0d92e9fa6bb2
password = ejemplo123
El hash se calcularía a partir de:
1dac0d92e9fa6bb2ejemplo123
El salt sirve para dificultar ataques con tablas precomputadas y para hacer que contraseñas iguales puedan generar hashes diferentes en contextos distintos.
A pesar de eso, md5(salt + password) es una forma antigua y débil de almacenamiento de contraseñas. Los sistemas modernos deben usar algoritmos diseñados para contraseñas, como:
Esta versión ha sido adaptada para facilitar su uso en una actividad práctica.
Principales cambios:
Valores usados en el desafío:
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: [email protected]
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
Prefijos configurados en el exploit:
Salt prefix: 1dac0d92
Username prefix: mit
Email prefix: admin@
Hash prefix: 0c01f446
Estos prefijos no eliminan la lógica del ataque. Solo reducen el tiempo necesario para la actividad en laboratorio.
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
Clone el repositorio:
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
Cree un entorno virtual:
python3 -m venv .venv
Active el entorno virtual:
source .venv/bin/activate
Instale las dependencias:
pip install -r requirements.txt
El archivo requirements.txt debe contener:
requests
termcolor
Ejecución simple:
python3 exploit_ctf.py -u http://target/cms
Ejecución con intento de descifrado de la contraseña usando wordlist:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
Ver ayuda del script:
python3 exploit_ctf.py -h
El archivo wordlist-example.txt puede contener:
wrongpassword
admin123
dieema123
password
123456
[+] Salt de la contraseña encontrado: 1dac0d92e9fa6bb2
[+] Username encontrado: mitch
[+] Email encontrado: [email protected]
[+] Hash de la contraseña encontrado: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Contraseña encontrada: dieema123
Después de que el exploit extrae el salt y el hash de la contraseña, puede intentar descubrir la contraseña en texto claro usando una wordlist.
La lógica probada es:
md5(salt + contraseña_candidata)
Para cada contraseña de la wordlist, el script calcula el hash y lo compara con el hash extraído de la base de datos.
Ejemplo conceptual:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
Si el resultado es igual al hash extraído, la contraseña ha sido encontrada.
Time-based SQL Injection suele ser lenta, porque cada carácter debe ser probado mediante varias peticiones.
Esta versión reduce el tiempo usando:
Aun así, el tiempo puede variar según:
TIME_DELAY.Si hay muchos falsos positivos o falsos negativos, aumente el valor de TIME_DELAY en el código.
Versión Python 3 modificada para CTF por Derick G. Andrighetti.
Basado en un PoC público antiguo en Python 2 originalmente publicado por Daniele Scanu, de Certimeter Group.
Uso educativo.
Este material fue producido con fines de estudio, demostración en laboratorio y actividades de CTF.