
La extensión de Joomla PhocaCommander es vulnerable a Path Traversal en la función getSource
PhocaCommander ≤ 6.1.3 — Path Traversal autenticado de administrador, sin CSRF requerido
Existe una vulnerabilidad de lectura arbitraria de archivos en el endpoint del editor de archivos de PhocaCommander. La función getSource() decodifica un parámetro filename codificado en base64 y lo pasa directamente a file_get_contents() sin comprobación de contención de ruta. Un administrador autenticado puede leer cualquier archivo accesible para el proceso del servidor web, incluidos archivos fuera de la raíz web (webroot), simplemente enviando una solicitud GET. No se requiere token CSRF.
La explotación filtra las credenciales de la base de datos de Joomla y la clave secreta desde configuration.php, y puede leer archivos del sistema como /etc/passwd mediante secuencias de path traversal (p. ej. ../../../../etc/passwd).
| 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: Sesión de administrador (no se requiere token CSRF: solicitud GET)
Archivo: administrator/components/com_phocacommander/models/phocacommanderedit.php
getSource() decodifica filename desde base64 y lo concatena directamente sobre JPATH_ROOT, y luego lee el archivo sin comprobación de contención:
PHOCACOMMANDEREDIT.PHP — CÓDIGO VULNERABLE
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() usa is_file(Path::clean($file)). Path::clean() normaliza las barras pero no elimina las secuencias ../, por lo que los traversals escapan de la raíz web sin control.
El código contiene getContainedRealPath() en helpers/phocacommander.php, que realiza una contención adecuada basada en realpath(). Lo llaman save() y download(), pero nunca se añadió a getSource(). Además, el método edit() del controlador se despacha vía GET, por lo que las comprobaciones estándar de token CSRF no aplican; una cookie de sesión de administrador activa es suficiente para desencadenar lecturas arbitrarias de archivos.
Autentíquese mediante la página de inicio de sesión de administrador para obtener una cookie de sesión válida. No se requieren privilegios adicionales más allá de una sesión de administrador estándar.
Envíe la siguiente solicitud GET con la ruta de traversal codificada en base64:
GET /administrator/index.php?option=com_phocacommander&task=phocacommanderedit.edit&filename=Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA==
Cookie: [admin session]
filename decodificado: Li4vLi4vLi4vLi4vZXRjL3Bhc3N3ZA== → ../../../../etc/passwd
Ruta resuelta: /var/www/html/../../../../etc/passwd = /etc/passwd
El editor muestra el contenido completo de /etc/passwd, lo que confirma el acceso de lectura fuera de la raíz web.
SOLICITUD / RESPUESTA
