
Exploit Python pour CVE-2026-21627, une inclusion arbitraire de fichier PHP non authentifiée dans le framework Novarain de Joomla, permettant le téléchargement, la suppression de fichiers et l'exécution de code à distance (RCE).
Inclusion Arbitraire de Fichiers Non Authentifiée dans le Framework Novarain de Joomla (nrframework)
Une vulnérabilité critique dans le plugin Joomla Tassos/Novarain Framework (plg_system_nrframework) permet à des attaquants non authentifiés d'inclure des fichiers PHP arbitraires sur le serveur, d'instancier des classes arbitraires et d'enchaîner avec des classes gadget intégrées pour réaliser un téléversement de fichiers arbitraire et une suppression de fichiers arbitraire — le tout sans authentification.
| ID CVE | CVE-2026-21627 |
| Score CVSS | 9.5 (Critique) |
| Plugin | plg_system_nrframework (Tassos Framework / Novarain Framework) |
| Versions vulnérables | 4.10.14 à 6.0.37 |
| Corrigé dans | 6.0.38+ |
| CMS | Joomla 3.x, 4.x, 5.x |
Le plugin nrframework est fourni avec plusieurs extensions Joomla populaires de Tassos.gr, notamment Convert Forms, Engage Box, Google Structured Data, et d'autres.
La méthode ajaxTaskInclude() dans nrframework.php est explicitement autorisée pour l'accès frontal (non-admin) via le tableau $non_admin_tasks. Elle accepte trois paramètres contrôlés par l'utilisateur :
path — utilise le filtre d'entrée RAW (aucune désinfection, traversée de chemin possible)file — utilise le filtre d'entrée Joomla par défautclass — nom de la classe à instancier après l'inclusionLe chemin concaténé $path . $file . '.php' est passé directement à @include_once, permettant l'inclusion arbitraire de fichiers PHP. Après l'inclusion, la classe spécifiée est instanciée et sa méthode onAJAX() est appelée avec des paramètres contrôlés par l'utilisateur.
| Primitive | Gadget | Sévérité | Description |
|---|---|---|---|
| Inclusion de fichier | ajaxTaskInclude() | Critique | Inclure n'importe quel fichier .php sur le serveur |
| Suppression de fichier | JFormFieldNRInlineFileUpload::onRemove() | Critique | unlink() sans validation de chemin — supprimer tout fichier accessible en écriture par le serveur web |
| Téléversement de fichier | JFormFieldNRInlineFileUpload::onUpload() | Élevée | Téléverser des fichiers texte vers tout répertoire accessible en écriture et accessible via le web |
| Divulgation de chemin | Réponse de téléversement | Moyenne | Chemin complet du système de fichiers divulgué dans la réponse JSON |
python3 cve_2026_21627.py --target <URL> --mode <MODE> [OPTIONS]
| Mode | Description | Risque |
|---|---|---|
verify | Confirmer que la vulnérabilité existe | Sûr / Lecture seule |
upload | Téléverser un fichier vers un répertoire contrôlé | Moyen |
delete | Supprimer un fichier arbitraire sur le serveur | Destructif |
rce | Tenter la chaîne RCE complète (téléversement + exécution) | Élevé |
info | Inclure un fichier PHP arbitraire pour la reconnaissance | Moyen |
Vérifier la vulnérabilité :
python3 cve_2026_21627.py --target https://example.com --mode verify
Téléverser un fichier de preuve de concept :
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
Téléverser un shell SSI (nécessite Apache mod_include) :
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
Tenter la chaîne RCE :
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
Supprimer un fichier (destructif) :
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t URL cible (requis)
--mode, -m Mode d'exploitation : verify|upload|delete|rce|info (requis)
--sef-prefix Préfixe d'URL SEF Joomla (défaut : /it/)
--delay Délai entre les requêtes en secondes (défaut : 2.5)
--proxy Proxy HTTP (ex. http://127.0.0.1:8080)
--no-ssl-verify Désactiver la vérification du certificat SSL
Mode upload :
--shell-type Type de fichier : shtml|csv|txt|html (défaut : shtml)
--upload-dir Répertoire de téléversement relatif à JPATH_ROOT (défaut : images)
--custom-content Contenu personnalisé du fichier à téléverser
Mode delete :
--file-path Chemin complet sur le serveur du fichier à supprimer
Mode RCE :
--cmd Commande à exécuter (défaut : id)
Mode info :
--php-path Chemin du fichier PHP relatif à JPATH_SITE
--php-file Nom du fichier PHP sans l'extension .php
--php-class Classe PHP à instancier
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ Attaquant │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (routeur AJAX) │ │ │
│ task=include │ │ include est dans │ │ path = entrée RAW │
│ path=... │ │ $non_admin_tasks │ │ @include_once $path │
│ file=... │ │ (aucune auth req.)│ │ new $class()->onAJAX│
│ class=... │ └───────────────────┘ └──────────┬──────────┘
└──────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (classe gadget) │
│ │
│ onAjax() ──> onUpload() [ÉCRITURE]│
│ ──> onRemove() [SUPPR.] │
└─────────────────────────────────────┘
include est appelée avec un path contrôlé (filtre RAW = aucune désinfection) pointant vers le fichier gadget.JFormFieldNRInlineFileUpload incluse fournit onUpload() pour les écritures de fichiers et onRemove() pour les suppressions de fichiers, toutes deux avec une validation d'entrée insuffisante.requestspip install requests
Surveillez les journaux d'accès pour détecter les tentatives d'exploitation :
# Modèle de journal Apache/Nginx
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
Règle WAF — Bloquer les requêtes correspondant à :
option=com_ajax.*plugin=nrframework.*task=include.*path=
Audit post-compromission :
images/ et les autres répertoires accessibles en écriture pour détecter des fichiers inattendusconfiguration.php et .htaccess@include_onceajaxTaskInclude() et le remplace par un registre de gestionnaires strict (AjaxHandlerRegistry)| Date | Événement |
|---|---|
| 2026-02 | Vulnérabilité découverte lors d'un test d'intrusion autorisé |
| 2026-02 | Création de l'exploit |
| 2026-02 | Divulgation publique |
Cet outil est fourni uniquement pour des tests de sécurité autorisés et à des fins éducatives. N'utilisez cet exploit que contre des systèmes pour lesquels vous disposez d'une autorisation écrite explicite. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas d'utilisation abusive.
Yallasec — yallasec.com
Arcangelo Saracino — @arkango