Índices de directorio abiertos: cuando tu servidor de archivos lo lista todo
Cuando el indexado de directorios está activado, visitar una ruta como /uploads/ devuelve una lista navegable de todos los archivos de ese directorio en lugar de un 403 o un 404. Los atacantes miran aquí primero porque los backups, los archivos de log y el contenido subido por usuarios a menudo quedan legibles para cualquiera dentro de directorios servidos por la web.
Qué es
El listado de directorios (también llamado indexado de directorios) es una función del servidor web que genera un explorador de archivos HTML cuando se solicita un directorio sin archivo index. Activado por defecto en algunas configuraciones de nginx (autoindex on) y en Apache (Options +Indexes), es una comodidad para hosts estáticos que se convierte en un riesgo allí donde los archivos no deberían ser públicos.
AppSafe comprueba un conjunto de rutas que suelen estar mal configuradas (/uploads/, /files/, /backup/, /backups/, /logs/ y /tmp/) y marca cualquiera que devuelva una respuesta reconocible de listado de directorio. Un solo directorio abierto puede exponer datos que nunca debieron poder descubrirse.
Por qué importa
Los directorios expuestos suelen contener archivos subidos por usuarios, volcados de base de datos comprimidos, logs de la aplicación con credenciales o tokens de sesión y archivos de código sobrantes de despliegues. Encontrarlos no requiere autenticación ni explotación: basta con escribir la URL.
Los escáneres automatizados prueban continuamente las mismas rutas conocidas que comprueba AppSafe en cada host accesible. Un directorio /backup/ abierto que contiene un volcado .sql.gz equivale a entregar una exportación completa de la base de datos sin contraseña.
Cómo solucionarlo
Elimina o desactiva explícitamente la directiva autoindex en cualquier bloque server o location que sirva directorios controlados por usuarios.
location /uploads/ {
autoindex off;
# Serve individual files but never list directory contents
}La solución más segura es guardar uploads, backups y logs en un directorio que el servidor web no sirva en absoluto. Tu aplicación lee y transmite los archivos a través de una ruta autenticada; la ruta del sistema de archivos nunca es accesible directamente.
Nunca pongas uploads de usuarios ni backups dentro del directorio public/. Sírvelos a través de una ruta de API que pueda exigir autenticación y sanear la ruta solicitada.
// app/api/uploads/[filename]/route.ts
import { getSession } from "@/lib/auth-session";
import { readFile } from "fs/promises";
import path from "path";
export async function GET(
_req: Request,
{ params }: { params: { filename: string } }
) {
const session = await getSession();
if (!session) return new Response(null, { status: 401 });
// path.basename prevents directory traversal
const safe = path.basename(params.filename);
const filePath = path.join(process.cwd(), "private-uploads", safe);
const data = await readFile(filePath);
return new Response(data);
}Si realmente necesitas una interfaz de archivos navegable (una biblioteca de medios, un visor de logs interno), protege la ruta con autenticación en lugar de confiar en que nadie la encuentre.
location /logs/ {
autoindex on;
auth_basic "Internal only";
auth_basic_user_file /etc/nginx/.htpasswd;
}Preguntas frecuentes
¿El listado de directorios siempre es un problema o solo en ciertas rutas?
Es un problema allí donde los archivos contengan algo sensible. Un CDN público que sirve imágenes estáticas con el indexado activado suele ser inofensivo; /logs/, /backup/ y /uploads/ casi nunca lo son, porque acumulan archivos que no se revisaron para acceso público.
¿Puedo poner un index.html vacío en el directorio para bloquear el listado?
Eso oculta el listado de ese directorio, pero deja abiertos todos los subdirectorios. Además, es fácil olvidarlo cuando se crean directorios nuevos. Desactivar autoindex a nivel de servidor es una corrección fiable, a nivel de configuración, que cubre todo lo que hay por debajo.
¿Qué severidad reporta AppSafe para un índice de directorio abierto?
Media. El listado en sí no es el compromiso, sino el camino hacia él. Un directorio /backup/ navegable con un volcado de base de datos, o un directorio /logs/ con tokens de autenticación en texto plano, supera rápidamente la severidad media por sí solo.
¿Tu app está afectada?
AppSafe verifica este y docenas de problemas más en un solo escaneo gratis.
Escanear mi app gratisGuías relacionadas
Backups de base de datos expuestos: qué pasa cuando /backup.sql es accesible
Un volcado .sql accesible es la entrega completa de toda tu base de datos.
Directorio .git expuesto: la fuga de código fuente a la vista de todos
Un /.git accesible entrega todo tu código y el historial de commits.
Páginas de error detalladas y stack traces en producción
Un stack trace le dice al atacante exactamente dónde apuntar.