
L'estensione Joomla PhocaCommander è vulnerabile a Path Traversal nella funzione getSource - CVSS 8.2
PhocaCommander ≤ 6.1.3 — Path traversal amministrativo autenticato, nessun CSRF richiesto
Una vulnerabilità di lettura arbitraria dei file è presente nell'endpoint dell'editor di file di PhocaCommander. La funzione getSource() decodifica un parametro filename codificato in base64 e lo passa direttamente a file_get_contents() senza alcun controllo di contenimento del percorso. Un amministratore autenticato può leggere qualsiasi file accessibile al processo del server web - inclusi i file al di fuori della webroot - semplicemente inviando una richiesta GET. Non è richiesto alcun token CSRF.
L'attacco divulga le credenziali del database di Joomla e la chiave segreta da configuration.php, e può leggere file di sistema come /etc/passwd tramite sequenze di path traversal (ad es. ../../../../etc/passwd).
| COMPONENTE | VULNERABILE | TESTATO 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: Sessione amministratore (nessun token CSRF richiesto - richiesta GET)
File: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() decodifica filename da base64 e lo concatena direttamente a JPATH_ROOT, quindi legge il file senza alcun controllo di contenimento:
PHOCACOMMANDEREDIT.PHP — CODICE VULNERABILE
public function getSource($fileName) {
$fileName = base64_decode($fileName); // ← attacker-controlled
$item = new stdClass;
if (PhocaCommanderHelper::fileExists(JPATH_ROOT . '/' . $fileName)) {
$item->source = file_get_contents(JPATH_ROOT . '/' . $fileName); // ← no containment check
}
return $item;
}
fileExists() usa is_file(Path::clean($file)). Path::clean() normalizza gli slash ma non rimuove le sequenze ../, quindi i traversal fuoriescono dalla webroot senza controlli.
Il codebase contiene getContainedRealPath() in helpers/phocacommander.php che esegue un corretto contenimento basato su realpath(). Viene chiamata da save() e download() ma non è mai stata aggiunta a getSource(). Inoltre, il metodo edit() del controller viene invocato via GET, quindi i controlli standard del token CSRF non si applicano — un cookie di sessione amministratore attivo è sufficiente per innescare letture arbitrarie di file.
Autenticati tramite la pagina di login amministrativa per ottenere un cookie di sessione valido. Non sono richiesti privilegi aggiuntivi oltre a una sessione amministratore standard.
Invia la seguente richiesta GET con il percorso di traversal codificato in base64:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename decodificato: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
Percorso risolto: /var/www/html/../../../../etc/passwd = /etc/passwd
L'editor visualizza l'intero contenuto di /etc/passwd, confermando l'accesso in lettura fuori dalla webroot.
RICHIESTA / RISPOSTA
