
Die Joomla-Erweiterung PhocaCommander ist anfällig für Path Traversal bei den Aktionen Löschen, Kopieren und Verschieben – CVSS 6.4
PhocaCommander ≤ 6.1.3 — Authentifizierter Admin manipuliert Dateien außerhalb des Webroot
Der Dateiaktions-Handler in PhocaCommander konstruiert Quell- und Zielpfade aus angreiferkontrollierten, base64-kodierten Parametern (pathfrom, pathwhere) ohne jegliche Pfad-Containment-Validierung. Ein authentifizierter Administrator kann Dateien überall auf dem Dateisystem löschen, kopieren und verschieben, auf das der Webserver-Prozess Zugriff hat.
Im Labor bestätigt: Löschen einer Datei unter (außerhalb des Webroot) und Kopieren von in den PhocaCommander-Dateimanager – wodurch der Inhalt über den integrierten Editor lesbar wird. Alle drei Operationen (Löschen, Kopieren, Verschieben) nutzen denselben unvalidierten Codepfad.
/tmp//etc/passwd| COMPONENT | VULNERABLE | TESTED ON | FIXED |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
Erforderliche Authentifizierung: Administrator (Sitzung + CSRF-Token)
Datei: administrator/components/com_phocacommander/views/phocacommanderactiona/view.json.php
Die Aktions-Ansicht dekodiert pathfrom und pathwhere aus Base64 und hängt sie direkt an JPATH_ROOT an, ohne eine Containment-Prüfung durchzuführen. Diese unvalidierten Pfade werden dann in allen drei Dateioperationen verwendet:
VIEW.JSON.PHP — VERWUNDBARE PFADKONSTRUKTION
// 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() verwendet is_file(Path::clean($file)). Path::clean() normalisiert Schrägstriche, entfernt jedoch keine ../-Sequenzen, sodass Traversal-Sequenzen in jedem Parameter ungeprüft zu beliebigen Dateisystempfaden aufgelöst werden.
Eine Testdatei wird unter /tmp/poc.txt mit Eigentümer www-data erstellt, was bestätigt, dass das Ziel vor dem Löschvorgang existiert.

Authentifizieren Sie sich über die Admin-Loginseite. Rufen Sie das Joomla-Formulartoken ab – es erscheint als verstecktes Eingabefeld auf jeder Admin-Seite.

Dekodierte Parameter:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → Dateiname poc.txtANFRAGE / ANTWORT


Verwenden Sie die Admin-Sitzung aus Szenario 1 erneut oder authentifizieren Sie sich erneut, um ein frisches CSRF-Token zu erhalten.
Dekodierte Parameter:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → Dateiname passwdANFRAGE / ANTWORT

/etc/passwd ist jetzt im Webroot unter phoca-files/passwd vorhanden, Eigentümer www-data.

Navigieren Sie im Administrationspanel zum PhocaCommander-Dateimanager, öffnen Sie phoca-files/, klicken Sie auf die Datei passwd und dann auf Bearbeiten, um den Inhalt im integrierten CodeMirror-Editor anzuzeigen. Der vollständige Inhalt von /etc/passwd wird angezeigt:

www-data außerhalb des Webroot beschreibbar ist, kann dauerhaft entfernt werden, einschließlich Anwendungskonfigurationen, Sperrdateien und Cron-Jobs anderer Dienste/etc/shadow, private Schlüssel, .env-Dateien anderer Anwendungen) in das Webroot macht sie ohne weitere Maßnahmen über HTTP erreichbar