Tutti gli articoli
Bonifica malwareAggiornato il 14 min di letturaTeam WPsec.it

WordPress hackerato: guida al recupero del sito in 11 fasi

Recuperare un sito WordPress hackerato in 11 fasi: dalla conferma alla bonifica, dalla chiusura del vettore all'hardening finale. Sequenza operativa con comandi e checklist.

Condividi
WordPress hackerato: guida al recupero del sito in 11 fasi

Recuperare un sito WordPress hackerato richiede una sequenza precisa: prima blocchi l'emorragia, poi raccogli le prove, poi pulisci, poi chiudi il vettore, poi rimedi finali. Saltare un passo, soprattutto la chiusura del vettore di ingresso, lascia aperto il rischio di recidiva. Questa guida copre l'intero percorso dall'inizio alla fine.

Niente panico: un sito compromesso è una situazione comune e si recupera. Quello che NON funziona è cliccare "scansiona e pulisci" in un plugin di sicurezza o ripristinare un backup senza capire come è entrato l'attaccante. Questa guida mappa l'intero processo, dalla scoperta del problema al ritorno online in condizioni di sicurezza verificata.

Se sei nelle primissime ore dopo la scoperta, inizia da cosa fare nella prima ora o dalla sintesi sito WordPress hackerato. Se vuoi capire il metodo che usiamo internamente su interventi professionali, leggi bonifica malware WordPress: il metodo e la pagina pillar su rimozione malware WordPress.


Fase 1: conferma la compromissione

Prima di iniziare qualsiasi intervento, conferma che si tratti davvero di un hack e non di un malfunzionamento tecnico o di una configurazione sbagliata.

Controlli rapidi da fare subito:

  • Apri il sito in modalità incognita da browser desktop e da browser mobile. Un redirect inatteso solo da mobile o da Google richiede di controllare codice, regole di redirect e script esterni; conserva la prova prima di attribuirne la causa.
  • Cerca su Google site:tuodominio.it e controlla i risultati. Pagine non autorizzate di scommesse, farmaci o contenuti in altre lingue sono un segnale di possibile spam SEO. Verifica se gli URL restituiscono ancora quei contenuti: il risultato Google può essere rimasto da prima della pulizia.
  • Controlla Google Search Console nella sezione "Sicurezza e azioni manuali". Google spesso rileva il malware prima del proprietario.
  • Verifica su Google Safe Browsing: strumento di verifica Safe Browsing
  • Controlla la lista utenti admin in Bacheca > Utenti: utenti sconosciuti sono un segnale forte. Vedi utenti admin sconosciuti.

Se trovi più di uno di questi segnali, tratta il caso come compromissione attiva e vai alla fase successiva senza perdere tempo.


Fase 2: blocca l'accesso immediato

Prima di pulire, limita i danni in corso. Queste azioni non risolvono il problema ma lo contengono:

Contieni il comportamento dannoso: chiedi al provider una pagina statica temporanea o una limitazione mirata dell’accesso al sito coinvolto. Un plugin di manutenzione dentro WordPress compromesso può non intercettare tutti i percorsi. Su hosting condiviso, limita l’intervento al tuo sito senza interrompere servizi usati da altri.

Conserva le prove prima delle modifiche: raccogli timestamp, avvisi del provider e una copia verificata come nella fase 3. Se un accesso rubato è usato in quel momento, il contenimento urgente ha precedenza: registra quale account hai revocato e quando. Coordina i cambi di password con le integrazioni per non interromperle.

Invalida le sessioni quando necessario: dopo la copia di wp-config.php, la rotazione dei SALT disconnette le sessioni basate sui cookie di WordPress. Il comando modifica la configurazione:

wp config shuffle-salts

Questa azione non revoca da sola password applicative, accessi SFTP o token di altri servizi, che vanno verificati separatamente.

Elenca gli eventi pianificati: questo comando legge gli eventi WP-Cron, senza sospenderli. Se sospetti che il codice sia compromesso, preferisci l’analisi su una copia isolata: WP-CLI può caricare componenti del sito.

wp cron event list --format=table

Attribuisci gli hook ai componenti che li registrano; un nome sconosciuto non prova che sia malware. Controlla anche i cron del pannello hosting. Prima di sospendere un evento verifica le conseguenze su ordini, email e backup. Riferimento WP-CLI: cron event list.


Fase 3: crea il backup come evidenza

Prima di toccare qualsiasi file, crea una copia completa dello stato attuale. Sembra controintuitivo fare il backup di un sito compromesso, ma serve per:

  • avere le prove di cosa è successo (utile in caso di data breach e notifiche GDPR)
  • poter confrontare i file dopo la pulizia
  • ricostruire lo storico delle modifiche
