Come ripristinare un sito WordPress colpito da malware

Sommario

Introduzione

Come abbiamo visto in questa guida, WordPress è un CMS il cui codice sorgente è aperto a tutti, ossia Open Source. Ma WordPress di per sé non è generalmente attaccabile dall’esterno, lo diventa a causa dei bug di sicurezza che vengono introdotti a causa della presenza di plugin installati nel sito, i quali sono progettati malamente dallo sviluppatore ufficiale, o semplicemente perché non vengono aggiornati da tempo.

Apportare quindi gli aggiornamenti in modo costante è la prima buona pratica da tenere in considerazione per evitare che si ripeta in futuro.

Requisiti

Per poter procedere con le analisi è necessario:

  1. Avere accesso alla Google Search Console per verificare cosa sta succedendo a livello SEO sul tuo sito.
  2. Essere in possesso dei dati d’accesso al pannello di controllo (cPanel/Plesk/WHM/Direct Admin et similia) del server hosting su cui è ospitato il sito.
  3. Essere in possesso dei dati di accesso FTP e del Database.
  4. Essere in possesso di un account amministrativo all’area admin di WordPress.
  5. Avere delle conoscenze di base per capire cosa si sta facendo in base all’area in cui ci troviamo ad operare.
Se non sei in possesso di questi dati o credi di non avere le competenze per poter sistemare da solo il sito, clicca qui! Possiamo aiutarti noi.

Analisi

Per ripulire un sito web WordPress infettato da virus o da un malware, dobbiamo anzitutto analizzare come si sta comportando il sito, per capire che tipo di malware abbiamo davanti.

I casi possibili sono diversi, proviamo a riassumerli:

  • Il sito sembra funzionare regolarmente ma su Google Search Console hai notato la presenza di link indicizzati che non appartengono a pagine realmente esistenti o che comunque non hai creato tu.
  • Il sito mostra delle pubblicità che non hai inserito tu, oppure aprendo le pagine vieni reindirizzato verso altri siti web.
  • Non riesci più a taggare il link del tuo sito sulle storie o sui post dei social come Instagram, Facebook (Meta), LinkedIn, TikTok ecc…
  • Altri comportamenti strani o potenzialmente dannosi per l’immagine del vostro sito/brand.

In tutti questi casi, possiamo star certi di avere il sito infettato da un malware.

Iniziamo con il processo di Pulizia

Primo step
Verifica dei CronJob

La prima cosa da fare è accedere al tuo pannello hosting e verificare che nella sezione Cronjob, non siano presenti dei comandi strani che vanno ad aprire/eseguire dei file con cadenza periodica. Se trovi uno o più comandi Cronjob non settati da te, significa che il primo problema è probabilmente il furto delle vostre credenziali di accesso al pannello hosting.

Verifica delle API Token

Recentemente abbiamo notato che gli hacker riescono ad accedere ai pannelli di controllo e da qui sono in grado di generare delle API Token per poter eseguire comandi da remoto. Verifica quindi che non esistano API generate da terzi e se ci sono eliminale subito!

Account FTP ed SQL

Verifica inoltre che tra gli account FTP ed SQL non ce ne siano di anomali. Se non sei certo al 100% che tali account siano sicuri, conviene eliminarli tutti e ricrearli da zero. Ricorda che eliminare un account FTP non crea alcun problema, ma eliminare un account SQL provoca il down del sito web, assicurati pertanto di creare prima il nuovo account SQL, associarlo al database esistente e di modificare queste credenziali nel file wp-config.php prima di eliminare l’account SQL sospetto.

Attivazione della 2FA (2 Factory Authentication)

Cambia le password di accesso al tuo account hosting (login amministrativo) e le password di accesso al pannello di controllo (cPanel o similari). Una volta modificata la password (mi raccomando usatene una complessa e sicura), dovete attivare anche l’autenticazione a due fattori (2FA) su tutti gli account che vi hanno accesso e se disponibile anche sul pannello di controllo. Verifica che anche le API Token siano protette dalla 2FA.

Secondo step

