
L'extension Joomla PhocaCommander est vulnérable à un Path Traversal dans la fonction getSource.
PhocaCommander ≤ 6.1.3 — Traversée de chemin admin authentifiée, sans CSRF requis
Une vulnérabilité de lecture arbitraire de fichiers existe dans le point de terminaison de l'éditeur de fichiers de PhocaCommander. La fonction getSource() décode un paramètre filename encodé en base64 et le transmet directement à file_get_contents() sans aucun contrôle de confinement de chemin. Un administrateur authentifié peut lire n'importe quel fichier accessible au processus du serveur web — y compris les fichiers situés hors de la racine web — en envoyant simplement une requête GET. Aucun jeton CSRF n'est requis.
L'exploitation divulgue les identifiants de base de données et la clé secrète de Joomla depuis configuration.php, et permet de lire des fichiers système tels que /etc/passwd via des séquences de traversée de chemin (par exemple ../../../../etc/passwd).
| COMPOSANT | VULNÉRABLE | TESTÉ SUR | CORRIGÉ |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
Authentification requise : Session administrateur (aucun jeton CSRF requis — requête GET)
Fichier : administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() décode filename depuis le base64 et le concatène directement à JPATH_ROOT, puis lit le fichier sans aucun contrôle de confinement :
PHOCACOMMANDEREDIT.PHP — CODE VULNÉRABLE
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() utilise is_file(Path::clean($file)). Path::clean() normalise les barres obliques mais n'élimine pas les séquences ../, de sorte que les traversées sortent de la racine web sans être détectées.
La base de code contient getContainedRealPath() dans helpers/phocacommander.php, qui effectue un confinement correct basé sur realpath(). Elle est appelée par save() et download() mais n'a jamais été ajoutée à getSource(). De plus, la méthode edit() du contrôleur est déclenchée via GET, de sorte que les contrôles standard de jeton CSRF ne s'appliquent pas — un cookie de session admin actif suffit pour déclencher des lectures arbitraires de fichiers.
Authentifiez-vous via la page de connexion admin pour obtenir un cookie de session valide. Aucun privilège supplémentaire au-delà d'une session admin standard n'est requis.
Envoyez la requête GET suivante avec le chemin de traversée encodé en base64 :
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename décodé : Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
Chemin résolu : /var/www/html/../../../../etc/passwd = /etc/passwd
L'éditeur affiche le contenu complet de /etc/passwd, confirmant un accès en lecture hors de la racine web.
REQUÊTE / RÉPONSE
