
L'estensione Joomla PhocaCommander è vulnerabile a Path Traversal nelle azioni delete, copy, move.
PhocaCommander ≤ 6.1.3 — Admin autenticato manipola file al di fuori della webroot
Il gestore delle azioni sui file in PhocaCommander costruisce i percorsi di origine e destinazione a partire da parametri codificati in base64 controllati dall'attaccante (pathfrom, pathwhere) senza alcuna validazione di contenimento del percorso. Un amministratore autenticato può eliminare, copiare e spostare file ovunque nel filesystem accessibile al processo del server web.
Confermato in laboratorio: eliminazione di un file in /tmp/ (fuori dalla webroot) e copia di /etc/passwd nel file manager di PhocaCommander — rendendo il suo contenuto leggibile tramite l'editor integrato. Tutte e tre le operazioni (elimina, copia, sposta) condividono lo stesso percorso di codice non validato.
| COMPONENTE | VULNERABILI | TESTATA SU | CORRETTA |
|---|---|---|---|
| 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/views/phocacommanderactiona/view.json.php
La vista delle azioni decodifica pathfrom e pathwhere da base64 e li concatena direttamente a JPATH_ROOT senza alcun controllo di contenimento. Questi percorsi non validati vengono poi utilizzati in tutte e tre le operazioni sui file:
VIEW.JSON.PHP — COSTRUZIONE DEL PERCORSO VULNERABILE
// Both parameters decoded from base64 — no containment check
$pathFrom = JPATH_ROOT . '/' . base64_decode($this->t['pathfrom']) . '/';
$pathWhere = JPATH_ROOT . '/' . base64_decode($this->t['pathwhere']) . '/';
// Delete — removes any file reachable by www-data
$srcValue = $pathFrom . $v;
if (PhocaCommanderHelper::fileExists($srcValue)) {
File::delete($srcValue);
}
// Copy / Move — arbitrary cross-directory file operations
File::copy($pathFrom . $v, $pathWhere . $v);
File::move($pathFrom . $v, $pathWhere . $v);
PhocaCommanderHelper::fileExists() usa is_file(Path::clean($file)). Path::clean() normalizza gli slash ma non rimuove le sequenze ../, quindi le sequenze di traversal in entrambi i parametri si risolvono in percorsi arbitrari del filesystem senza alcun controllo.
Un file di test viene creato in /tmp/poc.txt di proprietà di www-data, confermando che il target esiste prima dell'operazione di eliminazione.

Autenticarsi tramite la pagina di login admin. Recuperare il token del modulo Joomla — appare come campo di input nascosto in qualsiasi pagina admin.

Parametri decodificati:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → nome file poc.txtRICHIESTA / RISPOSTA


Riutilizzare la sessione admin dello Scenario 1 oppure autenticarsi di nuovo per ottenere un nuovo token CSRF.
Parametri decodificati:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → nome file passwdRICHIESTA / RISPOSTA

/etc/passwd è ora presente all'interno della webroot in phoca-files/passwd, di proprietà di www-data.

Navigare nel file manager di PhocaCommander nel pannello admin, aprire phoca-files/, fare clic sul file passwd e poi su Modifica per visualizzarne il contenuto nell'editor CodeMirror integrato. Il contenuto completo di /etc/passwd viene visualizzato:

www-data fuori dalla webroot può essere rimosso definitivamente, inclusi config di applicazioni, file di lock e cron job di altri servizi/etc/shadow, chiavi private, file .env di altre applicazioni) nella webroot li rende raggiungibili via HTTP senza alcuna ulteriore azione