Se sei sicuro che il sito fino a tot giorni fa funzionava correttamente, la cosa più sensata da fare sarebbe quella di andare nel pannello di controllo del tuo hosting e ripristinare il backup funzionante più recente. Questa operazione però è fattibile solo se:

  1. Ho a disposizione un backup.
  2. Siamo certi che il backup non contiene già il malware.
  3. Non rischiamo di perdere dati o modifiche importanti , contenuti nei files o nel database attuale.
Prima di eliminare o ripristinare un backup

Accedi alla Google Search Console e verifica cosa sta accadendo. Ultimamente gli hacker riescono ad impadronirsi della proprietà su Google Search Console e possono associare delle nuove sitemap. Potete eliminare le sitemap malevole da Google Search Console ma prima di farlo, scaricate in locale una copia di questa sitemap. Una volta scaricata in locale, eliminate la sitemap sia da Google Search Console, sia dal server.
A questo punto aprite in locale la sitemap malevola, ed estraete la lista di tutti gli URL incriminati (che probabilmente risultano già indicizzati), e che sicuramente vogliamo eliminare. Inserite questa lista di URL in un plugin che consenta di effettuare il redirect 410 (Gone) come suggerito da Google stessa.

L’eliminiazione degli URL, il loro redirect 301 et similia, il semplice 404, o l’aggiunta di tali URL nel file robots.txt tramite la direttiva “Disallow”, non garantisce infatti che tali URL vengano eliminati correttamente. Google indica appunto l’uso del redirect 410 come la tecnica più rapida ed efficace in tal senso.

Il download in locale della sitemap è un passaggio fondamentale, in quanto se ci si affida agli strumenti di report di Google per recuperare gli URL da eliminare, è possibile ritrovarsi nell’impossibilità di farlo in maniera completa, in quanto Google ha imposto un limite di 1000 URL nel CSV che viene scaricato e pertanto se gli URL malevoli sono molti di più, l’unico modo per copiarli ed incollarli in una lista è prenderli direttamente dalla sitemap incriminata, o farlo a mano (che è tremendamente più lunga come operazione).

Una volta ripristinato il backup del sito (se ne avevate uno a disposizione), vai direttamente al Quarto Step. Qualora invece, per i motivi sopra menzionati non potessi recuperare un backup, leggi lo step successivo.

Terzo step

Questo è un passaggio chiave della pulizia: accedi via FTP al tuo server ed apri il file /wp-includes/version.php

Segnati la versione di WordPress riportata da quel file e scarica dalla repository ufficiale il pacchetto della stessa identica versione.

Elimina per sicurezza le cartelle wp-admin e wp-includes, compresi tutti i file nella root di WP, eccezion fatta per i file di configurazione come: .htaccess, wp-config.php, php.ini e simili.

Apri quindi i suddetti file e verifica che non siano stati modificati (specie se da FTP riportano la data “modificato” in tempi molto recenti). Qualora rilevassi delle modifiche, confrontale con un backup o ripulisci le righe malevole. In questo passaggio potresti voler rigenerare le chiavi SALT di WP, che una volta cambiate forzano il logout di tutti gli utenti, invalida cookies e sessioni precedentemente settati, inoltre potresti voler mettere in sicurezza WP con alcune righe di configurazione riviste, ad esempio:


/* Modifico le chiavi di Salt usando WordPress salt generator: https://api.wordpress.org/secret-key/1.1/salt/ */define('AUTH_KEY',         '8l`-a>1[OGFpq(Q9hRy*,-:k@.smlZJzpAc56 fj/cXj6;o)XjLa.E{wH1F7ed~#');
define('SECURE_AUTH_KEY',  '(5Ui|YkA*|+o#9Uw/Wj4=iB@gY5]MbD-;V-ZLbDZNT|kw2C;`YG;2 &E5L^cK,|.');
define('LOGGED_IN_KEY',    'o4*I.[Kx!lk1Yfl1Oc+:]tp=:qpG980X>d`[N_R| u^Un}j04Fk3L[y_RESh$8=V');
define('NONCE_KEY',        'rs~h19o#0PgOO.W;{4Cd+$][]7Q@2UJ;*|5>886%/!YAe@GliwBBnX_xCF%z.azn');
define('AUTH_SALT',        'pCPD4)7u=v%TPj<FrZ^tz_}$sT%GBC]+m|PK.AUx+j%L *~c:m@](_;L1|]zQPOj');
define('SECURE_AUTH_SALT', 'U`R|,Y>7oiqtdZ@2Y37e5~}hOO_mj|SIJXSq@sFH><32LFi{XJAMp-s9l-LW-mO|');
define('LOGGED_IN_SALT',   'O<$^n`O.,J8E%M=0](mcre_?9H/Uq,ee7GVh6<f2~r#}5ViHF4nT0_wV-$G|GOcD');
define('NONCE_SALT',       'dmpVphZc2=L9{kvD?4rd^Bd&je+^-R){:KP~>vk*.:J/sU2_iyDMK&qw@elUq<sl');

