A enumeração de usuários é uma técnica de reconhecimento que atacantes usam para descobrir nomes de usuário válidos em seu site WordPress. Tipicamente é o primeiro passo antes de um ataque de força bruta. Se um atacante conhece o nome de usuário do seu administrador, ele só precisa adivinhar a senha. Se ele não conhece o nome de usuário, a superfície de ataque é significativamente maior. Bloquear a enumeração força os atacantes a adivinhar tanto o nome de usuário quanto a senha, tornando um ataque bem-sucedido muito menos provável.
Como atacantes enumeram nomes de usuário do WordPress
Há vários métodos que atacantes usam para descobrir nomes de usuário em um site WordPress. Entender cada um ajuda a saber contra o que se proteger.
- URLs de arquivo de autor: Por padrão, o WordPress cria arquivos de autor em
/author/usuario/. Um atacante pode visitar?author=1,?author=2, e assim por diante. O WordPress redireciona para a URL do arquivo de autor correspondente, que contém o nome de usuário em texto simples. Scripts automatizados podem percorrer IDs de autor muito rapidamente para construir uma lista completa de nomes de usuário. - Endpoint de usuários da REST API: A REST API do WordPress expõe um endpoint
/wp-json/wp/v2/usersque retorna um array JSON com todos os usuários que publicaram posts. Isso inclui nomes de usuário, nomes de exibição e IDs de usuário. Nenhuma autenticação é exigida para acessar esse endpoint por padrão. - Mensagens de erro de login: Quando você insere um nome de usuário inválido na página de login do WordPress, a mensagem de erro diz algo como "O nome de usuário X não está registrado." Quando você insere um nome de usuário válido mas uma senha errada, ela diz "A senha que você inseriu para o nome de usuário X está incorreta." Essa diferença informa ao atacante se um nome de usuário existe.
- Respostas oEmbed: Os links de descoberta oEmbed do WordPress no código-fonte da página podem revelar informações de autor quando outros sites tentam incorporar seu conteúdo.
- XML-RPC: O endpoint
xmlrpc.phppode ser usado para testar combinações de nome de usuário/senha por meio do métodowp.getUsersBlogs. Embora isso seja mais um vetor de força bruta, ele confirma nomes de usuário válidos por meio de respostas de erro diferentes.
Por que a enumeração de usuários importa para a segurança
Por si só, conhecer um nome de usuário não compromete seu site. Mas torna tudo o mais fácil para um atacante. Considere um ataque de força bruta: se o atacante tem que adivinhar tanto o nome de usuário quanto a senha, o número de combinações possíveis é enorme. Se ele já sabe que o nome de usuário é "admin" ou "joao", precisa focar apenas na senha. Combinado com listas de senhas comuns, isso pode levar a uma invasão bem-sucedida em minutos, em vez de anos.
Adicionalmente, nomes de usuário descobertos podem ser usados em ataques de phishing direcionados. Se um atacante sabe que sua conta de administrador é "sara.silva", ele pode criar e-mails de engenharia social mais convincentes.
Bloquear enumeração via arquivo de autor
Adicione esse código ao functions.php do seu tema ou a um plugin personalizado. Ele intercepta requisições com o parâmetro ?author=N e redireciona para a página inicial em vez de revelar o nome de usuário:
/**
* 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');Isso lida com o método de enumeração mais comum. A verificação is_admin() garante que a funcionalidade do backend não seja afetada. O redirecionamento usa um código de status 301, que diz aos motores de busca para atualizar seu índice (caso URLs de arquivo de autor estivessem previamente indexadas).
Desativar o endpoint de usuários da REST API
O código a seguir remove o endpoint de usuários da REST API para visitantes não logados. Usuários autenticados (como administradores e editores) ainda podem acessá-lo, o que preserva a funcionalidade para o editor de blocos e outras ferramentas administrativas:
/**
* 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;
}); Após adicionar esse código, requisições não autenticadas a /wp-json/wp/v2/users retornarão um erro 404 em vez de listar seus usuários.
Sanitizar mensagens de erro de login
O WordPress exibe mensagens de erro diferentes para os cenários de "nome de usuário inválido" e "senha errada". Isso revela se um determinado nome de usuário existe no site. A correção é simples: retornar a mesma mensagem genérica para todas as falhas de login:
/**
* Use a generic login error message
*/
add_filter('login_errors', function() {
return 'Invalid username or password.';
});Com essa alteração, um atacante não pode determinar se uma tentativa de login falhou por causa de um nome de usuário errado ou de uma senha errada. Ambos os casos produzem a mesma resposta.
Remover links de descoberta oEmbed
O WordPress inclui links de descoberta oEmbed no head HTML das suas páginas. Esses links podem expor informações de autor quando outros sites tentam incorporar seu conteúdo. Remova-os com uma única linha:
remove_action('wp_head', 'wp_oembed_add_discovery_links');Isso não afeta sua capacidade de incorporar conteúdo de outros sites. Apenas impede que outros sites descubram automaticamente conteúdo incorporável em seu site.
Bloquear enumeração de autor via .htaccess
Se você usa Apache, pode adicionar um redirecionamento no nível do servidor que bloqueia a enumeração de autor antes mesmo que o WordPress carregue. Isso é mais eficiente que uma solução baseada em PHP porque não requer processamento PHP:
# Block user enumeration via author parameter
RewriteCond %{QUERY_STRING} ^author=\d+ [NC]
RewriteRule .* /? [R=301,L]Coloque isso em seu arquivo .htaccess antes das regras de rewrite do WordPress. Ele captura qualquer requisição com um parâmetro de query author= contendo um número e redireciona para a página inicial.
Soluções baseadas em plugin
Se você prefere não adicionar código manualmente, vários plugins de segurança lidam com a prevenção de enumeração de usuários:
- Stop User Enumeration: Um plugin focado e leve que bloqueia especificamente varreduras de autor e listagem de usuários da REST API. Faz uma coisa e a faz bem.
- iThemes Security (Solid Security): Uma suíte abrangente de segurança que inclui proteção contra enumeração de usuários junto com recursos como autenticação de dois fatores, detecção de alteração de arquivos e proteção contra força bruta. O bloqueio de enumeração é encontrado na seção "WordPress Tweaks".
- Wordfence: Principalmente um firewall e scanner de malware, mas suas regras de firewall podem bloquear tentativas de enumeração. A versão gratuita inclui proteção básica; a versão premium adiciona regras de firewall em tempo real.
- All In One WP Security: Um plugin gratuito e amigável para iniciantes com uma opção de prevenção de enumeração de usuários em User Accounts > WP Username. Também oferece firewall e recursos de bloqueio de login.
Teste a enumeração em seu próprio site
Antes e depois de implementar essas proteções, você deve testar se a enumeração ainda funciona. Veja como:
- Teste de arquivo de autor: Abra uma janela privada do navegador e visite
https://seusite.com/?author=1. Se a proteção funciona, você deve ser redirecionado à página inicial em vez de ver uma página de arquivo de autor com o nome de usuário na URL. - Teste da REST API: Abra
https://seusite.com/wp-json/wp/v2/usersem seu navegador sem estar logado. Você deve ver um erro 404 ou uma resposta vazia, não uma lista de usuários com seus nomes de usuário. - Teste da página de login: Tente fazer login com um nome de usuário que não existe e depois com um nome de usuário real e uma senha errada. Ambos devem produzir a mesma mensagem de erro.
- Varredura do InspectWP: Execute uma nova varredura do InspectWP em seu site. A seção de segurança verifica vulnerabilidades de enumeração de usuários e indicará se suas proteções estão funcionando corretamente.
Dicas adicionais de hardening
A prevenção de enumeração de usuários funciona melhor como parte de uma estratégia de segurança mais ampla. Considere essas medidas complementares:
- Evite "admin" como nome de usuário: Se sua conta de administrador ainda se chama "admin", crie uma nova conta de administrador com um nome de usuário único, atribua todo o conteúdo a ela e exclua a antiga conta "admin".
- Use senhas fortes e únicas: Mesmo que um atacante descubra um nome de usuário, uma senha forte torna ataques de força bruta impraticáveis. Use um gerenciador de senhas para gerar e armazenar senhas complexas.
- Habilite a autenticação de dois fatores: 2FA adiciona uma segunda camada de proteção. Mesmo que tanto o nome de usuário quanto a senha sejam comprometidos, o atacante ainda não pode fazer login sem o segundo fator.
- Limite tentativas de login: Plugins como Limit Login Attempts Reloaded ou Loginizer podem bloquear endereços IP após um número definido de tentativas de login mal sucedidas.