
PoC didático em Python 3 para a CVE-2019-9053, uma SQL Injection time-based blind no CMS Made Simple <= 2.2.9. Esta versão foi adaptada para uso em CTF/laboratório, com prefixos pré-configurados para reduzir o tempo de extração e mensagens explicativas em português.
PoC didático em Python 3 para a CVE-2019-9053, uma vulnerabilidade de SQL Injection time-based blind no CMS Made Simple <= 2.2.9.
Esta versão foi modificada para uso em CTF/laboratório. Ela possui prefixos pré-configurados para reduzir o tempo de extração e mensagens explicativas em português para ajudar estudantes a entenderem o funcionamento do exploit.
Este projeto é destinado exclusivamente para fins educacionais, laboratórios controlados e ambientes de CTF.
Não utilize este código contra sistemas de terceiros sem autorização explícita.
O autor deste repositório não se responsabiliza pelo uso indevido deste material.
A CVE-2019-9053 afeta versões antigas do CMS Made Simple, permitindo SQL Injection não autenticada através do parâmetro m1_idlist no endpoint:
/moduleinterface.php?mact=News,m1_,default,0
Como a resposta da consulta SQL não aparece diretamente na página, o exploit utiliza uma técnica chamada time-based blind SQL Injection.
O exploit envia payloads que fazem o banco de dados executar sleep(1) quando uma condição é verdadeira.
Exemplo conceitual:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
Se o servidor demora para responder, o script entende que o prefixo testado está correto.
Assim, ele reconstrói informações sensíveis caractere por caractere, como:
Nesta versão de CTF, alguns prefixos já foram incluídos no código para reduzir o tempo necessário durante a atividade.
Uma SQL Injection ocorre quando a aplicação insere dados controlados pelo usuário dentro de uma consulta SQL sem tratamento adequado.
Neste caso, a injeção é blind porque o resultado da consulta não aparece diretamente na resposta HTTP.
Ela é time-based porque o atacante usa o tempo de resposta do servidor como canal de resposta. Se a condição testada for verdadeira, o banco executa um atraso com sleep(). Se for falsa, a resposta vem normalmente.
Exemplo simplificado:
Pergunta feita pelo exploit:
"O hash da senha começa com 0c01?"
Se sim:
O banco executa sleep(1), e a resposta demora.
Se não:
A resposta vem sem atraso perceptível.
Repetindo esse processo caractere por caractere, o exploit consegue reconstruir valores do banco mesmo sem vê-los diretamente na página.
Um salt é um valor extra usado junto com a senha antes de gerar o hash.
Neste desafio, o CMS Made Simple usa uma lógica semelhante a:
md5(salt + password)
Por exemplo:
salt = 1dac0d92e9fa6bb2
password = exemplo123
O hash seria calculado a partir de:
1dac0d92e9fa6bb2exemplo123
O salt serve para dificultar ataques com tabelas pré-computadas e para fazer com que senhas iguais possam gerar hashes diferentes em contextos diferentes.
Apesar disso, md5(salt + password) é uma forma antiga e fraca de armazenamento de senhas. Sistemas modernos devem usar algoritmos próprios para senhas, como:
Esta versão foi adaptada para facilitar o uso em uma atividade prática.
Principais mudanças:
Valores usados no desafio:
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: [email protected]
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
Prefixos configurados no exploit:
Salt prefix: 1dac0d92
Username prefix: mit
Email prefix: admin@
Hash prefix: 0c01f446
Esses prefixos não removem a lógica do ataque. Eles apenas reduzem o tempo necessário para a atividade em laboratório.
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
Clone o repositório:
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
Crie um ambiente virtual:
python3 -m venv .venv
Ative o ambiente virtual:
source .venv/bin/activate
Instale as dependências:
pip install -r requirements.txt
O arquivo requirements.txt deve conter:
requests
termcolor
Execução simples:
python3 exploit_ctf.py -u http://target/cms
Execução com tentativa de quebra da senha usando wordlist:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
Ver ajuda do script:
python3 exploit_ctf.py -h
O arquivo wordlist-example.txt pode conter:
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
Depois que o exploit extrai o salt e o hash da senha, ele pode tentar descobrir a senha em texto claro usando uma wordlist.
A lógica testada é:
md5(salt + senha_candidata)
Para cada senha da wordlist, o script calcula o hash e compara com o hash extraído do banco.
Exemplo conceitual:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
Se o resultado for igual ao hash extraído, a senha foi encontrada.
Time-based SQL Injection costuma ser lenta, porque cada caractere precisa ser testado por várias requisições.
Esta versão reduz o tempo usando:
Mesmo assim, o tempo pode variar de acordo com:
TIME_DELAY.Se houver muitos falsos positivos ou falsos negativos, aumente o valor de TIME_DELAY no código.
Versão Python 3 modificada para CTF por Derick G. Andrighetti.
Baseado em um PoC público antigo em Python 2 originalmente publicado por Daniele Scanu, da Certimeter Group.
Uso educacional.
Este material foi produzido para fins de estudo, demonstração em laboratório e atividades de CTF.