Como corrigir vulnerabilidade SQL Injection no WordPress
O que é a vulnerabilidade SQL Injection?
SQL Injection (SQLi) é uma falha em que dados controlados pelo atacante entram numa consulta ao banco sem tratamento, permitindo que ele altere o comando SQL executado. No WordPress, costuma surgir quando um plugin ou tema monta consultas concatenando entrada do usuário direto na string, em vez de usar consultas preparadas. Pela brecha, o invasor pode ler senhas e hashes da tabela wp_users, criar um admin oculto, exfiltrar dados de clientes ou apagar tabelas. É uma das falhas mais graves justamente porque dá acesso direto ao banco, o coração do site. A correção real é parametrizar a consulta, não filtrar o sintoma.
Como identificar
- O scanner de segurança ou o WPScan reporta “SQL Injection” em um plugin ou tema instalado.
- No log do servidor aparecem requisições com payloads como “‘ OR 1=1 –” ou “UNION SELECT” em parâmetros.
- Erros do banco vazam na tela, como “You have an error in your SQL syntax”, ao manipular uma URL.
- Surgem usuários administradores que você não criou ou posts/registros alterados sem explicação.
Como prevenir
- Use sempre $wpdb->prepare() com placeholders em qualquer consulta que receba entrada do usuário
- Mantenha plugins e temas atualizados e remova os abandonados sem correção de segurança
- Use um WAF que bloqueie payloads de SQL Injection e limite as permissões do usuário do banco
Causa
- Plugin ou tema que monta consultas SQL concatenando entrada do usuário direto na string da query.
- Uso de $wpdb->query() com variável de $_GET ou $_POST sem passar por $wpdb->prepare().
- Plugin desatualizado com uma vulnerabilidade SQLi conhecida e já catalogada (CVE/WPScan) sem correção aplicada.
- Parâmetro numérico (id de post, página) usado na consulta sem validação nem cast para inteiro.
- Código antigo que confia em escape manual frágil em vez de placeholders preparados pelo wpdb.
Como resolver
- Identifique a origem da falha: rode o WPScan ou um scanner de segurança para descobrir qual plugin/tema tem a vulnerabilidade SQLi reportada e em qual versão ela foi corrigida.
- Atualize o componente vulnerável: na maioria dos casos a brecha já tem correção. Atualize para a versão que fecha o SQL Injection; se o plugin foi abandonado, troque por uma alternativa mantida.
- Use consultas preparadas no seu código: se a falha está em código próprio, reescreva toda consulta que recebe entrada do usuário usando $wpdb->prepare() com placeholders, nunca concatenação.
- Valide e tipe os parâmetros: force inteiro em ids com absint() e use allowlist para nomes de coluna/ordenação, que não podem ir em placeholder. Rejeite qualquer valor fora do esperado.
- Audite o banco e troque as credenciais: verifique usuários admin desconhecidos, revise wp_options, regenere as SALT keys do wp-config.php e troque as senhas de admin e do banco para invalidar acessos do invasor.
// Errado: concatena a entrada na query, abrindo SQL Injection
global $wpdb;
$id = $_GET['id'];
$wpdb->query( "SELECT * FROM {$wpdb->posts} WHERE ID = $id" );
// Certo: consulta preparada com placeholder (%d para inteiro, %s para string)
$id = absint( $_GET['id'] );
$resultado = $wpdb->get_results(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE ID = %d", $id )
);
// String tambem vai em placeholder, nunca concatenada
$autor = $_GET['autor'];
$wpdb->get_results(
$wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE post_author = %s", $autor )
);














