
La extensión de Joomla PhocaCommander es vulnerable a Path Traversal en las acciones de eliminar, copiar y mover.
PhocaCommander ≤ 6.1.3 — Administrador autenticado manipula archivos fuera de la raíz web
El manejador de acciones de archivos en PhocaCommander construye rutas de origen y destino a partir de parámetros codificados en base64 controlados por el atacante (pathfrom, pathwhere) sin ninguna validación de contención de rutas. Un administrador autenticado puede eliminar, copiar y mover archivos en cualquier lugar del sistema de archivos accesible para el proceso del servidor web.
Confirmado en el laboratorio: eliminar un archivo en /tmp/ (fuera de la raíz web) y copiar /etc/passwd al administrador de archivos de PhocaCommander — haciendo que su contenido sea legible mediante el editor integrado. Las tres operaciones (eliminar, copiar, mover) comparten la misma ruta de código sin validar.
| 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/views/phocacommanderactiona/view.json.php
La vista de acción decodifica pathfrom y pathwhere desde base64 y los concatena directamente sobre JPATH_ROOT sin comprobación de contención de rutas. Estas rutas sin validar se utilizan luego en las tres operaciones de archivos:
VIEW.JSON.PHP — CONSTRUCCIÓN DE RUTA VULNERABLE
// 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() utiliza is_file(Path::clean($file)). Path::clean() normaliza las barras pero no elimina las secuencias ../, por lo que las secuencias de traversal en cualquiera de los parámetros se resuelven en rutas arbitrarias del sistema de archivos sin verificar.
Se crea un archivo de prueba en /tmp/poc.txt propiedad de www-data, lo que confirma que el objetivo existe antes de la operación de eliminación.

Autentíquese mediante la página de inicio de sesión de administración. Recupere el token de formulario de Joomla: aparece como un campo de entrada oculto en cualquier página de administración.

Parámetros decodificados:
pathfrom=Li4vLi4vLi4vdG1w → ../../..tmp → /tmp/selfiles[0]=file|cG9jLnR4dA== → nombre de archivo poc.txtSOLICITUD / RESPUESTA


Reutilice la sesión de administrador del Escenario 1 o autentíquese nuevamente para obtener un token CSRF nuevo.
Parámetros decodificados:
pathfrom=Li4vLi4vLi4vLi4vZXRj → ../../../../etc → /etc/pathwhere=cGhvY2EtZmlsZXM= → phoca-files → /var/www/html/phoca-files/selfiles[0]=file|cGFzc3dk → nombre de archivo passwdSOLICITUD / RESPUESTA

/etc/passwd ahora está presente dentro de la raíz web en phoca-files/passwd, propiedad de www-data.

Navegue al administrador de archivos de PhocaCommander en el panel de administración, abra phoca-files/, haga clic en el archivo passwd y luego en Edit (Editar) para ver su contenido en el editor CodeMirror integrado. El contenido completo de /etc/passwd se muestra:

www-data fuera de la raíz web puede eliminarse permanentemente, incluidos archivos de configuración de aplicaciones, archivos de bloqueo y tareas cron de otros servicios/etc/shadow, claves privadas, archivos .env de otras aplicaciones) a la raíz web los hace accesibles vía HTTP sin ninguna acción adicional