
Die Joomla-Erweiterung PhocaCommander ist in der Funktion getSource anfällig für Path Traversal – CVSS 8.2
PhocaCommander ≤ 6.1.3 – Pfad-Traversal für authentifizierte Administratoren, kein CSRF erforderlich
Im Endpunkt des Datei-Editors von PhocaCommander existiert eine Schwachstelle, die das beliebige Lesen von Dateien (Arbitrary File Read) ermöglicht. Die Funktion getSource() dekodiert einen base64-kodierten filename-Parameter und übergibt ihn direkt an file_get_contents() – ohne eine Pfad-Eingrenzungsprüfung. Ein authentifizierter Administrator kann jede Datei lesen, die für den Webserver-Prozess zugänglich ist – einschließlich Dateien außerhalb des Webroots –, indem er einfach eine GET-Anfrage sendet. Es ist kein CSRF-Token erforderlich.
Durch die Ausnutzung werden die Datenbank-Zugangsdaten von Joomla und der geheime Schlüssel aus configuration.php offengelegt. Darüber hinaus können Systemdateien wie /etc/passwd über Pfad-Traversal-Sequenzen (z. B. ../../../../etc/passwd) gelesen werden.
| KOMPONENTE | VERWUNDBAR | GETESTET AUF | BEHOBEN |
|---|---|---|---|
| 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 (kein CSRF-Token erforderlich – GET-Anfrage)
Datei: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() dekodiert filename aus Base64 und hängt es direkt an JPATH_ROOT an. Anschließend wird die Datei ohne Eingrenzungsprüfung gelesen:
PHOCACOMMANDEREDIT.PHP – VERWUNDBARER CODE
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() verwendet is_file(Path::clean($file)). Path::clean() normalisiert Schrägstriche, entfernt jedoch keine ../-Sequenzen – Traversal-Pfade können das Webroot daher ungehindert verlassen.
Der Code enthält getContainedRealPath() in helpers/phocacommander.php, das eine korrekte Eingrenzung basierend auf realpath() durchführt. Es wird von save() und download() aufgerufen, wurde jedoch nie in getSource() integriert. Zudem wird die edit()-Methode des Controllers über GET ausgelöst, sodass die standardmäßigen CSRF-Token-Prüfungen nicht greifen – ein aktives Admin-Sitzungs-Cookie genügt, um beliebige Dateilesevorgänge auszulösen.
Melden Sie sich über die Admin-Anmeldeseite an, um ein gültiges Sitzungs-Cookie zu erhalten. Über eine normale Admin-Sitzung hinaus sind keine weiteren Berechtigungen erforderlich.
Senden Sie die folgende GET-Anfrage mit dem base64-kodierten Traversal-Pfad:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename dekodiert: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
Aufgelöster Pfad: /var/www/html/../../../../etc/passwd = /etc/passwd
Der Editor zeigt den vollständigen Inhalt von /etc/passwd an, was den Lesezugriff außerhalb des Webroots bestätigt.
ANFRAGE / ANTWORT
