
L'extension Joomla PhocaCommander est vulnérable au Path Traversal dans les actions de suppression, copie et déplacement - CVSS 6.4
PhocaCommander ≤ 6.1.3 — Un administrateur authentifié manipule des fichiers en dehors de la racine web
Le gestionnaire d'actions de fichiers de PhocaCommander construit les chemins source et destination à partir de paramètres encodés en base64 contrôlés par l'attaquant (pathfrom, pathwhere) sans aucune validation de confinement du chemin. Un administrateur authentifié peut supprimer, copier et déplacer des fichiers n'importe où sur le système de fichiers accessible au processus du serveur web.
Confirmé en laboratoire : suppression d'un fichier dans /tmp/ (hors de la racine web) et copie de /etc/passwd dans le gestionnaire de fichiers PhocaCommander — rendant son contenu lisible via l'éditeur intégré. Les trois opérations (suppression, copie, déplacement) partagent le même chemin de code non validé.
| 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 : Administrateur (session + jeton CSRF)
Fichier : administrator/components/com_phocacommander/views/phocacommanderactiona/view.json.php
La vue d'action décode pathfrom et pathwhere depuis la base64 et les concatène directement à JPATH_ROOT sans aucune vérification de confinement. Ces chemins non validés sont ensuite utilisés dans les trois opérations sur les fichiers :
VIEW.JSON.PHP — CONSTRUCTION DE CHEMIN VULNÉRABLE
// 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() utilise is_file(Path::clean($file)). Path::clean() normalise les barres obliques mais ne supprime pas les séquences ../ ; les séquences de traversée dans l'un ou l'autre paramètre aboutissent donc à des chemins du système de fichiers arbitraires, sans vérification.
Un fichier de test est créé dans /tmp/poc.txt appartenant à www-data, confirmant que la cible existe avant l'opération de suppression.

Authentifiez-vous via la page de connexion admin. Récupérez le jeton de formulaire Joomla — il apparaît comme champ de saisie masqué sur toute page d'administration.

Paramètres décodés :
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → nom de fichier poc.txtREQUÊTE / RÉPONSE


Réutilisez la session admin du scénario 1 ou authentifiez-vous à nouveau pour obtenir un jeton CSRF frais.
Paramètres décodés :
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → nom de fichier passwdREQUÊTE / RÉPONSE

/etc/passwd est désormais présent dans la racine web à phoca-files/passwd, appartenant à www-data.

Naviguez vers le gestionnaire de fichiers PhocaCommander dans le panneau d'administration, ouvrez phoca-files/, cliquez sur le fichier passwd, puis cliquez sur Modifier pour afficher son contenu dans l'éditeur CodeMirror intégré. Le contenu complet de /etc/passwd est rendu :

www-data hors de la racine web peut être définitivement supprimé, y compris les configurations d'applications, les fichiers de verrouillage et les tâches cron d'autres services/etc/shadow, clés privées, fichiers .env d'autres applications) dans la racine web les rend accessibles via HTTP sans aucune action supplémentaire