Situação atual: PHP2Shell. Duas vulnerabilidades críticas do PHP (CVSS 9,2) permitem executar código malicioso sem autenticação. Patches disponíveis desde 21/10/2026.O que fazer agora →

Ficheiros de backup no webroot: .zip, .sql e .bak

Porque é que dumps de bases de dados, arquivos e cópias de segurança no diretório público estão entre as fugas de dados mais frequentes, como os encontrar, bloquear e esclarecer se foram consultados.

Atualizado em 6 min de leituraDesenvolvimento seguro

Em resumo: Os ficheiros de backup no webroot, ou seja, dumps de bases de dados (.sql), arquivos (.zip, .tar.gz) e cópias de segurança (.bak, .old, ~), podem ser descarregados por quem conheça ou adivinhe o nome do ficheiro. Procure regularmente esses ficheiros com find, mova as cópias de segurança para fora do diretório público, bloqueie extensões típicas no servidor web e verifique nos registos de acesso se já foram consultados.

O backup que se torna uma fuga

Pouco antes de uma atualização, alguém cria ainda uma cópia de segurança à pressa: backup.zip no diretório principal, ao lado datenbank.sql. A atualização corre bem, os ficheiros ficam. Meses depois ainda lá estão, com todo o código, todos os dados de clientes e as credenciais do site.

Este padrão está entre os achados mais frequentes nas auditorias a servidores web. Não precisa de um exploit nem de uma falha no PHP. Um servidor web serve a partir do webroot o que lá estiver, e arquivos ou ficheiros SQL não os executa, oferece-os para descarregamento.

Um arquivo do site contém não só dados, mas também o código com a configuração. Quem o descarrega pode procurar vulnerabilidades à vontade e conhece as credenciais da base de dados.

Os scanners automatizados procuram de forma dirigida nomes típicos como backup.zip, site.tar.gz ou dump.sql, muitas vezes combinados com o nome de domínio ou uma data. Quem acredita que um nome de ficheiro invulgar protege subestima a sistematização com que esta pesquisa decorre.

Que ficheiros estão em causa

Os ficheiros de backup no webroot surgem de várias formas:

Tipo Extensões típicas O que contêm
Dumps de bases de dados .sql, .sql.gz, .dump dados de clientes, encomendas, hashes de palavras-passe, definições
Arquivos do site .zip, .tar, .tar.gz, .tgz, .rar, .7z todo o código, configuração, uploads
Cópias de ficheiros individuais .bak, .old, .orig, .save, .php~, .copy muitas vezes ficheiros de configuração com credenciais
Resíduos de editores .swp, .swo, ~ no fim partes de ficheiros que estavam a ser editados
Cópias de segurança de plugins subpastas próprias no CMS cópias completas, por vezes com nomes adivinháveis

Particularmente delicadas são as cópias de ficheiros de configuração. O ficheiro original config.php é executado pelo servidor e o seu conteúdo permanece oculto. A cópia config.php.bak é entregue como texto, com a palavra-passe da base de dados.

Encontrar backups no webroot: pesquisa no servidor

A pesquisa seguinte lista os ficheiros suspeitos abaixo dos webroots, com data e tamanho. Adapte os caminhos ao seu servidor:

find /var/www /srv/www -type f \( \
  -iname '*.sql' -o -iname '*.sql.gz' -o -iname '*.dump' -o \
  -iname '*.zip' -o -iname '*.tar' -o -iname '*.tar.gz' -o -iname '*.tgz' -o \
  -iname '*.rar' -o -iname '*.7z' -o \
  -iname '*.bak' -o -iname '*.old' -o -iname '*.orig' -o -iname '*.save' -o \
  -iname '*~' -o -iname '*.swp' \) \
  -printf '%TY-%Tm-%Td  %10s  %p\n' 2>/dev/null | sort

Nem todos os resultados são um problema. Alguns arquivos estão deliberadamente disponíveis para descarregamento, por exemplo manuais. Mas cada ficheiro merece uma decisão consciente. Atenção especial aos ficheiros grandes e às pastas de plugins de backup. Em alojamento partilhado sem acesso à shell, ajuda a vista de ficheiros do painel de alojamento ou uma consulta por SFTP.

Agir de imediato

Se encontrar um dump de base de dados com dados de clientes no webroot, mova-o de imediato para fora do diretório público e guarde os registos de acesso antes de serem rodados. Só depois esclareça se o ficheiro foi consultado.

O ficheiro já foi descarregado?

A resposta está nos registos de acesso do servidor web. Procuram-se consultas bem-sucedidas, ou seja, estado 200, aos ficheiros encontrados:

# Consultas bem-sucedidas a extensões de backup típicas (formato de registo combined)
zgrep -hE '\.(sql|sql\.gz|zip|tar|tgz|gz|bak|old|7z|rar)[ ?]' /var/log/nginx/access.log* \
  | awk '$9 == 200 {print $4, $1, $7, $10}'

