Ataques e força bruta

Como detectar e deter um ataque de força bruta no WordPress

O ataque de força bruta no WordPress explicado

Todo site WordPress público recebe tentativas automatizadas de login, muitas vezes desde o primeiro dia no ar. A maioria fracassa, mas elas consomem recursos, e basta uma senha fraca ou reutilizada para que uma única dê certo. Este artigo explica as três grandes variantes do ataque, como reconhecê-las nos seus logs e quais proteções realmente mudam o resultado.

Do que estamos falando exatamente

A documentação oficial do WordPress define o ataque de força bruta como a tentativa automatizada e repetida de pares usuário/senha até que um deles funcione. Ela destaca dois pontos que costumam ser esquecidos: esses ataques geralmente partem de redes de máquinas invadidas (botnets), ou seja, de um número enorme de endereços, e, mesmo quando fracassam, podem sobrecarregar o servidor.

A escala está documentada. Em seu relatório anual de 2024, a Wordfence afirma ter bloqueado mais de 55 bilhões de tentativas de ataque a senhas (força bruta, credential stuffing e variantes), vindas de quase 136 milhões de endereços IP distintos. O mesmo relatório aponta uma queda constante desses ataques ao longo do ano, que atribui em parte às proteções das empresas de hospedagem e a melhores práticas de senha. Menos frequentes não quer dizer inofensivos: eles continuam sendo o ruído de fundo de qualquer site WordPress.

As três variantes que você precisa conhecer

Três colunas: ataque de dicionário, credential stuffing e força bruta distribuída, com a defesa mais eficaz para cada um
Três variantes, três defesas prioritárias diferentes.

O ataque de dicionário

O robô testa listas de senhas comuns em um nome de usuário que ele acredita ser válido: admin, o nome do site ou o nome de um autor encontrado no próprio site. É a forma mais antiga e a menos eficaz contra uma senha longa e aleatória. Ela ainda funciona contra senhas curtas, variações do nome do site ou palavras do dicionário seguidas de um ano.

O credential stuffing

Aqui, nenhuma senha é adivinhada. A OWASP descreve o credential stuffing como a injeção automatizada de pares usuário/senha roubados em vazamentos de outros serviços. Se um administrador usa a mesma senha na conta do WordPress e em um serviço que vazou, o atacante entra na primeira tentativa. Nenhuma regra de complexidade protege contra esse caso: só uma senha nunca reutilizada e a autenticação de dois fatores o neutralizam.

A força bruta distribuída

As botnets dividem a lista entre milhares de endereços. Cada endereço faz apenas algumas tentativas, às vezes com vários minutos de intervalo. Um bloqueio simples do tipo “5 falhas e o endereço é bloqueado” detém uma parte, mas não tudo. Por isso, as proteções eficazes combinam várias camadas, do servidor até a conta.

VarianteO que o atacante temSinal nos logsO que a detém
DicionárioUm nome de usuário provável, uma lista de senhasMuitas falhas a partir de poucos endereçosSenha longa e única, limitação de tentativas
Credential stuffingPares roubados em outros lugaresPoucas tentativas por conta, muitas vezes endereços de e-mailSenha não reutilizada, autenticação de dois fatores
DistribuídaUma botnetFalhas espalhadas por milhares de endereçosFiltragem na borda (firewall, CDN), autenticação de dois fatores
Comparação das três variantes

Por que wp-login.php e xmlrpc.php

Dois arquivos aceitam um nome de usuário e uma senha sem passar por uma página HTML intermediária.

  • /wp-login.php: a página de login padrão. O endereço é o mesmo em todos os sites WordPress, então o robô não precisa procurar nada.
  • /xmlrpc.php: a interface XML-RPC, usada historicamente por aplicativos de publicação remota. A documentação do WordPress a descreve como alvo frequente de força bruta e recomenda desativá-la se você não a usa. Detalhamos esse assunto em um artigo dedicado ao XML-RPC.

Um terceiro fator ajuda o atacante: conhecer o nome de usuário. Por padrão, a mensagem de erro do WordPress distingue um nome de usuário desconhecido (“não está registrado neste site”) de uma senha incorreta para um usuário existente. Esse comportamento aparece no código de wp-includes/user.php. Somado aos outros meios de enumeração de contas, ele permite que o robô concentre as tentativas em nomes de usuário reais.

O que você vê nos seus logs

O log de acesso do servidor (Apache, Nginx ou LiteSpeed, muitas vezes disponível no painel da hospedagem) é a melhor testemunha. Um ataque se parece com isto (endereços de documentação, reservados para exemplos):

203.0.113.24 - - [12/Oct/2026:03:14:07 +0200] "POST /wp-login.php HTTP/1.1" 200 4512 "-" "Mozilla/5.0 ..."
198.51.100.9 - - [12/Oct/2026:03:14:09 +0200] "POST /xmlrpc.php HTTP/1.1" 200 412 "-" "Mozilla/5.0 ..."
203.0.113.77 - - [12/Oct/2026:03:14:12 +0200] "POST /wp-login.php HTTP/1.1" 200 4512 "-" "Mozilla/5.0 ..."