/* Mi assicuro che il table prefix non sia il classico _wp */$table_prefix = 'mostsecuretpwp_';

/* Blocco l'URL a livello di configurazione */define('WP_SITEURL', 'https://miosito.it/');
define('WP_HOME', 'https://miosito.it/');

/* Abilito l'upgrade automatico per le minor version di WP */define('WP_AUTO_UPDATE_CORE', 'minor');

/* Abilito l'accesso all'area admin solo via SSL */define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

/* Disabilito la modifica di file da backend e l'upload non filtrato  */define('DISALLOW_FILE_EDIT', true);
define('ALLOW_UNFILTERED_UPLOADS', false);

/* Modifico il nome del file di output relativo al debug in modo che non possa essere letto come prima dal classico /wp-content/debug.log */define('WP_DEBUG_LOG', 'miosito-it_filedebugWP.log');

Fatto ciò, suggerisco di settare i permessi del file wp-config.php a 444 in modo che niente e nessuno possa più modificare quel file senza prima riportarlo a 644.

Apri quindi la cartella /wp-content/plugins/

Qui dovrai verificare che nessun plugin sia stato modificato o alterato. Per sicurezza bisognerebbe disabilitare tutti questi plugin e reinstallarli dalla repository ufficiale, pertanto il consiglio che vi do è di rinominare la cartella “plugins” in “plugins_disabled” e creare da zero una nuova cartella chiamata “plugins” creando al suo interno un file “index.php” vuoto (per prevenire il browser directory listing).

Ora che abbiamo disabilitato tutti i plugin, verifichiamo se possibile anche la cartella wp-content/uploads/ e controlliamo che al suo interno non siano presenti files php o js creati di recente da qualche malware, se ci sono eliminateli.

Infine controlliamo anche la cartella /wp-content/themes/, eliminiamo tutti i temi non utilizzati e verifichiamo se ci sono alterazioni nei file dei nostri temi (parent/child).

Ovviamente riuscire a fare questi tipi di verifiche, richiede un minimo di conoscenze sulla capacità di lettura e valutazione del codice PHP/JS.
Se troviamo alterazioni dobbiamo pulire i file e ripristinarli allo stato originale.

Una volta terminata la fase di analisi/pulizia manuale, per sicurezza, l’ideale sarebbe comprimere tutta la cartella wp-content e scaricarla in locale.
Aprire quindi il pacchetto zip/tar con un antivirus professionale (Eset Internet Security rileva praticamente subito se sono presenti malware) e nel caso vi fossero delle segnalazioni, andare a verificare i file segnati come malevoli, quindi ripulirli.

Al termine di questi passaggi, carichiamo tutto il nostro WordPress pulito:

  1. Eliminate la cartella wp-content sul server.
  2. Ricaricate la cartella wp-content pulita e verificata in locale.
  3. Caricate le cartelle wp-admin e wp-includes, inclusi i file standard nella root, presi dal pacchetto originale.
Siamo ora nella situazione in cui i file originali di WP sono stati ricaricati, le configurazioni verificate, il tema verificato, abbiamo solo i plugins disabilitati.
Ci sono ora due possibilità:
  1. Fidarsi di ciò che ha rilevato l’antivirus e riattivare i plugin spostandoli sulla cartella originale.
  2. Scaricare a mano le ultime versioni dei plugin ed inserirli nella cartella originale.
  3. Accedere al backend e riscaricarli in modo semi-automatico dalla sezione Plugins.

