StoryChief <= 1.0.42 - Caricamento Arbitrario di File Non Autenticato
🚨 StoryChief <= 1.0.42 — Caricamento Arbitrario di File Non Autenticato (CVE-2025-7441)
ℹ️ Riepilogo
Le versioni di StoryChief (plugin WordPress) fino alla 1.0.42 compresa espongono una critica vulnerabilità di caricamento arbitrario di file non autenticato tramite l'endpoint REST /wp-json/storychief/webhook. Un attaccante può indurre il plugin a recuperare e salvare una risorsa remota controllata dall'attaccante (ad esempio una webshell) nella directory degli upload del sito, consentendo l'esecuzione remota di codice in molte installazioni WordPress predefinite.
CVE: CVE-2025-7441
CVSS: 9.8 (Critico)
💥 Impatto
Caricamento remoto non autenticato di file in wp-content/uploads/YYYY/MM/.
Potenziale esecuzione remota di codice quando il file caricato è eseguibile (ad es. PHP).
Compromissione completa del sito possibile quando WordPress è configurato per eseguire il PHP caricato sotto la root del documento.
🧩 Causa Principale della Vulnerabilità
Il plugin accetta un payload JSON in arrivo (evento di pubblicazione) che contiene un campo featured_image -> data -> sizes -> full che punta a un URL arbitrario. StoryChief non esegue una validazione sufficiente del tipo/contenuto del file né limita la fonte dell'URL, consentendo al plugin di recuperare la risorsa remota e salvarla nella directory degli upload del sito. Non c'è una validazione sufficiente per impedire la memorizzazione di file che contengono codice eseguibile.
🛠️ Script di Exploit — cosa fa (mappatura alla vulnerabilità)
Questa sezione spiega lo script di exploit (fornito separatamente) ad alto livello e mappa ogni comportamento importante alla vulnerabilità sottostante.
Analisi degli argomenti CLI — URL di destinazione (-u/--url), URL shell remota (-shell), chiave HMAC opzionale, intestazioni, flag proxy/timeout/retry, opzioni di debug e solo stampa.
Normalizzazione del target — aggiunge /wp-json/storychief/webhook quando viene fornita una root del sito.
Validazione dell'URL shell — verifica che l'URL remoto sia raggiungibile (HEAD/GET o curl).
Estrazione del nome file — usa il nome base dell'URL remoto per dedurre il nome file finale negli upload.
Costruzione del payload — inserisce l'URL controllato dall'attaccante in data.featured_image.data.sizes.full per forzare il plugin a recuperare e salvare il file.
Firma HMAC (opzionale) — calcola meta.mac (HMAC-SHA256) usando una chiave esadecimale opzionale; alcuni server potrebbero ignorarlo o richiederlo.
Invio — usa requests con retry/backoff o curl come fallback, supporta intestazioni personalizzate, proxy e --no-verify.
Gestione della risposta — analizza le risposte JSON per le chiavi permalink/id per rilevare il successo; altrimenti segnala il fallimento.
Output — stampa il percorso previsto per gli upload: wp-content/uploads/YYYY/MM/ in caso di successo.
🖼️ Requisiti del file Shell (critico)
Quando si utilizza un file remoto .php (ad esempio: https://attacker.example/shell.php) il file deve includere una intestazione immagine valida (byte magici) in modo che venga trattato/accettato come immagine dal plugin o dal codice di elaborazione delle immagini. Punti chiave:
Utilizzare un approccio poliglotta: il file deve iniziare con byte magici di immagine validi (es. JPEG, PNG o GIF) in modo che i controlli semplici e gli elaboratori di immagini lo accettino, contenendo anche il payload PHP in una sezione che rimane sul disco invariata.
Byte magici comuni per immagini:
JPEG: 0xFF 0xD8 0xFF
PNG: 0x89 0x50 0x4E 0x47
GIF: ASCII "GIF89a" o "GIF87a"
Non affidarsi solo all'estensione/nome file. Molti plugin ispezionano il contenuto del file o usano librerie (GD, ImageMagick) che verificano l'integrità dell'immagine.
Dipendente dall'ambiente: alcuni server convalideranno o ricodificheranno ulteriormente le immagini, il che potrebbe rimuovere il codice iniettato. Testare prima in un ambiente autorizzato.
Promemoria etico: NON pubblicare codice webshell funzionante qui. Creare e testare tali file solo in ambienti autorizzati.
▶️ Come eseguire (esempi)
Sostituisci i segnaposto con target autorizzati. Tutti gli esempi seguenti utilizzano un URL di shell remota .php.
"[-] Error: shell URL is not reachable (not HTTP 200)"
"[-] Error: request failed"
"[-] Error: upload failed or endpoint returned non-JSON/HTML"
🔎 Rilevamento e Indicatori di Compromissione (IoC)
Richieste POST inaspettate a /wp-json/storychief/webhook da IP sconosciuti.
Nuovi file in wp-content/uploads/// con estensione PHP o estensioni immagine contenenti codice incorporato.
Log del server web che mostrano GET in uscita verso domini controllati dall'attaccante seguiti da accessi ai file caricati.
File immagine sospetti con contenuto non immagine aggiunto o incorporato.
🛡️ Mitigazione e Rimedio
Breve termine:
Aggiornare StoryChief a una versione corretta non appena disponibile.
Bloccare o limitare /wp-json/storychief/webhook tramite WAF o regole del server.
Limitare i recuperi in uscita dal server o l'egress verso domini non fidati.
Guida per sviluppatori:
Validare tipi e contenuti dei file dopo qualsiasi recupero remoto; verificare le immagini utilizzando parser sicuri e rifiutare file non validi.
Richiedere l'autenticazione per i webhook che causano download o creazione di file lato server.
Assicurarsi che la verifica HMAC/firma sia implementata e applicata.
Memorizzare i contenuti caricati al di fuori della webroot o disabilitare l'esecuzione dei file caricati in wp-content/uploads (regole del server web).
⚠️ Limitazioni e Avvertenze
Il successo dell'exploit dipende dalla configurazione del server, dalle librerie di elaborazione delle immagini e dalle policy di esecuzione del server web.
I server che rielaborano o ricodificano le immagini potrebbero rimuovere i payload iniettati.
Se il plugin verifica le firme, fornire un mac errato potrebbe causare il rifiuto.
🤝 Uso Responsabile
Questo documento è destinato a difensori e tester autorizzati. Non utilizzare queste tecniche contro sistemi di cui non si possiede o di cui non si ha esplicita autorizzazione al test. Lo sfruttamento non autorizzato è illegale e non etico.
Se si segnala il problema a un fornitore o proprietario del sito, includere dettagli di riproduzione, passaggi di mitigazione sicuri e suggerimenti per la correzione.
📚 Riferimenti e Crediti
Report e script di exploit di: Nxploited (Khaled Alenazi) — nome file script: CVE-2025-7441.py (fornito separatamente)