
Python exploit per CVE-2026-21627, un'inclusione arbitraria di file PHP non autenticata nel framework Novarain di Joomla, che consente upload, eliminazione di file e RCE.
Inclusione Arbitraria di File Non Autenticata nel Framework Novarain di Joomla (nrframework)
Una vulnerabilità critica nel plugin Joomla Tassos/Novarain Framework (plg_system_nrframework) consente ad attaccanti non autenticati di includere file PHP arbitrari sul server, istanziare classi arbitrarie e concatenare con classi gadget integrate per ottenere upload arbitrario di file e cancellazione arbitraria di file — il tutto senza autenticazione.
| ID CVE | CVE-2026-21627 |
| Punteggio CVSS | 9.5 (Critico) |
| Plugin | plg_system_nrframework (Tassos Framework / Novarain Framework) |
| Versioni Vulnerabili | dalla 4.10.14 alla 6.0.37 |
| Corretto In | 6.0.38+ |
| CMS | Joomla 3.x, 4.x, 5.x |
Il plugin nrframework è incluso in diverse estensioni Joomla popolari di Tassos.gr, tra cui Convert Forms, Engage Box, Google Structured Data e altre.
Il metodo ajaxTaskInclude() in nrframework.php è esplicitamente inserito nella whitelist per l'accesso frontend (non-admin) tramite l'array $non_admin_tasks. Accetta tre parametri controllabili dall'utente:
path — utilizza il filtro di input RAW (zero sanitizzazione, path traversal possibile)file — utilizza il filtro di input predefinito di Joomlaclass — nome della classe da istanziare dopo l'inclusioneIl percorso concatenato $path . $file . '.php' viene passato direttamente a @include_once, consentendo l'inclusione arbitraria di file PHP. Dopo l'inclusione, la classe specificata viene istanziata e il suo metodo onAJAX() viene chiamato con parametri controllabili dall'utente.
| Primitiva | Gadget | Gravità | Descrizione |
|---|---|---|---|
| Inclusione File | ajaxTaskInclude() | Critico | Include qualsiasi file .php sul server |
| Cancellazione File | JFormFieldNRInlineFileUpload::onRemove() | Critico | unlink() senza validazione del percorso — cancella qualsiasi file scrivibile dal server web |
| Upload File | JFormFieldNRInlineFileUpload::onUpload() | Alto | Carica file di testo in qualsiasi directory scrivibile accessibile dal web |
| Divulgazione Percorso | Risposta di upload | Medio | Percorso completo del filesystem divulgato nella risposta JSON |
python3 cve_2026_21627.py --target <URL> --mode <MODO> [OPZIONI]
| Modalità | Descrizione | Rischio |
|---|---|---|
verify | Conferma l'esistenza della vulnerabilità | Sicuro / Sola lettura |
upload | Carica un file in una directory controllata | Medio |
delete | Cancella un file arbitrario sul server | Distruttivo |
rce | Tenta la catena RCE completa (upload + esecuzione) | Alto |
info | Include un file PHP arbitrario per ricognizione | Medio |
Verifica della vulnerabilità:
python3 cve_2026_21627.py --target https://example.com --mode verify
Upload di un file proof-of-concept:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
Upload di una shell SSI (richiede Apache mod_include):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
Tentativo di catena RCE:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
Cancellazione di un file (distruttivo):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t URL di destinazione (obbligatorio)
--mode, -m Modalità di exploit: verify|upload|delete|rce|info (obbligatorio)
--sef-prefix Prefisso URL SEF di Joomla (predefinito: /it/)
--delay Ritardo tra le richieste in secondi (predefinito: 2.5)
--proxy Proxy HTTP (es. http://127.0.0.1:8080)
--no-ssl-verify Disabilita la verifica del certificato SSL
Modalità upload:
--shell-type Tipo di file: shtml|csv|txt|html (predefinito: shtml)
--upload-dir Directory di upload relativa a JPATH_ROOT (predefinito: images)
--custom-content Contenuto personalizzato del file da caricare
Modalità delete:
--file-path Percorso completo sul server del file da cancellare
Modalità RCE:
--cmd Comando da eseguire (predefinito: id)
Modalità info:
--php-path Percorso del file PHP relativo a JPATH_SITE
--php-file Nome del file PHP senza estensione .php
--php-class Classe PHP da istanziare
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ Attaccante │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (router AJAX) │ │ │
│ task=include │ │ include è in │ │ path = input RAW │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (nessuna auth) │ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (classe gadget) │
│ │
│ onAjax() ──> onUpload() [SCRITTURA]│
│ ──> onRemove() [CANCELLA]│
└─────────────────────────────────────┘
include viene chiamato con un path controllato (filtro RAW = nessuna sanitizzazione) che punta al file gadget.JFormFieldNRInlineFileUpload fornisce onUpload() per la scrittura di file e onRemove() per la cancellazione di file, entrambi con validazione dell'input insufficiente.requestspip install requests
Monitorare i log di accesso per tentativi di exploit:
# Pattern di log Apache/Nginx
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
Regola WAF — Bloccare le richieste che corrispondono a:
option=com_ajax.*plugin=nrframework.*task=include.*path=
Audit post-compromissione:
images/ e altre directory scrivibili per file inattesiconfiguration.php e .htaccess@include_onceajaxTaskInclude() e lo sostituisce con un registro di handler rigoroso (AjaxHandlerRegistry)| Data | Evento |
|---|---|
| 2026-02 | Vulnerabilità scoperta durante un penetration test autorizzato |
| 2026-02 | Creato l'exploit |
| 2026-02 | Divulgazione pubblica |
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. Utilizzare questo exploit solo contro sistemi per i quali si dispone di esplicita autorizzazione scritta. L'accesso non autorizzato a sistemi informatici è illegale. L'autore non si assume alcuna responsabilità per un uso improprio.
Yallasec — yallasec.com
Arcangelo Saracino — @arkango