Come abbiamo visto nell’articolo precedente
Quanto è sicuro l’algoritmo delle password di WordPress?, il framework per le
password di WordPress, utilizza l’algoritmo MD5 insieme ad una sequenza casuale lunga 64 caratteri.
Questa sequenza viene chiamata “sale” (
salt in inglese) ed è una tecnica utilizzata per rafforzare l’integrità delle
password WordPress visto che il solo
hash con l’algoritmo MD5 non basta a garantire l’inviolabilità delle
password di WordPress.
Salt & Keys
Nel file di configurazione wp-config.php c’è una sezione chiamata “
Authentication Unique Keys and Salts” dove vengono salvate sia le “
salts” che le “
keys“.
A. Gruppo delle “Keys” (4 stringhe)
Le “
keys” vengono generate automaticamente durante l’installazione di WordPress e vengono salvate sia nel database che nel file wp-config.php.
Le prime 3 vengono usate per la generazione di
cookie (per una spiegazione sui
cookie vedi la sezione successiva) e l’ultima per la generazione di
nonce (per approfondimenti vedi
WordPress Nonces su WordPress.org).
a) AUTH_KEY
Chiave utilizzata per generare un
cookie di autorizzazione per fornire all’utente che si collega tramite un canale non protetto (protocollo http) l’accesso al pannello di amministrazione (
dashboard), quindi poter apportare modifiche al sito.
b) SECURE_AUTH_KEY
Stessa tipologia della chiave precedente, ma questa volta per collegamenti tramite canale protetto da certificato SSL (protocollo https).
c) LOGGED_IN_KEY
Chiave utilizzata per generare un
cookie per un utente che accede al sistema. Questo tipo di
cookie non permette di apportare modifiche al sistema.
d) NONCE_KEY
Chiave utilizzata per generare un
token nonce (“
number used once“). La chiave stessa viene generata dalla concatenazione dell’ID utente + il parametro $action + data/ora attuale (
timestamp).
Il
token nonce viene usato per identificare in modo univoco le richieste indirizzate al sito. In questo modo quando il sito riceve una richiesta remota, viene verificato se è presente un
token nonce o meno. Se non è presente la richiesta viene rifiutata, se invece è presente il valore del
token nonce viene confrontato con quello salvato nel sistema, se il
token nonce corrisponde allora la richiesta viene accolta altrimenti rifiutata tramite errore 403 (
Forbidden).
Esempio (eliminazione di un commento di un post):
https://www.esempio.it/wp-admin/comment.php?c=16570&action=deletecomment&_wpnonce=389c3b47b9
B. Gruppo delle “Salts” (4 stringhe)
Le “
salts” vengono generate partendo dalle “
keys” create al momento dell’installazione di WordPress e vengono salvate nel file wp-config.php
Durante le operazioni di
hashing, le “
salts” vengono concatenate alle “
keys” per rafforzare gli
hash creati durante le varie operazioni di autenticazioni ed autorizzazioni eseguite dal sistema.
a) AUTH_SALT
Stringa aggiunta alla corrispondente chiave AUTH_KEY per generare un
hash per la creazione del
cookie di autorizzazione.
b) SECURE_AUTH_SALT
Stringa aggiunta alla corrispondente chiave SECURE_AUTH_KEY per generare un
hash per la creazione del
cookie di autorizzazione.
c) LOGGED_IN_SALT
Stringa aggiunta alla corrispondente chiave LOGGED_IN_KEY per generare un
hash per la creazione del
cookie di accesso al sistema.
d) NONCE_SALT
Stringa aggiunta alla corrispondente chiave NONCE_KEY per generare un
hash per la creazione del
token di protezione.
Cookies
A differenza di altri sistemi basati sul linguaggio PHP, che usano le
sessioni PHP per gestire l’autenticazione degli utenti, WordPress gestisce l’autenticazione tramite un sistema basato sui
cookie.
I
cookie creati da WordPress sono 4:
1) wordpress_[hash]
Al momento del login viene creato un primo
cookie dove vengono memorizzati le specifiche di autenticazione dell’utente. Questo
cookie viene utilizzato per accedere al pannello di amministrazione (
dashboard) per connessioni tramite canale non protetto (http).
2) wordpress_sec_[hash]
Le stesse funzionalità del
cookie di cui sopra, per le connessioni tramite canale protetto da certificato SSL (https).
3) wordpress_logged_in_[hash]
Dopo il login viene creato un secondo
cookie con le specifiche dell’identità dell’utente e l’orario di login.
4) wp-settings-{time}-[UID]
Cookie utilizzato per la personalizzazione dell’interfaccia del pannello di amministrazione (
dashboard).
Struttura cookie
Esempio struttura cookie di autenticazione (AUTH_COOKIE)
a) Cookie ID
Il
cookie ID viene generato dalla concatenazione della stringa “wordpress_” +
hash generato dal
hashing MD5 dell’url del sito
(
vedi codice file sorgente WordPress ver. 5.2.3)
b) Username
E il nome utente registrato nel sistema
c) Expiration
Corrisponde alla data e ora di scadenza del
cookie (durata di default 48 ore), in
formato Unix timestamp – Wikipedia)
d) Hash
Si tratta di un
hash di tipo HMAC (
hash-based message authentication code – Wikipedia).
In un primo passaggio l’
hash viene generato da un valore MD5 del nome utente abbinato alla data di scadenza del
cookie.
Successivamente viene generato un secondo
hash col nome utente, la data di scadenza e 4 caratteri del
hash della
password dell’utente.
Infine in un terzo passaggio, vengono concatenate le stringhe AUTH_KEY e AUTH_SALT, che vengono poi passate alla funzione wp_hash, per generare il
hash definitivo.
(
vedi codice file sorgente WordPress ver. 5.2.3)
Quali sono i rischi?
Il rischio più evidente è quello che un utente malintenzionato possa entrare in possesso dei vostri
cookie di accesso al vostro pannello di controllo di WordPress.
Attacchi di questo genere vengono eseguiti ridirezionando le richieste fatte tramite browser da un utente remoto, verso un sito malevolo, creato appositamente per impossessarsi dei cookie presenti nel computer dell’utente.
Un altro rischio altrettanto evidente, è la possibilità che un utente malintenzionato possa entrare in possesso delle “
salt & keys” del vostro file wp-config.php.
Partendo dalle “
salt & keys“, è possibile creare di sana pianta e in breve tempo, un
cookie col quale avere accesso liberamente al pannello di amministrazione con diritti di amministratore! (chiamato in gergo “
cookie forging” ovvero contraffazione cookie).
Come proteggersi?
1) Certificato SSL
Il primo livello di protezione è il certificato SSL, che grazie alla cifratura dei dati scambiati tra server web e browser del visitatore, rafforza la sicurezza del sistema impedendo ad eventuali utenti malintenzionati di intercettare il flusso di dati e leggerne i contenuti.
2) Abilitare il header di sicurezza HSTS
Installare un certificato SSL nel proprio sito è di poco aiuto, se non viene abilitato il header di sicurezza HSTS (
HTTP Strict Transport Security) che obbliga i visitatori del sito ad utilizzare esclusivamente il protocollo cifrato HTTPS per comunicare col server web.
Per istruzioni su come implementarlo nel proprio sito
consultare il mio articolo sui header HTTP di sicurezza
3) File di configurazione wp-config.php
a)
impostare permessi 644
b)
Bloccare l’accesso al file tramite direttive nel file htaccess
c)
Impostare login e accesso pannello di amministrazione (dashboard) esclusivamente tramite canale cifrato SSL
Inserire le seguenti direttive nel file wp-config.php:
define( ‘FORCE_SSL_LOGIN’, true );
define( ‘FORCE_SSL_ADMIN’, true );
d)
Cambiare regolarmente le “salts & keys“
Per cambiare le “
salts & keys“, lo si può fare manualmente usando l’app ufficiale fornita da WordPress all’indirizzo
https://api.wordpress.org/secret-key/1.1/salt/ e copiando/incollando le nuove stringhe, oppure comodamente tramite un plugin che fa tutto il lavoro in automatico!
Plugin Salt Shaker
Questo plugin una volta installato permette di programmare la sostituzione delle “
salts & keys” in modo automatico.