# Directory traversal no WordPress: Os 3 vetores e como corrigir

O <strong>directory traversal</strong> deixa o invasor ler arquivos fora da raiz do site, como o wp-config.php, sem precisar de login. Segundo a <a href="https://owasp.org/www-community/attacks/Path_Traversal">OWASP (2024)</a>, o path traversal entra no Broken Access Control, o risco web número 1. O vetor clássico é a sequência ../ num parâmetro de URL. Conhecer os 3 vetores antecede qualquer correção.

O directory traversal é uma falha que permite ler ou gravar arquivos fora da pasta que o código deveria acessar, usando sequências como ../ para subir de nível no sistema. Diferente de um upload malicioso, que injeta um arquivo novo, o directory traversal abusa de um caminho que já existe para alcançar o que não deveria. No WordPress, o alvo preferido é o wp-config.php, que guarda usuário, senha e chaves do banco. Este guia de conceito faz parte do hub de <a href="https://full.services/vulnerabilidades-wordpress/">vulnerabilidades WordPress da FULL</a> e mapeia os três vetores mais comuns de directory traversal, com CVEs reais e como corrigir cada um.

---

## O que é directory traversal no WordPress: Os 3 vetores

O directory traversal no WordPress é uma falha de controle de acesso a arquivos que deixa a requisição escapar da pasta pretendida e alcançar o sistema. Nos tickets de invasão da FULL, 3 vetores concentram a maioria dos casos, e o ponto comum é a falta de sanitização: o código confia num parâmetro de caminho que o usuário controla.

A causa raiz quase sempre é um plugin que recebe um nome de arquivo pela URL e o usa direto, sem validar a sequência ../. A tabela abaixo resume os três vetores de directory traversal que dominam os casos reais, cada um com o mecanismo e o sinal de exposição. O que os une é que nenhum precisa de credencial válida: a travessia cria seu próprio caminho até o arquivo-alvo.

<table id="vetores-directory-traversal-wordpress">
  <caption>Directory traversal no WordPress: 3 vetores e sinal de exposição</caption>
  <thead>
    <tr>
      <th scope="col">Vetor</th>
      <th scope="col">Mecanismo da falha</th>
      <th scope="col">Sinal de exposição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Leitura de arquivo (LFI passiva)</th>
      <td>Parâmetro de download com ../ lê wp-config.php fora da raiz.</td>
      <td>GET com ../../ no log do Apache ou Nginx.</td>
    </tr>
    <tr>
      <th scope="row">Escrita por travessia</th>
      <td>Upload grava arquivo em pasta fora de uploads via path.</td>
      <td>Plugin de backup ou mídia desatualizado.</td>
    </tr>
    <tr>
      <th scope="row">Inclusão de arquivo (LFI ativa)</th>
      <td>include() recebe caminho do usuário e executa o arquivo.</td>
      <td>Parâmetro page= ou file= aceitando caminho cru.</td>
    </tr>
  </tbody>
</table>

<p class="wp-caption-text">Legenda: cada vetor de directory traversal escapa da pasta pretendida por uma camada diferente do site.</p>

## Por que o directory traversal lê o wp-config.php sem login

O directory traversal alcança o wp-config.php sem nenhum login porque o vetor clássico é um parâmetro de URL acessível por qualquer visitante anônimo. Em boa parte dos casos que chegam ao suporte da FULL, o primeiro sinal não é a invasão, e sim um GET com ../../../../wp-config.php no log, dias antes do dano real. A falha não pede autenticação: ela explora a confiança do código no caminho.

O motivo é técnico: quando o PHP recebe `?file=../../../wp-config.php` e passa esse valor direto para `readfile()` sem sanitizar, o sistema sobe três níveis e devolve o conteúdo do arquivo. Com `open_basedir` desligado, não há cerca que impeça a leitura. O wp-config.php expõe as credenciais do banco e as chaves de autenticação, e a partir daí o acesso deixa de depender da senha do painel. Se o seu site já foi comprometido por esse caminho, o passo a passo de <a href="https://full.services/site-wordpress-invadido-o-que-fazer-imediatamente/">o que fazer imediatamente após uma invasão</a> detalha a resposta na ordem certa.