A saída mostra o momento, o endereço, o caminho e o tamanho da resposta. Se o tamanho transferido corresponder ao tamanho do ficheiro, o ficheiro foi carregado por inteiro. Até quando os registos recuam depende da rotação. Se não chegarem à data de criação do ficheiro, não é possível excluir uma consulta anterior. Isto é descrito em pormenor em Analisar os registos do servidor web após um ataque. Sem acesso aos registos em bruto, por exemplo em alojamento partilhado, peça ao fornecedor os registos do período em causa.

Se um dump com dados pessoais foi consultado ou isso não pode ser excluído, começa a verificação de um dever de notificação. Os princípios são resumidos em Dever de notificação segundo o RGPD: 72 horas após o incidente; a avaliação em cada caso cabe ao seu encarregado da proteção de dados. As credenciais de ficheiros consultados substitui-as em qualquer caso.

Plugins de backup, painéis e mudanças

Muitos achados devem-se a plugins de backup de CMS e lojas. Guardam muitas vezes as cópias de segurança numa subpasta do webroot, por vezes com nomes compostos por data e domínio, que se podem adivinhar. Verifique em cada plugin três definições: para onde é guardada a cópia? As cópias locais são apagadas depois do envio para um destino externo? A pasta local está protegida contra acesso direto?

As cópias de segurança de painéis de alojamento ficam, em regra, fora do webroot, por exemplo no diretório home. O problema surge quando alguém copia uma cópia dessas para o webroot porque o descarregamento no navegador é mais cómodo do que por SFTP. Para mudanças aplica-se, por isso: transferência por SFTP ou diretamente entre os servidores, nunca através de um link público.

Se agências ou prestadores de serviços tratarem dos seus sites, esta regra deve constar também do contrato, com o dever de arrumar após os trabalhos de manutenção. Indicações em Contratos com prestadores de serviços de TI: regular com clareza as obrigações de segurança.

Prevenir de forma duradoura: local de armazenamento e bloqueios

Para que o problema não se repita, são precisos dois níveis. O primeiro é organizacional: as cópias de segurança têm um local fixo fora do webroot e, além disso, fora do servidor. Como é uma cópia de segurança robusta é descrito no guia Estratégia de backup para servidores: backups segundo a regra 3-2-1.

O segundo nível é técnico: o servidor web recusa por princípio extensões de backup típicas, mesmo que um ficheiro acabe por ficar esquecido.

location ~* \.(sql|sql\.gz|dump|bak|old|orig|save|swp|swo)$ {
    return 404;
}
location ~ ~$ {
    return 404;
}

Arquivos como .zip só devem ser bloqueados se o seu site não oferecer descarregamentos nesse formato, ou de forma dirigida nos diretórios em que não há descarregamentos. Ajudam ainda uma pesquisa automática regular com notificação e uma regra breve na equipa: nenhuma cópia de segurança ou cópia de ficheiro no webroot, nem por cinco minutos. Casos relacionados, como ficheiros de configuração ocultos, são tratados em Proteger corretamente credenciais e ficheiros .env.

Como ajuda concretamente a PHP SOS?

  • Percorremos os seus webroots à procura de dumps, arquivos, cópias e cópias de segurança de plugins e avaliamos cada achado.
  • Verificamos, com base nos registos de acesso, se os ficheiros foram consultados e documentamos o resultado para a sua avaliação de proteção de dados.
  • Configuramos bloqueios no servidor web e uma pesquisa automática regular.
  • Transferimos as cópias de segurança para um local protegido fora do webroot.

Estes trabalhos fazem parte do nosso reforço de segurança de servidores para servidores web PHP.

Perguntas frequentes

Porque é que os backups vão parar ao webroot?

Normalmente por comodidade: gera-se um dump para uma mudança, um plugin guarda cópias de segurança na sua própria pasta, ou antes de uma alteração cria-se depressa uma cópia de um ficheiro com a extensão .bak. Depois, o ficheiro cai no esquecimento.

Quão perigoso é um ficheiro como config.php.bak?

Muito. Um ficheiro com a extensão .php é executado pelo servidor e o seu conteúdo permanece oculto. Uma cópia com outra extensão, pelo contrário, é normalmente entregue pelo servidor como texto, com a palavra-passe da base de dados e as chaves.

Um dump de base de dados acessível publicamente é uma violação de dados?

Se contiver dados pessoais e tiver sido consultado, ou se não for possível excluir uma consulta, pode ser aplicável um dever de notificação nos termos do RGPD. A avaliação em cada caso cabe ao seu encarregado da proteção de dados ou ao seu aconselhamento jurídico.

Onde devem estar os backups em vez disso?

Fora do webroot e, além disso, fora do servidor, segundo a regra 3-2-1. Pelo menos uma cópia deve estar guardada de modo a que o próprio servidor web não a possa apagar nem alterar.

Fontes

Contacto imediato

Cada hora conta. Escreva-nos agora.

Descreva brevemente o sistema, a versão do PHP e o que observou. Entramos em contacto consigo, esclarecemos a situação e trabalhamos remotamente até o incidente estar concluído e documentado.

Ajuda imediata