L'enumerazione degli utenti (user enumeration) è una tecnica di ricognizione utilizzata dagli aggressori per scoprire nomi utente validi sul tuo sito WordPress. Di solito è il primo passo prima di un attacco brute force. Se un aggressore conosce il tuo nome utente amministratore, deve solo indovinare la password. Se non conosce il nome utente, la superficie di attacco è significativamente più ampia. Bloccando l'enumerazione, costringi gli aggressori a indovinare sia il nome utente che la password, rendendo un attacco riuscito molto meno probabile.
Come gli aggressori enumerano i nomi utente di WordPress
Esistono diversi metodi che gli aggressori utilizzano per scoprire i nomi utente su un sito WordPress. Comprendere ogni metodo ti permette di sapere da cosa devi proteggerti.
- URL degli archivi autore: WordPress crea per impostazione predefinita archivi autore su
/author/nomeutente/. Un aggressore può visitare?author=1,?author=2e così via. WordPress reindirizza queste richieste all'URL dell'archivio autore corrispondente, che contiene il nome utente in chiaro. Gli script automatizzati possono iterare molto rapidamente sugli ID degli autori per costruire un elenco completo di nomi utente. - Endpoint users della REST API: la REST API di WordPress espone un endpoint
/wp-json/wp/v2/usersche restituisce un array JSON di tutti gli utenti che hanno pubblicato post. Questo include nomi utente, nomi visualizzati e ID utente. Per impostazione predefinita, non è richiesta alcuna autenticazione per accedere a questo endpoint. - Messaggi di errore al login: quando inserisci un nome utente non valido nella pagina di login di WordPress, il messaggio di errore dice qualcosa come "Il nome utente X non è registrato". Quando inserisci un nome utente valido ma una password errata, dice "La password che hai inserito per il nome utente X non è corretta". Questa differenza dice all'aggressore se un nome utente esiste.
- Risposte oEmbed: i link di discovery oEmbed di WordPress nel sorgente della pagina possono rivelare informazioni sull'autore quando altri siti cercano di incorporare i tuoi contenuti.
- XML-RPC: l'endpoint
xmlrpc.phppuò essere utilizzato per testare combinazioni nome utente/password tramite il metodowp.getUsersBlogs. Sebbene questo sia più un vettore di brute force, conferma nomi utente validi tramite diverse risposte di errore.
Perché l'enumerazione degli utenti è importante per la sicurezza
Di per sé, conoscere un nome utente non compromette il tuo sito. Ma rende tutto il resto più facile per un aggressore. Considera un attacco brute force: se l'aggressore deve indovinare sia il nome utente che la password, il numero di combinazioni possibili è enorme. Se sa già che il nome utente è "admin" o "john", deve solo concentrarsi sulla password. Combinato con liste di password comuni, questo può portare a una violazione riuscita in pochi minuti invece di anni.
Inoltre, i nomi utente scoperti possono essere utilizzati in attacchi di phishing mirati. Se un aggressore sa che il tuo account amministratore è "sarah.johnson", può creare email di social engineering più convincenti.
Bloccare l'enumerazione tramite archivi autore
Aggiungi questo codice al file functions.php del tuo tema o a un plugin personalizzato. Intercetta le richieste con il parametro ?author=N e le reindirizza alla homepage invece di rivelare il nome utente:
/**
* Block user enumeration via author parameter
*/
function block_author_enumeration() {
if (is_admin()) return;
if (isset($_REQUEST['author']) && is_numeric($_REQUEST['author'])) {
wp_redirect(home_url(), 301);
exit;
}
}
add_action('init', 'block_author_enumeration');Questo gestisce il metodo di enumerazione più comune. Il controllo is_admin() garantisce che la funzionalità backend non sia interessata. Il reindirizzamento utilizza un codice di stato 301, che indica ai motori di ricerca di aggiornare il loro indice (nel caso in cui gli URL degli archivi autore fossero stati indicizzati in precedenza).
Disabilitare l'endpoint users della REST API
Il seguente codice rimuove l'endpoint users dalla REST API per i visitatori non autenticati. Gli utenti autenticati (come amministratori ed editor) hanno ancora accesso, il che preserva la funzionalità dell'editor a blocchi e di altri strumenti di amministrazione:
/**
* Remove REST API users endpoint for unauthenticated requests
*/
add_filter('rest_endpoints', function($endpoints) {
if (!is_user_logged_in()) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P[\d]+)']);
}
}
return $endpoints;
}); Dopo aver aggiunto questo codice, le richieste non autenticate a /wp-json/wp/v2/users restituiranno un errore 404 invece di enumerare i tuoi utenti.
Sanificare i messaggi di errore al login
WordPress mostra messaggi di errore diversi per "nome utente non valido" e "password errata". Questo rivela se un determinato nome utente esiste sul sito. La soluzione è semplice: restituire lo stesso messaggio generico per tutti i fallimenti di login:
/**
* Use a generic login error message
*/
add_filter('login_errors', function() {
return 'Invalid username or password.';
});Con questa modifica, un aggressore non può determinare se un tentativo di login è fallito per un nome utente errato o una password errata. Entrambi i casi producono la stessa risposta.
Rimuovere i link di discovery oEmbed
WordPress aggiunge link di discovery oEmbed nell'head HTML delle tue pagine. Questi link possono rivelare informazioni sull'autore quando altri siti cercano di incorporare i tuoi contenuti. Rimuovili con una sola riga:
remove_action('wp_head', 'wp_oembed_add_discovery_links');Questo non influisce sulla tua capacità di incorporare contenuti da altri siti. Impedisce solo ad altri siti di scoprire automaticamente contenuti incorporabili sul tuo sito.
Bloccare l'enumerazione degli autori tramite .htaccess
Se utilizzi Apache, puoi aggiungere un reindirizzamento a livello di server che blocca l'enumerazione degli autori prima ancora che WordPress venga caricato. Questo è più efficiente di una soluzione basata su PHP perché non richiede l'elaborazione PHP:
# Block user enumeration via author parameter
RewriteCond %{QUERY_STRING} ^author=\d+ [NC]
RewriteRule .* /? [R=301,L]Posiziona questo nel tuo file .htaccess prima delle regole di riscrittura di WordPress. Cattura qualsiasi richiesta con un parametro di query author= contenente un numero e la reindirizza alla homepage.
Soluzioni basate su plugin
Se preferisci non aggiungere codice manualmente, diversi plugin di sicurezza gestiscono la prevenzione dell'enumerazione degli utenti:
- Stop User Enumeration: un plugin mirato e leggero che blocca specificamente le scansioni di autori e gli elenchi utenti della REST API. Fa una cosa e la fa bene.
- iThemes Security (Solid Security): una suite di sicurezza completa con protezione dell'enumerazione degli utenti accanto a funzionalità come l'autenticazione a due fattori, il rilevamento delle modifiche ai file e la protezione brute force. Il blocco dell'enumerazione si trova nella sezione "WordPress Tweaks".
- Wordfence: principalmente un firewall e uno scanner antimalware, ma le sue regole firewall possono bloccare i tentativi di enumerazione. La versione gratuita offre protezione di base; la versione premium aggiunge regole firewall in tempo reale.
- All In One WP Security: un plugin gratuito e adatto ai principianti con un'opzione di prevenzione dell'enumerazione degli utenti in User Accounts > WP Username. Offre anche funzionalità di firewall e login-lockdown.
Testare l'enumerazione sul tuo sito
Prima e dopo aver implementato queste protezioni, dovresti testare se l'enumerazione funziona ancora. Ecco come:
- Test archivio autore: apri una finestra del browser in incognito e visita
https://tuosito.it/?author=1. Se la protezione funziona, dovresti essere reindirizzato alla homepage invece di vedere una pagina di archivio autore con il nome utente nell'URL. - Test REST API: apri
https://tuosito.it/wp-json/wp/v2/usersnel tuo browser senza essere autenticato. Dovresti vedere un errore 404 o una risposta vuota, non un elenco di utenti con i loro nomi utente. - Test pagina di login: prova ad accedere con un nome utente che non esiste, quindi prova con un nome utente reale ma una password errata. Entrambi dovrebbero produrre lo stesso messaggio di errore.
- Scansione InspectWP: esegui una nuova scansione InspectWP del tuo sito. La sezione sicurezza controlla la presenza di vulnerabilità di enumerazione degli utenti e indica se le tue protezioni funzionano correttamente.
Ulteriori suggerimenti di hardening
La prevenzione dell'enumerazione degli utenti funziona meglio come parte di una strategia di sicurezza più ampia. Considera queste misure aggiuntive:
- Evita "admin" come nome utente: se il tuo account amministratore si chiama ancora "admin", crea un nuovo account amministratore con un nome utente unico, assegnagli tutti i contenuti e poi elimina il vecchio account "admin".
- Usa password forti e uniche: anche se un aggressore scopre un nome utente, una password forte rende impraticabili gli attacchi brute force. Usa un password manager per generare e memorizzare password complesse.
- Abilita l'autenticazione a due fattori: la 2FA aggiunge un secondo livello di protezione. Anche se sia il nome utente che la password vengono compromessi, l'aggressore non può comunque accedere senza il secondo fattore.
- Limita i tentativi di login: plugin come Limit Login Attempts Reloaded o Loginizer possono bloccare gli indirizzi IP dopo un numero impostato di tentativi di login falliti.