O ponto-chave é o código de resposta. Uma falha em wp-login.php retorna status 200: a página exibe de novo o formulário com a mensagem de erro. Um login bem-sucedido retorna um redirecionamento 302 para a administração (função wp_safe_redirect(), cujo status padrão é 302). Em xmlrpc.php, a falha também é um status 200: o erro fica no corpo da resposta XML.

Diagrama: um robô envia POST para wp-login.php e xmlrpc.php; as falhas retornam 200, um login bem-sucedido retorna 302
As falhas parecem páginas normais; o sucesso é um redirecionamento.

Para ler um log rapidamente, procure:

  • um grande número de POST para /wp-login.php ou /xmlrpc.php em pouco tempo;
  • user agents idênticos em endereços muito diferentes;
  • um 302 depois de uma série de 200, sobretudo se vier de um endereço que você não conhece;
  • picos de uso de processador ou de memória do PHP sempre nos mesmos horários.

Um 302 suspeito justifica verificar imediatamente a lista de usuários administradores, os últimos logins e os plugins instalados recentemente.

As defesas, por ordem de eficácia

Nenhuma medida isolada basta, mas nem todas têm o mesmo peso.

  1. Senhas longas, únicas e guardadas em um gerenciador de senhas. As recomendações do NIST (SP 800-63B-4, agosto de 2025) exigem pelo menos 15 caracteres para uma senha usada sozinha, a comparação com uma lista de senhas comprometidas e o fim das trocas periódicas obrigatórias.
  2. A autenticação de dois fatores, no mínimo para os administradores. A documentação do WordPress lembra que o núcleo não a oferece: é preciso um plugin ou um provedor de identidade. Com ela, uma senha descoberta ou roubada já não basta.
  3. A limitação de tentativas por endereço IP, para frear os ataques de dicionário. Ela tem limites diante de botnets e proxies, que detalhamos no nosso artigo sobre a limitação de tentativas de login.
  4. A filtragem na borda: firewall da hospedagem, CDN ou regras de servidor que limitam a taxa de requisições em wp-login.php e xmlrpc.php. A documentação do WordPress explica que o bloqueio no nível da aplicação ainda consome PHP a cada requisição, enquanto uma filtragem na borda também protege a carga do servidor.
  5. Fechar o que não é usado: o XML-RPC, se nenhum aplicativo depende dele, e nada de conta chamada admin.
  6. Mudar o endereço de login: isso não protege uma senha fraca, mas elimina muito ruído dos logs e reduz a carga.

Um ponto tranquilizador: desde o WordPress 6.8, as senhas dos usuários são armazenadas com hash bcrypt em vez de phpass. Isso não muda nada nas tentativas on-line pelo formulário, mas torna muito mais cara a quebra dos hashes caso o banco de dados seja roubado.

MedidaContra o dicionárioContra o credential stuffingContra a carga do servidor
Senha longa e únicaSimSim (se nunca for reutilizada)Não
Autenticação de dois fatoresSimSimNão
Limitação de tentativas por IPEm grande parteParcialmentePouco
Filtragem na borda (firewall, CDN)ParcialmenteParcialmenteSim
Endereço de login personalizadoReduz o ruídoReduz o ruídoSim, para wp-login.php
O que cada medida protege

Com o WP Masquerade

A versão gratuita do WP Masquerade permite definir um endereço de login personalizado e fechar o wp-login.php para visitantes anônimos depois de testar o novo endereço, além de bloquear o XML-RPC e os pingbacks. As armadilhas para robôs contam as requisições a esses endereços fechados, o que dá uma medida concreta do ruído evitado. O WP Masquerade Pro acrescenta a limitação de tentativas de login por endereço IP e a autenticação de dois fatores obrigatória por função. Nenhuma dessas funções substitui uma senha única: elas reduzem a exposição e o custo de um ataque.

Vídeo em francês (WPMarmite): por que a conta “admin” é o primeiro alvo dos robôs e como protegê-la.
Em inglês: como funcionam os ataques de força bruta no WordPress e as principais proteções (vídeo de um desenvolvedor de plugin de limitação).

Para lembrar

  • Os ataques de força bruta miram sobretudo wp-login.php e xmlrpc.php, a partir de milhares de endereços.
  • O credential stuffing dá certo na primeira tentativa se uma senha for reutilizada: a complexidade não basta.
  • Nos logs, uma falha retorna 200 e um login bem-sucedido retorna 302.
  • Prioridades: senha única e longa, autenticação de dois fatores para os administradores e, depois, limitação e filtragem na borda.

Fontes

Outras fontes consultadas: páginas oficiais dos fornecedores e banco de dados Wordfence.

Segurança WordPress, sem ruído

Um e-mail quando importa: novos ataques observados, atualizações do plugin e guias práticos. Sem spam, cancelamento com um clique.

Comece de graça e mude para o Pro quando estiver pronto

A versão gratuita já oculta o WordPress e muda o endereço da página de login. O Pro acrescenta aliases, verificação em duas etapas e monitoramento.