
CVE-2026-23491 - InvoicePlane tiene un Path Traversal no autenticado en Guest Controller
| Campo | Detalles |
|---|---|
| ID de CVE | CVE-2026-23491 |
| Gravedad | CRÍTICA |
| Aviso | Ver aviso |
| Descubierto por | Lukasz Rybak |
Existe una vulnerabilidad de path traversal en el método get_file del controlador Get del módulo Guest en InvoicePlane v1.6.3. La vulnerabilidad permite a atacantes no autenticados leer archivos arbitrarios en el servidor manipulando el nombre de archivo de entrada. Esto conduce a la divulgación de información sensible, incluidos archivos de configuración con credenciales de base de datos.
La vulnerabilidad se encuentra en el archivo application/modules/guest/controllers/Get.php, específicamente dentro de la función get_file.
La función acepta un parámetro $filename directamente desde la URL. Realiza urldecode($filename) pero no sanea la entrada para detectar secuencias de directory traversal (p. ej., ../). El nombre de archivo saneado se concatena luego con un directorio base ($this->targetPath, que apunta a uploads/customer_files/) y se pasa a la función readfile().
Fragmento de código vulnerable:
public function get_file($filename): void
{
$filename = urldecode($filename);
if ( ! file_exists($this->targetPath . $filename)) {
$ref = isset($_SERVER['HTTP_REFERER']) ? ', Referer:' . $_SERVER['HTTP_REFERER'] : '';
$this->respond_message(404, 'upload_error_file_not_found', $this->targetPath . $filename . $ref);
}
// ... headers setting content type and disposition ...
readfile($this->targetPath . $filename);
}
Debido a que $filename está controlado por el usuario y no se verifica, un atacante puede proporcionar una cadena como ../../ipconfig.php para salir del directorio previsto.
El siguiente comando cURL demuestra la lectura del archivo ipconfig.php (que se encuentra dos directorios por encima del directorio predeterminado uploads/customer_files/):
curl http://localhost/index.php/guest/get/get_file/..%2f..%2fipconfig.php
Salida esperada:
El servidor responde con el contenido de ipconfig.php, que incluye variables de entorno sensibles como DB_PASSWORD y ENCRYPTION_KEY.
Los atacantes pueden leer la configuración de la aplicación, el código fuente y potencialmente otros archivos del sistema legibles por el usuario del servidor web.
Este CVE se divulgó de forma responsable siguiendo prácticas de divulgación coordinada de vulnerabilidades. La información aquí proporcionada tiene fines exclusivamente educativos y defensivos.