
L'extension Joomla PhocaCommander est vulnérable à un Path Traversal dans l'action de téléversement de fichiers - CVSS 6.1
PhocaCommander ≤ 6.1.3 — Un administrateur authentifié peut écrire des fichiers hors de la racine web
Le gestionnaire de téléversement de fichiers de PhocaCommander construit le chemin de destination à partir d'un paramètre folder encodé en base64 et contrôlé par l'attaquant, sans aucune validation de confinement du chemin. Un administrateur authentifié peut téléverser des fichiers vers des emplacements arbitraires hors de la racine web, pourvu qu'ils soient accessibles en écriture par le processus du serveur web.
Confirmé en laboratoire : un téléversement avec folder=Li4vLi4vLi4vdG1w (= ) place le fichier téléversé dans — hors de — avec pour propriétaire . Dans les environnements PHP-FPM de production, cela peut être enchaîné pour obtenir une exécution de code à distance.
../../../tmp/tmp//var/www/html/www-data| 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/helpers/fileupload.php — realMultipleUpload()
realMultipleUpload() décode le paramètre POST folder depuis la base64 et le passe directement dans une concaténation Path::clean(), qui est ensuite utilisée comme destination de téléversement sans aucun contrôle de confinement.
FILEUPLOAD.PHP — CODE VULNÉRABLE
$folder = $app->getInput()->get('folder', '', '', 'string');
$folder = base64_decode($folder); // ← attacker-controlled
$path = JPATH_ROOT; // = /var/www/html
if (isset($folder) && $folder != '') {
$pathFolder = Path::clean($path . '/' . $folder . '/');
// e.g. Path::clean('/var/www/html/../../../tmp/')
// = '/tmp/' — outside the webroot, no error thrown
}
// ...
File::upload($file['tmp_name'], $pathFolder . strtolower($file['name']));
Path::clean() normalise les séparateurs de répertoires mais ne résout pas ni ne supprime les séquences ../. Le chemin résolu est passé directement à File::upload() sans contrôle de limite ultérieur.
Liste blanche des extensions de téléversement
Le gestionnaire impose une liste blanche d'extensions (images, documents, archives, fichiers texte) et bloque les types exécutables par le serveur tels que .php et .htaccess. Cependant, de nombreux types de fichiers autorisés par la liste blanche — notamment les scripts shell, les définitions de tâches cron et les fragments de configuration — peuvent causer des dommages importants lorsqu'ils sont écrits dans des chemins sensibles du système d'exploitation.
Authentifiez-vous via la page de connexion d'administration. Récupérez le jeton CSRF de Joomla depuis n'importe quelle page d'administration — il apparaît comme champ de formulaire masqué ou peut être extrait du code source de la page.

Envoyez une requête POST multipart vers POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload avec le contenu du fichier dans le champ file et le chemin de traversée encodé en base64 Li4vLi4vLi4vdG1w (= ../../../tmp) dans le champ folder. Le serveur répond avec HTTP 200 et {"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"}.
REQUÊTE / RÉPONSE

Le fichier est confirmé dans /tmp/upload_test.txt, avec pour propriétaire www-data, hors de /var/www/html/.

www-data peut recevoir un contenu choisi par l'attaquant, y compris des chemins utilisés par le planificateur du système, le démon SSH et d'autres services.txt contenant du code PHP combiné à un .user.ini (auto_prepend_file) dans un répertoire accessible via le web déclenche l'exécution PHP à la prochaine requête vers ce répertoire