# Esempio: adatta percorso e database, usa autenticazione già configurata.
# La cartella privata è esterna alla document root.
umask 077
incident_backup=$(mktemp -d /tmp/wp-incident.XXXXXX)
tar -czf "$incident_backup/files.tar.gz" /srv/www/example.com/
gzip -t "$incident_backup/files.tar.gz"
tar -tzf "$incident_backup/files.tar.gz" >/dev/null

mysqldump --single-transaction --quick --routines --triggers \
  nome_database > "$incident_backup/database.sql"
# Verifica exit code 0 del dump e presenza del marcatore finale:
grep -- '-- Dump completed' "$incident_backup/database.sql"

Controlla che tutti i comandi abbiano completato senza errori prima di procedere. Il marcatore finale e il controllo gzip non sostituiscono una prova di ripristino su ambiente isolato. Conserva anche log, file nascosti e configurazioni esterne alla document root. Trasferisci la copia su storage protetto con accessi separati; contiene dati e credenziali del sito e non deve essere pubblicamente scaricabile.


Fase 4: analizza i log

I log di accesso aiutano a ricostruire richieste e tempi. Possono essere incompleti o già ruotati: il vettore di ingresso può restare non determinabile. Su Apache/Nginx, cerca:

  • richieste POST verso file PHP non standard (specialmente in wp-content/uploads/)
  • pattern di scansione su path di plugin specifici
  • IP che hanno fatto molte richieste in breve tempo
  • User-Agent automatici o palesemente falsi