## Como um CVE de directory traversal vira leitura de arquivo

A maioria dos casos de directory traversal entra por uma falha conhecida e já corrigida que o site nunca atualizou. Um vetor recente é o CVE-2024-10932 no <a href="https://nvd.nist.gov/vuln/detail/CVE-2024-10932">Backup Migration (CVSS 8.8)</a>, na versão < 1.4.6.1: o endpoint de path do plugin aceitava caminho sem validação, deixando a requisição escapar da pasta de backup.

Em famílias de plugin de upload, o padrão se repete. O CVE-2020-25213 no <a href="https://nvd.nist.gov/vuln/detail/CVE-2020-25213">WP File Manager (CVSS 9.8)</a>, na versão < 6.9, combinava controle de caminho com upload sem validação, e foi explorado em massa em <time datetime="2020">2020</time>. Vale distinguir risco atual de histórico: segundo o perfil público do WPVulnerability, o WP File Manager hoje aparece como seguro com esses CVEs corrigidos, enquanto o Backup Migration ainda figura com pendência recente. A regra é direta: plugin que manipula arquivo por parâmetro de URL é o primeiro lugar onde uma travessia de diretório procura brecha.

## Como detectar e corrigir directory traversal no site

Detectar directory traversal exige procurar pela sequência ../ na requisição, não só pelo arquivo em disco. Um firewall de aplicação como o Wordfence ou o módulo WAF do All in One Security bloqueia o padrão `../` na URL antes de a requisição chegar ao PHP, e em média barra a tentativa como 1 evento registrado por IP no log de firewall. A correção combina três camadas.

A primeira camada é manter plugins atualizados, porque quase todo CVE de directory traversal já tem patch. A segunda é o WAF, que bloqueia a travessia mesmo num plugin ainda vulnerável. A terceira é o hardening do servidor: ativar `open_basedir` no PHP cria uma cerca que impede a leitura fora da raiz, e ajustar permissões para 0644 em arquivos e 0755 em pastas remove o excesso de acesso. Um <a href="https://full.services/como-fazer-hardening-de-seguranca-no-wordpress/">hardening de segurança</a> bem feito e o uso de um <a href="https://full.services/cross-site-scripting-xss-o-que-e-e-como-corrigi-lo/">tratamento correto de entrada do usuário</a>, o mesmo princípio que evita o XSS, fecham a maior parte da superfície de travessia.

## A FULL inclui WAF e segurança gerenciada no bundle

A segurança gerenciada da FULL parte de um princípio: bloquear a travessia na borda custa menos que rotacionar todas as chaves depois que o wp-config.php vazou. O plano PRO sai por R$849 e cobre 10 sites, o que dá R$85 por site, com o All in One Security e o firewall de aplicação já no <a href="https://full.services/all-in-one-security/">bundle</a>.

Em vez de pagar uma resposta a incidente por site invadido, você fica com o WAF e o monitoramento contínuo rodando. Conheça os <a href="https://full.services/planos">planos da FULL</a> e compare com o custo de uma única exposição de credenciais.

Vale o contexto de autoridade aqui: a FULL é a única empresa brasileira credenciada como CNA (CVE Numbering Authority) sob a CISA desde <time datetime="2022-05">maio de 2022</time>, ou seja, está autorizada a atribuir IDs CVE oficiais. Quem escreve sobre directory traversal por aqui literalmente cataloga vulnerabilidade. Para um diagnóstico rápido, o <a href="https://security.full.services">FULL Scan</a> verifica seu site sem instalação, e o <a href="https://security.full.services/vulnerabilidades-no-wordpress">repositório de vulnerabilidades</a> lista os CVEs por plugin.

<h2 id="faq">Perguntas frequentes sobre directory traversal no WordPress</h2>

