Archivos .env, .git y copias de seguridad expuestos: cómo se filtran secretos desde una web
Algunas de las filtraciones web más dañinas no requieren ningún ataque. Un archivo que nunca debió ser público está en la raíz web, el servidor se lo envía sin problema a quien lo pida, y ese archivo contiene una contraseña de base de datos, una clave de API o el código fuente completo del sitio.
Los 3 sospechosos habituales son los archivos .env con secretos de configuración, las carpetas .git que contienen todo el historial del repositorio y las copias de seguridad como site.zip, db.sql o config.php.bak. La OWASP Web Security Testing Guide los recoge todos como fuentes típicas de credenciales y código fuente expuestos.
Puede revisar su propio sitio en pocos minutos con curl.
Cómo acaban siendo accesibles estos archivos
- Archivos
.env. Muchos frameworks leen los secretos de un archivo.enven la carpeta del proyecto. Si la raíz de documentos del servidor web es la carpeta del proyecto y no su subcarpetapublic, el archivo se sirve como cualquier otro. - Carpetas
.git. Desplegar ejecutandogit cloneogit pulldirectamente en la raíz web deja el directorio.gitjunto al sitio. Con él, cualquiera puede reconstruir el código fuente y todos los commits anteriores, incluidos secretos que se "eliminaron" hace tiempo. - Copias y volcados. Un
ziprápido antes de una actualización, una exportacióndb.sqlpara una migración, una copia del editor comoindex.php~oconfig.php.old. OWASP señala que la copia de un script puede servirse como texto plano en lugar de ejecutarse, lo que revela su código. - Restos de herramientas.
phpinfo.php,.htpasswd,.DS_Store, archivos de estado de Terraform y archivos de log aparecen de la misma manera.
El denominador común es editar o desplegar directamente en el servidor de producción sin un paso que decida qué debe estar en la raíz web.
Cómo revisar su propio sitio
Solicite las rutas más habituales y fíjese en el código de estado y en el tamaño de cada respuesta:
for p in .env .git/HEAD .git/config backup.zip site.zip db.sql \
dump.sql config.php.bak wp-config.php.bak phpinfo.php .DS_Store; do
printf '%-22s ' "$p"
curl -s -o /dev/null -w '%{http_code} %{size_download}\n' "https://yourcompany.com/$p"
done
Qué significan los resultados:
404o403en todas las rutas es lo que quiere ver.200con contenido real es un hallazgo. En.git/HEAD, el contenido real se parece aref: refs/heads/main. En.env, son líneas del tipoNAME=value.200con su página de inicio normal o una página de error personalizada suele ser un "soft 404". OWASP advierte que una coincidencia por sí sola no es un hallazgo: abra la respuesta y confirme qué contiene realmente.
Repita la comprobación en cada nombre de host que gestione, incluidos los de staging y los subdominios antiguos. Ahí es donde estos archivos sobreviven más tiempo, como se explica en nuestro artículo sobre servidores de staging y de pruebas olvidados. Los archivos web también pueden guardar copias de archivos que fueron accesibles en el pasado, así que un archivo que acaba de eliminar quizá ya lo haya visto alguien.
Si se expuso un secreto, cámbielo primero
Borrar el archivo detiene las nuevas descargas, pero no puede saber quién lo copió ya. Considere comprometido cada secreto de un archivo expuesto:
- Cambie o revoque cada contraseña, clave de API y token del archivo. La guía de GitHub sobre eliminar datos sensibles da el mismo orden: primero revocar o cambiar el secreto, después limpiar el historial.
- Elimine el archivo del servidor y de cualquier carpeta de copias dentro de la raíz web.
- Revise los logs de acceso en busca de peticiones a esa ruta para saber si se descargó y cuándo.
- Compruebe a qué daba acceso la clave: consolas en la nube, proveedores de pago, servicios de correo, y busque actividad que no sepa explicar.
Si los secretos se subieron a un repositorio, reescribir el historial (GitHub recomienda git-filter-repo) solo sirve cuando el propio secreto ya no es válido.
Cómo evitarlo
- Haga que la raíz de documentos apunte solo a la carpeta pública, nunca a la raíz del proyecto.
- Despliegue artefactos de compilación, no copias de trabajo. Un pipeline de CI que copia solo los archivos que necesita el sitio deja fuera
.gity.envpor diseño. - Bloquee los archivos que empiezan por punto en el servidor web, como se muestra más abajo.
- Saque los secretos de los archivos siempre que pueda: use las variables de entorno de su plataforma o un gestor de secretos.
- No guarde nunca copias ni volcados en la raíz web. OWASP recomienda mantener los datos, los logs y los archivos de configuración donde el servidor web no pueda servirlos.
- Vuelva a comprobarlo tras cada cambio de infraestructura, incluidos los servidores nuevos detrás de un balanceador de carga.
Bloquear los archivos que empiezan por punto (conservando /.well-known/, que necesita la renovación de certificados) se hace así en nginx:
location ~ /\.(?!well-known) {
deny all;
}
Y así en la configuración de un sitio en Apache:
RedirectMatch 404 /\.(?!well-known)
Una lista de comprobación breve
- Ejecute el bucle de
curlanterior en cada nombre de host que posea. - Confirme cada
200leyendo el contenido. - Cambie cualquier secreto que haya sido accesible en algún momento.
- Bloquee los archivos que empiezan por punto y las extensiones de copias en la configuración del servidor web.
- Pase los despliegues a un pipeline que solo publique archivos compilados.
Ya que está en la configuración del servidor, es buen momento para añadir las cabeceras de seguridad HTTP que toda web empresarial debería enviar.
Cómo ayuda Datahorses
Datahorses vigila su sitio web desde fuera tal como lo miraría un atacante, y señala los archivos .git, .env, copias de seguridad y archivos de configuración expuestos que los archivos web han registrado en sus dominios. No entramos en sus sistemas y no necesitamos accesos; su desarrollador recibe los pasos exactos para eliminar el archivo y cambiar lo que se filtró. Consulte cómo vigilamos y por qué no necesitamos accesos.
Más artículos
Servidores de staging y de pruebas olvidados: la parte que nadie vigila
Los servidores de staging y de pruebas nacen para ser temporales y luego sobreviven en silencio al proyecto. Así puede encontrar los suyos y decidir qué conservar, proteger o apagar.
Requisitos de Outlook para remitentes desde mayo de 2025 y el rechazo 550 5.7.515
Si el correo a hotmail.com u outlook.com rebota con 550 5.7.515, Microsoft le indica que su dominio no cumple sus reglas de autenticación. Esto es lo que exige y cómo corregirlo.
PHP2Shell: qué versiones de PHP están corregidas y cómo comprobar la suya
El proyecto PHP corrigió 2 fallos críticos el 21 de octubre de 2026. Le explicamos qué versiones incluyen el parche, qué indica su servidor y qué preguntar a su proveedor de hosting.