
La extensión de Joomla PhocaCommander es vulnerable a Path Traversal en la acción de carga de archivos - CVSS 6.1
PhocaCommander ≤ 6.1.3 — Administrador autenticado escribe archivos fuera de la raíz web
El controlador de carga de archivos en PhocaCommander construye la ruta de destino a partir de un parámetro folder codificado en base64 y controlado por el atacante, sin ninguna validación de contención de rutas. Un administrador autenticado puede subir archivos a ubicaciones arbitrarias fuera de la raíz web que sean escribibles por el proceso del servidor web.
Confirmado en el laboratorio: al cargar con folder=Li4vLi4vLi4vdG1w (= ../../../tmp) el archivo subido se coloca en — fuera de — propiedad de . En entornos de producción con PHP-FPM, esto puede encadenarse para lograr ejecución remota de código.
/tmp//var/www/html/www-data| COMPONENTE | VULNERABLE | PROBADO EN | CORREGIDO |
|---|---|---|---|
| PhocaCommander | 1.0.0 – 6.1.3 | Joomla 5.4.7 + PhocaCommander 6.1.3 (PHP 8.2 / Apache) | 6.1.4 |
Autenticación requerida: Administrador (sesión + token CSRF)
Archivo: administrator/components/com_phocacommander/helpers/fileupload.php — realMultipleUpload()
realMultipleUpload() decodifica el parámetro POST folder desde base64 y lo pasa directamente a una concatenación Path::clean(), que se utiliza como destino de carga sin ninguna comprobación de contención.
FILEUPLOAD.PHP — CÓDIGO VULNERABLE
$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() normaliza los separadores de directorio pero no resuelve ni elimina las secuencias ../. La ruta resultante se pasa directamente a File::upload() sin ninguna comprobación posterior de límites.
Lista blanca de extensiones de carga
El controlador aplica una lista blanca de extensiones (imágenes, documentos, comprimidos, archivos de texto) y bloquea los tipos ejecutables por el servidor, como .php y .htaccess. Sin embargo, muchos tipos de archivo permitidos por la lista blanca — incluyendo scripts de shell, definiciones de tareas cron y fragmentos de configuración — pueden causar daños significativos si se escriben en rutas sensibles del sistema operativo.
Autentíquese a través de la página de inicio de sesión de administración. Recupere el token CSRF de Joomla desde cualquier página de administración — aparece como un campo de formulario oculto o puede extraerse del código fuente de la página.

Envíe una solicitud POST multiparte a POST /administrator/index.php?option=com_phocacommander&task=phocacommanderupload.multipleupload con el contenido del archivo en el campo file y la ruta de traversal codificada en base64 Li4vLi4vLi4vdG1w (= ../../../tmp) en el campo folder. El servidor responde con HTTP 200 y {"jsonrpc":"2.0","result":"OK","code":200,"message":"Success: ","details":"Files uploaded"}.
SOLICITUD / RESPUESTA

Se confirma que el archivo se encuentra en /tmp/upload_test.txt, propiedad de www-data, fuera de /var/www/html/.

www-data puede recibir contenido elegido por el atacante, incluidas rutas utilizadas por el planificador del sistema operativo, el demonio SSH y otros servicios.txt que contenga código PHP combinado con un .user.ini (auto_prepend_file) a un directorio accesible por web provoca la ejecución de PHP en la siguiente solicitud a ese directorio