
Python exploit para CVE-2026-21627, una inclusión arbitraria de archivos PHP sin autenticación en el Framework Novarain de Joomla, que permite la carga de archivos, su eliminación y RCE.
Inclusión Arbitraria de Archivos sin Autenticación en el Framework Novarain de Joomla (nrframework)
Una vulnerabilidad crítica en el plugin Tassos/Novarain Framework (plg_system_nrframework) de Joomla permite a atacantes no autenticados incluir archivos PHP arbitrarios en el servidor, instanciar clases arbitrarias y encadenar con clases gadget integradas para lograr subida de archivos arbitrarios y eliminación de archivos arbitrarios — todo sin autenticación.
| ID CVE | CVE-2026-21627 |
| Puntuación CVSS | 9.5 (Crítico) |
| Plugin | plg_system_nrframework (Tassos Framework / Novarain Framework) |
| Versiones Vulnerables | 4.10.14 hasta 6.0.37 |
| Corregido En | 6.0.38+ |
| CMS | Joomla 3.x, 4.x, 5.x |
El plugin nrframework se incluye con varias extensiones populares de Joomla de Tassos.gr, incluyendo Convert Forms, Engage Box, Google Structured Data y otras.
El método ajaxTaskInclude() en nrframework.php está explícitamente incluido en la lista blanca para acceso frontal (no administrador) mediante el array $non_admin_tasks. Acepta tres parámetros controlados por el usuario:
path — utiliza el filtro de entrada RAW (cero sanitización, posible traversal de rutas)file — utiliza el filtro de entrada predeterminado de Joomlaclass — nombre de la clase a instanciar después de la inclusiónLa ruta concatenada $path . $file . '.php' se pasa directamente a @include_once, lo que permite la inclusión arbitraria de archivos PHP. Después de la inclusión, la clase especificada se instancia y su método onAJAX() se llama con parámetros controlados por el usuario.
| Primitiva | Gadget | Severidad | Descripción |
|---|---|---|---|
| Inclusión de Archivos | ajaxTaskInclude() | Crítico | Incluir cualquier archivo .php en el servidor |
| Eliminación de Archivos | JFormFieldNRInlineFileUpload::onRemove() | Crítico | unlink() sin validación de ruta — eliminar cualquier archivo escribible por el servidor web |
| Subida de Archivos | JFormFieldNRInlineFileUpload::onUpload() | Alto | Subir archivos de texto a cualquier directorio escribible accesible por web |
| Divulgación de Rutas | Respuesta de subida | Medio | Ruta completa del sistema de archivos filtrada en la respuesta JSON |
python3 cve_2026_21627.py --target <URL> --mode <MODO> [OPCIONES]
| Modo | Descripción | Riesgo |
|---|---|---|
verify | Confirmar que la vulnerabilidad existe | Seguro / Solo lectura |
upload | Subir un archivo a un directorio controlado | Medio |
delete | Eliminar un archivo arbitrario en el servidor | Destructivo |
rce | Intentar la cadena RCE completa (subida + ejecución) | Alto |
info | Incluir archivo PHP arbitrario para reconocimiento | Medio |
Verificar vulnerabilidad:
python3 cve_2026_21627.py --target https://example.com --mode verify
Subir archivo de prueba de concepto:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
Subir shell SSI (requiere mod_include de Apache):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
Intentar cadena RCE:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
Eliminar un archivo (destructivo):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t URL objetivo (obligatorio)
--mode, -m Modo de explotación: verify|upload|delete|rce|info (obligatorio)
--sef-prefix Prefijo de URL SEF de Joomla (predeterminado: /it/)
--delay Retraso entre solicitudes en segundos (predeterminado: 2.5)
--proxy Proxy HTTP (p. ej. http://127.0.0.1:8080)
--no-ssl-verify Deshabilitar verificación de certificado SSL
Modo de subida:
--shell-type Tipo de archivo: shtml|csv|txt|html (predeterminado: shtml)
--upload-dir Directorio de subida relativo a JPATH_ROOT (predeterminado: images)
--custom-content Contenido personalizado del archivo a subir
Modo de eliminación:
--file-path Ruta completa en el servidor del archivo a eliminar
Modo RCE:
--cmd Comando a ejecutar (predeterminado: id)
Modo info:
--php-path Ruta del archivo PHP relativa a JPATH_SITE
--php-file Nombre del archivo PHP sin extensión .php
--php-class Clase PHP a instanciar
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ Atacante │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (enrutador AJAX) │ │ │
│ task=include │ │ include está en │ │ path = entrada RAW │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (sin autenticación)│ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (clase gadget) │
│ │
│ onAjax() ──> onUpload() [ESCRIBIR]│
│ ──> onRemove() [ELIMINAR]│
└─────────────────────────────────────┘
include se llama con un path controlado (filtro RAW = sin sanitización) que apunta al archivo gadget.JFormFieldNRInlineFileUpload proporciona onUpload() para escrituras de archivos y onRemove() para eliminaciones de archivos, ambas con validación de entrada insuficiente.requestspip install requests
Monitoree los registros de acceso para detectar intentos de explotación:
# Patrón de registro Apache/Nginx
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
Regla WAF — Bloquear solicitudes que coincidan con:
option=com_ajax.*plugin=nrframework.*task=include.*path=
Auditoría posterior al compromiso:
images/ y otros directorios escribibles para detectar archivos inesperadosconfiguration.php y .htaccess@include_onceajaxTaskInclude() por completo y lo reemplaza con un registro estricto de manejadores (AjaxHandlerRegistry)| Fecha | Evento |
|---|---|
| 2026-02 | Vulnerabilidad descubierta durante prueba de penetración autorizada |
| 2026-02 | Se creó el exploit |
| 2026-02 | Divulgación pública |
Esta herramienta se proporciona solo para pruebas de seguridad autorizadas y fines educativos. Utilice este exploit únicamente contra sistemas para los que tenga permiso escrito explícito de prueba. El acceso no autorizado a sistemas informáticos es ilegal. El autor no asume ninguna responsabilidad por el uso indebido.
Yallasec — yallasec.com
Arcangelo Saracino — @arkango