Segurança web

Vulnerabilidade XSS

Definição

Uma vulnerabilidade XSS (cross-site scripting) permite que um atacante faça o próprio JavaScript ser executado na página que outro visitante está vendo. O script age então no navegador da vítima com os direitos do site: ações em nome dela, leitura dos dados exibidos ou redirecionamento.

Vulnerabilidade XSS, Segurança web

A sigla XSS vem do inglês cross-site scripting; usa-se X em vez de C para não confundir com as folhas de estilo CSS. É uma falha de injeção: o site insere na página um dado vindo de fora sem neutralizá-lo, e o navegador o interpreta como código. O MITRE a cataloga com o identificador CWE-79. Como o script parece vir do próprio site, o navegador lhe dá a mesma confiança que ao resto da página.

Como funciona um ataque XSS

Tudo começa com um valor que o atacante controla: um parâmetro de URL, um campo de formulário, um comentário, um cabeçalho HTTP gravado em estatísticas. Se o código exibe esse valor bruto, uma string como <script>…</script> ou um atributo onerror="…" se torna executável. O script pode então ler o conteúdo da página, enviar requisições em nome da pessoa logada, alterar o que ela vê ou redirecioná-la para outro site.

Esquema em cinco etapas de um XSS armazenado: o atacante injeta uma tag script em um campo, o site a grava, um administrador abre a tela correspondente, a página devolve o script sem escape e o script age na sessão do administrador
Um XSS armazenado espera a vítima: basta que um administrador exiba o dado armadilhado.

Em um site WordPress, o alvo preferido é o administrador. Um script executado na sessão dele pode criar uma conta, instalar um plugin ou mudar uma configuração, sem nunca conhecer a senha: o próprio navegador envia os cookies de login com cada requisição.

Os tipos de XSS

  • XSS armazenado (persistente): o script é gravado no servidor, no banco de dados por exemplo, e devolvido a cada exibição. Não se exige nenhuma ação especial da vítima, basta abrir a página.
  • XSS refletido: o script viaja na requisição, muitas vezes um link armadilhado, e o servidor o copia imediatamente na resposta. A vítima precisa clicar.
  • XSS baseado em DOM: é o JavaScript da página que insere um dado não confiável, como o fragmento de uma URL. O servidor pode não ver nada passar.

A OWASP também descreve o XSS “cego” (blind XSS): uma variante armazenada que dispara mais tarde, em uma interface que o atacante não vê. É exatamente o caso dos logs, estatísticas e formulários recebidos que se consultam no Painel. Os exemplos reais de XSS em plugins populares mostram que esse cenário não tem nada de teórico.

Vídeo: “Como Funciona o XSS (Cross-Site Scripting)?” (Guia Anônima)

No WordPress: escapar no último momento

A documentação para desenvolvedores do WordPress define uma regra simples: escapar o mais tarde possível, no momento em que o dado é exibido, com a função que corresponde ao contexto.

Contexto de exibiçãoFunção
Texto dentro de um elemento HTMLesc_html()
Valor de um atributoesc_attr()
URL em href ou srcesc_url()
JavaScript inlineesc_js()
Conteúdo de um textareaesc_textarea()
HTML com algumas tags permitidaswp_kses(), wp_kses_post()
<h2><?php echo esc_html( $titulo ); ?></h2>
<a href="<?php echo esc_url( $link ); ?>" title="<?php echo esc_attr( $info ); ?>">Ver</a>

Validar e sanitizar as entradas continua sendo útil, mas não substitui esse escape na saída: um mesmo valor pode ser exibido em vários contextos.

Como se proteger sem mexer no código

  • Atualizar rapidamente plugins e temas: os XSS explorados em massa costumam mirar versões já corrigidas.
  • Manter poucas contas com privilégios e excluir as que não são mais usadas.
  • Ficar de olho no surgimento de novos administradores, sinal frequente de um XSS explorado.
  • Adicionar uma política de segurança de conteúdo, sabendo que uma versão rígida, que proíbe scripts inline, é difícil de manter com o WordPress. Nosso guia de cabeçalhos de segurança HTTP para WordPress detalha as opções.
  • Um firewall de aplicação web pode barrar payloads conhecidos, sem garantia contra uma variante inédita.

O WP Masquerade Pro envia cabeçalhos de segurança, incluindo uma CSP básica opcional. Essa CSP não restringe os scripts: portanto, não bloqueia um XSS. O WP Masquerade não é um firewall de aplicação nem um corretor de código; só a atualização do componente com defeito fecha a falha.

Erros comuns

  • Confundir XSS e CSRF: o segundo faz o navegador enviar uma requisição forjada, sem executar script na página. Já um XSS permite contornar as proteções anti-CSRF, pois o script lê os tokens da página.
  • Achar que um dado é “interno” porque aparece no painel de administração: um cabeçalho HTTP ou uma URL visitada vêm de fora.
  • Usar esc_html() em um atributo ou esc_attr() para uma URL: cada contexto tem a sua função.
  • Pensar que a proteção contra injeção de SQL basta: um dado bem gravado no banco pode continuar perigoso na exibição.

Para saber mais

  • Artigo Como configurar os cabeçalhos de segurança HTTP no WordPress: CSP, HSTS e os demais
  • Página Cabeçalhos de segurança para WordPress

Fontes

  1. OWASP: Cross Site Scripting (XSS) (link externo, abre em uma nova aba)
  2. MITRE CWE-79: Improper Neutralization of Input During Web Page Generation (Cross-site Scripting) (link externo, abre em uma nova aba)
  3. WordPress Developer Resources: Escaping Data (link externo, abre em uma nova aba)

Todas as definições

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.