Io suggerisco e solitamente adopero l’opzione 2, ma è lunga se si hanno 30 plugin, quindi decidete voi, a vostro rischio e pericolo.

Ovviamente l’ultimo passaggio è questo: se avete capito quale plugin ha introdotto il problema, dovreste verificare anche le relative tabelle nel database, per accertarsi che non ci siano anche lì stringhe malevole, come nel caso del Balada Injector sfruttato sul plugin Popup Builder.

Quarto step

Scansione con WPScan, un tool ufficiale che potete scaricare dal sito https://wpscan.com/.

Grazie a WPScan potrete effettuare una scansione completa del sito per verificare se la configurazione presenta problemi gravi come path-disclosure, xml-rpc abilitate, user enumeration, plugin e/o temi con vulnerabilità note.

Qualora la scansione vi dicesse che ci sono delle vulnerabilità, le dovete risolvere. Se un plugin risulta vulnerabile ma non ci sono aggiornamenti disponibili, ad esempio, va sostituito con uno simile che non presenta bug di sicurezza gravi.

Procedete quindi ad aggiornare completamente il sito, sia nel Core, sia nei Plugin e nei temi installati.

Come ultimo step, verificate se il vostro hosting dispone di sistemi di protezione come AV Immunify e WAF integrati, nel caso abilitateli!

Infine installate un buon WAF nel backend come WordFence e configuratelo in modo da blindare correttamente il backend.

Update Dicembre 2024:

Nelle ultime settimane abbiamo notato attacchi particolari su VPS con ambienti non correttamente aggiornati lato software: cPanel, PHP, Database. E’ importante che contattiate il vostro hosting provider per verificare che l’ambiente in uso sulla vostra VPS sia correttamente aggiornato alle ultimissime versioni disponibili, poiché se chiudete tutte le finestre ma lasciate aperta la porta principale, tutto il lavoro di pulizia non ha alcun senso.

E’ importante in questi casi (ma non solo) effettuare una verifica umana e manuale sui file presenti nel vostro server. Risulta infatti che alcuni attacchi riescano ad inserire dei file php apparentemente privi di malware, ma che nella pratica consentono ai malintenzionati di accedere ai file nel vostro server. Questo sistema viene perpetrato inserendo dei veri e propri micro-software, sparsi nelle cartelle del server (in special modo nelle cartelle /.well-known e /.wp-cli) e nelle cartelle di WordPress.

Il consiglio è quello di aprire il vostro file manager (impostando la visibilità dei file nascosti) e cercando in modo approfondito file estranei (tipo: sm.php o fm.php) che sono riconducibili a pannelli di accesso a “Tiny File Manager” e ad altri script in grado di generare URL e sitemap fake, tipici degli attacchi SEO-backlink.

Considerazioni finali

Per la complessità dei temi trattati non è possibile spiegare ogni singolo passaggio o strumento menzionato.

Questa guida viene aggiornata costantemente e contiene passaggi /indicazioni utili per capire dove cercare il problema, fornendo una via da seguire per risolverlo. Sta però all’utente andarsi a leggere la documentazione relativa ad un determinato strumento (come WPScan e WordFence).

Se non sai seguire uno o più dei passaggi elencati, avrai bisogno di studiare con calma le varie procedure o affidarti all’aiuto di un professionista, poiché riuscire a ripulire un sito web affetto da malware richiede soprattutto  un’abbondante mole di esperienza pregressa nel settore.

La speranza è che questa guida possa aiutare a dare una traccia da seguire in casi più o meno complessi da trattare, ma serve anche a far capire quanto sia fondamentale la conoscenza delle cose per farle funzionare adeguatamente.

Hai trovato utile questa guida? Oppure nonostante tu abbia seguito tutti i passaggi non sei riuscito ancora a risolvere il problema? Fammelo sapere!

Cliccando sul pulsante sottostante, verrà generato automaticamente un ticket nel nostro sistema che ci consentirà di raccogliere informazioni utili per migliorare questa guida!

Cerchi un servizio di assistenza e manutenzione professionale?
E' un servizio fondamentale per il tuo sito web WordPress / WooCommerce!