# IP più attivi nelle ultime settimane
cat /home/sito/logs/*.access_log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20

# POST verso path sospetti
grep "POST" /home/sito/logs/*.access_log | grep "uploads\|xmlrpc\|wp-login" | tail -50

Una POST verso un file in wp-content/uploads/ è una pista da verificare insieme al contenuto del file, alla risposta HTTP e al componente che lo ha creato. Da sola non dimostra una webshell né identifica la vulnerabilità iniziale.


Fase 5: trova e rimuovi il malware

File system

Inizia dai punti più frequenti:

File PHP in wp-content/uploads (da attribuire e analizzare; alcuni plugin creano file legittimi):

find wp-content/uploads -name "*.php" -type f

File modificati di recente nel core (WordPress core non si modifica):

find wp-admin wp-includes -name "*.php" -newer wp-login.php -type f

File PHP con nomi casuali in tutta l'installazione:

find . -name "*.php" -type f -mtime -30 \
  -not -path "./wp-content/cache/*" \
  -not -path "./.git/*" | head -30

Per confrontare il core con la versione pulita:

wp core verify-checksums

Questo comando confronta i file core con i checksum ufficiali e segnala differenze. Una differenza richiede analisi; un esito corretto non verifica plugin, database e configurazioni. Puoi interpretare i nomi delle rilevazioni nel catalogo delle firme malware.

Database

Cerca nelle tabelle principali:

-- Codice base64 in wp_options (tipica tecnica di offuscamento)
SELECT option_name, LENGTH(option_value) as len
FROM wp_options
WHERE option_value LIKE '%base64_decode%'
OR option_value LIKE '%gzinflate%'
OR option_value LIKE '%str_rot13%'
ORDER BY len DESC;

-- URL sospetti in wp_options
SELECT option_name, option_value FROM wp_options
WHERE option_value LIKE '%http%'
AND option_name NOT IN ('siteurl','home','blogdescription','blogname')
AND option_value LIKE '%<script%';

-- Articoli pubblicati con slug sospetti (spam SEO)
SELECT post_title, post_name, post_status, post_date
FROM wp_posts
WHERE post_status = 'publish'
AND post_date > DATE_SUB(NOW(), INTERVAL 90 DAY)
ORDER BY post_date DESC;

Fase 6: pulizia sistematica

La pulizia non è cancellare file a caso. È sostituire i componenti compromessi con versioni pulite verificate.

Core WordPress: su copia verificata o staging, confronta e sostituisci i file compromessi con il pacchetto ufficiale della versione corretta. Il seguente comando sovrascrive file: richiede backup verificato e controllo delle personalizzazioni. Non elimina automaticamente file aggiunti dall’attaccante:

wp core download --version=$(wp core version) --force

Plugin: conserva versione, impostazioni e personalizzazioni prima di sostituire un componente compromesso. Usa pacchetti verificati dal repository ufficiale o dal produttore per i plugin premium. Prova la versione corretta su staging e verifica le funzioni del sito; una cancellazione indiscriminata può interrompere integrazioni e dati.

Temi: sostituisci con versioni pulite. Attenzione ai child theme: possono contenere codice legittimo personalizzato che va preservato, esaminalo prima di sovrascrivere.

wp-config.php: conserva una copia e confronta riga per riga con la configurazione documentata. Attribuisci costanti e include a hosting o componenti autorizzati. Rimuovi soltanto codice accertato come malevolo: non riconoscere una direttiva non è una prova.

.htaccess: conserva e verifica redirect e regole prima di modificarli. Mantieni le direttive legittime del provider, cache e autenticazione; verifica la risposta HTTP dopo ogni modifica mirata.

wp-content/uploads: inventaria i file PHP e verifica origine e contenuto. Quarantena e rimozione riguardano i payload confermati, dopo il backup; non tutti i file PHP sono automaticamente malware. Controlla anche file nascosti ed estensioni inattese.


Fase 7: identifica e chiudi il vettore di ingresso

Questo è il passo più critico. Se il vettore resta aperto, il sito può essere ricompromesso. Distingui una causa provata da una pista plausibile e registra ciò che non è determinabile.

Vettori più comuni:

Plugin vulnerabile: controlla la versione di ogni plugin installato contro il database delle vulnerabilità note su WPScan o Patchstack. Se trovi un plugin con CVE che permette accesso non autorizzato, aggiornalo o rimuovilo.

Credenziali rubate: correla login riusciti non autorizzati, attività degli account e conferme del cliente. La provenienza geografica di un IP non basta a dimostrare un furto di credenziali. Tutte le credenziali vanno ruotate (vedi fase 8).

Plugin o tema nulled: un pacchetto nulled ha origine e integrità non verificabili e può contenere backdoor. Rimuovilo completamente e acquista la licenza originale. La guida plugin nulled: cosa rischi descrive i rischi in dettaglio.

Hosting condiviso: a volte la compromissione arriva da un altro sito sullo stesso account o sullo stesso server. Chiedi al tuo provider se ci sono stati incidenti sull'infrastruttura.

File rimasti da installazioni precedenti: plugin o temi rimossi ma con file residui sul file system possono essere usati come punto di ingresso.


Fase 8: rotazione credenziali completa

Dopo la pulizia, tratta tutte le credenziali come compromesse:

  • Cambia password di tutti gli utenti WordPress admin
  • Cambia password FTP/SFTP
  • Cambia password database
  • Cambia password cPanel/pannello hosting
  • Rigenera chiavi API di servizi connessi: SMTP, gateway pagamento, Cloudflare, S3, CDN
  • Rigenera i SALT WordPress se non lo hai già fatto nella fase 2

Se hai usato un client potenzialmente compromesso per accedere al sito, fai una scansione antimalware del computer.


Fase 9: hardening prima di tornare online

Prima di togliere la pagina di manutenzione e dichiarare il sito operativo:

  • Aggiorna WordPress, tutti i plugin e i temi all'ultima versione compatibile
  • Rimuovi plugin e temi non utilizzati (anche solo installati)
  • Disabilita l'editor file da Bacheca (aggiungi define('DISALLOW_FILE_EDIT', true) a wp-config.php)
  • Abilita 2FA per tutti gli admin (plugin WP 2FA gratuito)
  • Verifica proprietario e permessi con il provider: 644 per file e 755 per cartelle sono valori comuni, ma la leggibilità di wp-config.php dipende da come viene eseguito PHP. Evita modifiche ricorsive alla cieca.
  • Verifica che i backup automatici siano attivi e configurati su storage esterno
  • Controlla gli header HTTP di sicurezza

Per una checklist completa dell'hardening, leggi hardening WordPress essenziale.


Fase 10: ripristino reputazione

Dopo la bonifica tecnica, ci sono passi esterni da completare:

Google Search Console: se Google aveva rilevato malware, vai nella sezione "Sicurezza e azioni manuali" e richiedi una revisione. Inviala solo dopo che la bonifica è completa: Google ri-scansiona il sito e se trova ancora problemi nega la revisione.

Google Safe Browsing: segui il problema indicato nel report Problemi di sicurezza e verifica poi l’esito della revisione. Una rimozione URL dalla ricerca non elimina un avviso del browser; non c’è un tempo di recupero garantito.

Blacklist email: se il dominio è finito in blacklist per spam, usa MXToolbox per verificare in quali liste sei presente. Alcune richiedono una richiesta manuale di rimozione, altre si aggiornano automaticamente. Dettagli in rimozione blacklist Google.

SEO spam: inventaria gli URL abusivi prima di eliminarli, preservando le pagine legittime. Gli URL rimossi devono restituire un vero 404 o 410 ed essere scansionabili; lo strumento Rimozioni di Search Console nasconde temporaneamente i risultati. Segui la guida alle pagine spam su Google dopo un hack per distinguere rimozione permanente, sitemap e revisione sicurezza.


Fase 11: monitoraggio post-bonifica

Stabilisci una baseline dopo la bonifica e confrontala nei controlli successivi. Monitora:

  • Modifiche ai file con WP-CLI: wp core verify-checksums && wp plugin verify-checksums --all
  • Lista utenti admin ogni giorno per la prima settimana
  • Log di accesso WordPress per login da IP sconosciuti
  • Uptime e risposta del sito (UptimeRobot o simile)
  • Google Search Console per nuovi problemi di sicurezza

Se il problema ritorna, indaga backdoor residue, vettori ancora aperti, credenziali sottratte o ripristini da copie compromesse: la ricomparsa da sola non identifica la causa. In quel caso serve un'analisi più approfondita.


Quando affidarsi a un tecnico

Questo percorso è fattibile in autonomia su casi semplici con buon accesso SSH. In questi casi il consiglio è affidarsi a uno specialista:

  • Il sito è un WooCommerce con ordini e dati cliente
  • La bonifica è stata fatta ma il problema è tornato
  • L'hosting è sospeso e serve un report per la riattivazione
  • Google ha attivato un'azione manuale sul sito
  • Non hai accesso SSH o non sei sicuro di cosa stai guardando

WPsec.it gestisce interventi di bonifica con analisi root cause, staging, garanzia 30 giorni e coordinamento con hosting e Google. Richiedi una valutazione oppure parti dal check-up gratuito.


Ripristinare un backup è sufficiente per recuperare un sito hackerato?

Solo se il backup è precedente alla compromissione E se chiudi la vulnerabilità che ha permesso l'accesso. Se ripristini un backup pulito ma lasci aperto il plugin vulnerabile o non cambi le credenziali rubate, il sito viene ricompromesso in ore o giorni. Il backup è un punto di partenza, non la soluzione: devi ancora identificare e chiudere il vettore di ingresso.

Quanto tempo ci vuole per recuperare un sito WordPress hackerato?

Dipende dalla gravità. Un caso semplice (redirect in .htaccess, nessun file aggiunto, vettore chiaro) richiede 2-4 ore. Un caso con backdoor multiple, database infetto, utenti creati automaticamente e blacklist Google attiva può richiedere 1-2 giorni di lavoro. L'analisi dei log e la ricerca del vettore di ingresso sono spesso la parte più lunga.

Devo avvisare i miei clienti se il sito è stato hackerato?

Una violazione può riguardare riservatezza, integrità o disponibilità dei dati, anche senza esfiltrazione provata. Il titolare valuta il rischio e documenta l’incidente. La notifica al Garante è dovuta senza ingiustificato ritardo e, ove possibile, entro 72 ore da quando ne viene a conoscenza, salvo che il rischio per diritti e libertà sia improbabile. La comunicazione agli interessati ha condizioni distinte, legate a un rischio elevato. Coinvolgi chi segue la privacy e consulta le indicazioni del Garante sui data breach.

Il sito continua a essere reinfettato dopo la pulizia: cosa sta succedendo?

La causa quasi sempre è una backdoor residua o il vettore di ingresso ancora aperto. Le backdoor sono progettate per la ridondanza: se ne trovi una e la rimuovi, spesso ne esiste un'altra in un punto diverso. Controlla in particolare file in wp-content/uploads/, mu-plugins/, voci nel database con codice offuscato, cron job con nomi non riconoscibili, utenti che si ricreano automaticamente. Se il problema persiste dopo due cicli di pulizia, è il momento di un'analisi forense più approfondita.

Posso fare la bonifica senza accesso SSH?

Parzialmente. Dal pannello WordPress puoi controllare utenti, plugin, aggiornamenti e alcune impostazioni. Dal File Manager di cPanel puoi esaminare e modificare file. Senza SSH non puoi eseguire WP-CLI, analizzare i log del server, fare backup rapidi o confrontare il core in modo efficiente. Per compromissioni superficiali questo basta. Per backdoor nel database o file nascosti in posizioni non standard, SSH è praticamente necessario per una bonifica affidabile.

Pubblicato il - aggiornato il

Condividi

Scritto dal team WPsec.it

Team WPsec.it

Bonifica malware, hardening, performance e manutenzione WordPress.

Guide per sintomo

Il tuo sito ha un sintomo preciso? Parti dalla guida giusta.

Ogni compromissione WordPress lascia segnali diversi. Queste guide spiegano cosa fare nelle prime ore, cosa non toccare e quando serve una bonifica con analisi del vettore d'ingresso.

Continua a leggere

Articoli correlati.

Sito WordPress hackerato: cosa fare nella prima ora
Bonifica malware22 aprile 2026

Sito WordPress hackerato: cosa fare nella prima ora

Guida tecnica per la prima ora dopo una compromissione WordPress: cosa documentare, come creare un backup utile per l'analisi, quali accessi raccogliere e gli errori che rendono la bonifica impossibile.

15 minTeam WPsec.it