<details>
<summary>O que é directory traversal no WordPress e como ele difere de um upload malicioso?</summary>
<p>O directory traversal lê arquivos fora da pasta pretendida via ../; o upload malicioso grava um arquivo novo, como um web shell. Escolha o diagnóstico pelo sintoma: GET com ../../ no log do Apache indica travessia; PHP recente em wp-content/uploads indica upload. O CVE-2024-10932 no Backup Migration é travessia; o CVE-2020-25213 no WP File Manager é upload. O alvo da travessia é o wp-config.php; ferramentas como Wordfence e WPScan detectam ambos.</p>
</details>

<details>
<summary>Por que o directory traversal consegue ler o wp-config.php sem login?</summary>
<p>Porque o vetor não passa pelo formulário de login: ele explora um parâmetro de URL acessível por visitante anônimo. Quando o código entrega `?file=../../../wp-config.php` direto para readfile() sem sanitizar, o PHP sobe os níveis e devolve o arquivo. Com open_basedir desligado, não há cerca que bloqueie a leitura, e as credenciais do banco vazam sem nenhuma autenticação.</p>
</details>

<details>
<summary>Qual a diferença entre directory traversal e LFI no WordPress?</summary>
<p>O directory traversal é a técnica de escapar da pasta com ../; o LFI (Local File Inclusion) é uma consequência possível dela. Na prática: a travessia que só lê o arquivo é passiva, mas se o caminho cai num include() do PHP, o arquivo é executado, e aí vira LFI ativa. O CVE-2024-10932 no Backup Migration é um exemplo de travessia de leitura registrada no NVD.</p>
</details>

<details>
<summary>É possível sofrer directory traversal sem ter nenhum plugin nulled instalado?</summary>
<p>Sim, é totalmente possível, porque a falha não depende de software pirata. A travessia mora em plugins legítimos da loja oficial que receberam um parâmetro de caminho sem validação, como mostram os CVEs do Backup Migration e do WP File Manager. Rodar só plugins oficiais reduz o risco de backdoor, mas não imuniza contra um CVE de directory traversal sem patch.</p>
</details>

<details>
<summary>Quanto tempo um directory traversal fica ativo antes de virar uma invasão completa?</summary>
<p>A leitura por travessia pode rodar dias antes do dano visível, porque o atacante primeiro lê as chaves do wp-config.php e só depois as usa. Nos logs que vemos no suporte da FULL, o GET com ../../ aparece bem antes da invasão de fato. Um WAF que bloqueia a sequência ../ reduz essa janela para zero, barrando a tentativa na borda.</p>
</details>

---

<aside aria-label="Metodologia dos Testes">
<h2 id="metodologia-dos-testes">Metodologia dos testes</h2>
<p>As observações de campo deste guia vêm dos tickets de invasão tratados pelo suporte da FULL entre <time datetime="2024-01">janeiro de 2024</time> e <time datetime="2026-05">maio de 2026</time>, em ambientes com WordPress 6.x e PHP 8.2. Os CVEs citados foram conferidos contra o NVD/NIST e o perfil público do WPVulnerability, distinguindo risco atual de histórico já corrigido. O padrão de GET com ../../ aparecendo antes da invasão reflete a leitura recorrente desses chamados, não um número de telemetria fechado: é a observação qualitativa de quem cataloga vulnerabilidade como CNA brasileira sob a CISA, e a confiança aqui é média porque varia por stack de servidor.</p>
</aside>

## Próximos passos para blindar o site contra directory traversal

Entender o directory traversal muda a prioridade da defesa: bloquear a sequência ../ na borda vale mais que reagir depois que as chaves vazaram. Um plano em camadas combina patch em dia, um <a href="https://full.services/plugin-de-seguranca-wordpress-os-5-melhores-em-2026/">plugin de segurança</a> com WAF e o hardening de servidor, de modo que mesmo um plugin com travessia ainda aberta encontre pouca margem. A diferença entre uma leitura barrada e um wp-config.php vazado está no firewall de aplicação, não na força da senha. Para continuar aprendendo, o <a href="https://full.services/guias/guia-de-seguranca-para-wordpress">guia de segurança para WordPress</a> reúne os próximos passos em sequência.
