
L'estensione Joomla PhocaCommander è vulnerabile a Path Traversal nell'azione di caricamento dei file.
PhocaCommander ≤ 6.1.3 — L'Admin Autenticato Scrive File Fuori dalla Webroot
L'handler di upload dei file in PhocaCommander costruisce il percorso di destinazione a partire da un parametro folder codificato in base64 e controllabile dall'attaccante, senza alcuna validazione di contenimento del percorso. Un amministratore autenticato può caricare file in posizioni arbitrarie fuori dalla webroot, purché scrivibili dal processo del web server.
Confermato in laboratorio: caricando con folder=Li4vLi4vLi4vdG1w (= ../../../tmp) il file caricato viene posizionato in /tmp/ — fuori da /var/www/html/ — con proprietario www-data. In ambienti PHP-FPM di produzione, questa vulnerabilità può essere concatenata per ottenere l'esecuzione remota di codice.
| COMPONENTE | VULNERABILE | TESTATO SU | CORRETTO |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
Autenticazione richiesta: Amministratore (sessione + token CSRF)
File: administrator/components/com_phocacommander/helpers/fileupload.php — realMultipleUpload()
realMultipleUpload() decodifica il parametro POST folder da base64 e lo passa direttamente a una concatenazione con Path::clean(), che viene poi usata come destinazione dell'upload senza alcun controllo di contenimento.
FILEUPLOAD.PHP — CODICE VULNERABILE
$folder = $app->getInput()->get('folder', '', '', 'string');
$folder = base64_decode($folder); // ← attacker-controlled
$path = JPATH_ROOT; // = /var/www/html
if (isset($folder) && $folder != '') {
$pathFolder = Path::clean($path . '/' . $folder . '/');
// e.g. Path::clean('/var/www/html/../../../tmp/')
// = '/tmp/' — outside the webroot, no error thrown
}
// ...
File::upload($file['tmp_name'], $pathFolder . strtolower($file['name']));
Path::clean() normalizza i separatori di directory ma non risolve né rimuove le sequenze ../. Il percorso risultante viene passato direttamente a File::upload() senza alcun successivo controllo dei limiti.
Allowlist delle estensioni di upload
L'handler applica un'allowlist delle estensioni (immagini, documenti, archivi, file di testo) e blocca i tipi eseguibili dal server come .php e .htaccess. Tuttavia, molti tipi di file consentiti dalla whitelist — inclusi script di shell, definizioni di cron job e frammenti di configurazione — possono causare danni significativi se scritti in percorsi sensibili del sistema operativo.
Autenticati tramite la pagina di login dell'admin. Recupera il token CSRF di Joomla da qualsiasi pagina di amministrazione: appare come campo nascosto del modulo oppure può essere estratto dal sorgente della pagina.

Invia una richiesta POST multipart a POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload con il contenuto del file nel campo file e il percorso di traversal codificato in base64 Li4vLi4vLi4vdG1w (= ../../../tmp) nel campo folder. Il server risponde con HTTP 200 e {"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"}.
RICHIESTA / RISPOSTA

Il file viene confermato in /tmp/upload_test.txt, con proprietario www-data, fuori da /var/www/html/.

www-data può ricevere contenuti scelti dall'attaccante, inclusi percorsi usati dallo scheduler del sistema operativo, dal demone SSH e da altri servizi.txt contenente codice PHP combinato con un .user.ini (auto_prepend_file) in una directory accessibile via web innesca l'esecuzione di PHP alla successiva richiesta verso quella directory