
Upload di file arbitrario non autenticato -> RCE in WPLP Cookie Consent (gdpr-cookie-consent) <= 4.4.1 - write-up tecnico e PoC
Proof-of-concept e analisi tecnica per CVE-2026-75865, un upload arbitrario di file non autenticato che porta all'esecuzione remota di codice nel plugin WPLP Cookie Consent – Cookie Banner & Consent Management for GDPR, CCPA & Google Consent Mode per WordPress (slug gdpr-cookie-consent), che interessa tutte le versioni fino alla 4.4.1 inclusa.
| Fatti chiave |
|---|
| CVE | CVE-2026-75865 |
| Gravità | Critica — CVSS 3.1 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Debolezze | CWE-862 (Autorizzazione mancante) + CWE-434 (Upload illimitato di file con tipo pericoloso) |
| Versioni interessate | gdpr-cookie-consent ≤ 4.4.1 |
| Corretta in | 4.4.2 |
| Assegnatore CVE | Wordfence |
| Pubblicata | 2026-09-01 |
| Scoperta da | Supakiad S. (m3ez) |
Gli endpoint REST "connector" SaaS del plugin autenticano le richieste delegando all'applicazione SaaS del fornitore, che valida un JWT Bearer — ma il plugin controlla solo che l'endpoint di validazione risponda con HTTP 200. Non esiste alcun legame di proprietà tra il JWT e il sito di destinazione, quindi qualsiasi token valido emesso dal SaaS (ad es. da un account gratuito) viene accettato.
La funzione saas_upload_logo() scrive quindi un blob base64 fornito dall'attaccante nella directory pubblica wp-content/uploads/ con un nome file fornito dall'attaccante, senza alcuna validazione di contenuto o estensione. Il token API memorizzato (master_key) che protegge anche l'endpoint non è in realtà segreto: la rotta /store-auth del plugin stesso lo sovrascrive dai parametri della richiesta dopo lo stesso controllo JWT, quindi l'intera catena — dalla richiesta non autenticata a un payload eseguito nella root web — richiede solo un URL di destinazione e un account SaaS gratuito.
La vulnerabilità è stata corretta nella 4.4.2 rimuovendo completamente l'endpoint di upload e ristrutturando il modello di fiducia del connector (binding di proprietà del JWT, hash_equals(), firma HMAC delle richieste).
Analisi tecnica completa: REPORT.md
| File | Descrizione |
|---|---|
REPORT.md | Analisi tecnica dettagliata: analisi della causa principale con codice referenziato per riga, confronto della correzione 4.4.1 → 4.4.2, catena di sfruttamento, rilevamento e mitigazione |
cve_2026_75865.py | Script PoC — esegue la scansione di un elenco di target, rileva i siti vulnerabili ed esegue l'intera catena (enumerazione admin → sovrascrittura master-key → upload del payload → verifica) con output in tempo reale |
payload.php | Payload benigno minimale usato di default: stampa una stringa marcatore e supporta l'auto-rimozione (?delete=1) |
git clone https://github.com/ghostpels/CVE-2026-75865.git
cd CVE-2026-75865
pip install requests # colorama è opzionale (log colorati)
# 1. Salva un JWT SaaS valido (qualsiasi account su app.wplegalpages.com) in jwt.txt
# 2. Crea un elenco di target ed esegui solo contro sistemi che sei autorizzato a testare:
python cve_2026_75865.py -l targets.txt -o vuln.txt -t 40 --marker CVE-2026-75865-POC
Gli URL dei payload verificati vengono aggiunti a vuln.txt in tempo reale, uno per riga, non appena ogni target viene verificato.
| Opzione | Default | Descrizione |
|---|---|---|
-l, --list | (obbligatoria) | Elenco dei target, un URL per riga |
-o, --output | vuln.txt | URL dei payload verificati, aggiunti in tempo reale |
-t, --threads | 40 | Worker concorrenti |
--shell | payload.php | File payload accanto allo script; nome caricato = suo basename |
--filename | — | Nome file caricato personalizzato (la sua estensione viene provata per prima, poi --exts) |
--exts | php,phtml,php5,php74,php7,php3,php4,phar | Estensioni di fallback quando quella primaria è bloccata |
--jwt-file | jwt.txt | JWT SaaS, prima riga non vuota |
--marker | — | Stringa che deve comparire nella risposta del payload per essere considerato valido |
--timeout | 15 | Timeout per richiesta (secondi) |
-k, --insecure | off | Disabilita la verifica TLS |
-v, --verbose | off | Mostra i dettagli degli errori di connessione |
Questo repository è pubblicato esclusivamente per ricerca educativa e di sicurezza difensiva. Utilizza lo strumento esclusivamente contro sistemi di tua proprietà o per i quali hai esplicita autorizzazione scritta al test. L'autore non è responsabile di qualsiasi uso improprio o danno causato da questo materiale.