Indeks direktori terbuka: saat file server Anda menampilkan semuanya
Ketika directory indexing aktif, mengunjungi path seperti /uploads/ mengembalikan daftar yang bisa dijelajahi berisi setiap file di direktori tersebut, bukan 403 atau 404. Penyerang melihat ke sini terlebih dahulu karena arsip backup, file log, dan konten unggahan pengguna sering dibiarkan dapat dibaca siapa saja di dalam direktori yang disajikan web.
Apa itu
Directory listing (disebut juga directory indexing) adalah fitur web server yang menghasilkan file browser HTML ketika sebuah direktori diminta dan tidak ada file indeks. Aktif secara default di beberapa konfigurasi nginx (autoindex on) dan Apache (Options +Indexes), fitur ini memudahkan host statis tetapi menjadi masalah di mana pun file seharusnya tidak publik.
AppSafe memeriksa sekumpulan path yang sering salah konfigurasi — /uploads/, /files/, /backup/, /backups/, /logs/, dan /tmp/ — dan menandai path mana pun yang mengembalikan respons directory listing yang dikenali. Bahkan satu direktori terbuka bisa mengekspos data yang tidak pernah dimaksudkan untuk ditemukan.
Kenapa penting
Direktori yang terekspos rutin berisi file unggahan pengguna, dump database terkompresi, log aplikasi berisi kredensial atau token sesi, dan arsip source sisa deploy. Menemukannya tidak butuh autentikasi maupun eksploitasi — cukup mengetik URL-nya.
Scanner otomatis terus-menerus memeriksa path-path terkenal yang sama dengan yang diperiksa AppSafe, ke setiap host yang dapat dijangkau. Direktori /backup/ terbuka yang berisi dump .sql.gz pada dasarnya adalah ekspor database lengkap yang diserahkan tanpa password.
Cara memperbaiki
Hapus atau matikan secara eksplisit direktif autoindex di setiap blok server atau location yang menyajikan direktori yang dikendalikan pengguna.
location /uploads/ {
autoindex off;
# Serve individual files but never list directory contents
}Perbaikan paling aman adalah menyimpan unggahan, backup, dan log di direktori yang sama sekali tidak disajikan web server. Aplikasi Anda membaca dan mengalirkan file melalui route yang terautentikasi — path filesystem mentahnya tidak pernah dapat dijangkau.
Jangan pernah menaruh unggahan pengguna atau backup di dalam direktori public/. Sajikan melalui API route yang dapat menerapkan autentikasi dan membersihkan path yang diminta.
// 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);
}Jika Anda benar-benar butuh antarmuka file yang bisa dijelajahi (media library, penampil log internal), lindungi path tersebut dengan autentikasi alih-alih mengandalkan ketidakjelasan.
location /logs/ {
autoindex on;
auth_basic "Internal only";
auth_basic_user_file /etc/nginx/.htpasswd;
}FAQ
Apakah directory listing selalu menjadi masalah, atau hanya pada path tertentu?
Ini masalah di mana pun file berisi sesuatu yang sensitif. CDN publik yang menyajikan gambar statis dengan indexing aktif biasanya tidak berbahaya; /logs/, /backup/, dan /uploads/ hampir tidak pernah aman, karena menumpuk file yang tidak diperiksa untuk akses publik.
Bisakah saya cukup menaruh index.html kosong di direktori untuk memblokir listing?
Itu menyembunyikan listing untuk satu direktori tersebut, tetapi setiap subdirektori tetap terbuka. Cara ini juga mudah terlewat saat direktori baru dibuat. Mematikan autoindex di level server adalah perbaikan yang andal di level konfigurasi dan mencakup semua yang ada di bawahnya.
Tingkat keparahan apa yang dilaporkan AppSafe untuk indeks direktori terbuka?
Sedang. Listing itu sendiri bukan kompromi — melainkan jalan menuju kompromi. Direktori /backup/ yang bisa dijelajahi dan berisi dump database, atau direktori /logs/ dengan token autentikasi dalam teks biasa, dengan cepat melampaui tingkat sedang.
Apakah aplikasimu terpengaruh?
AppSafe memeriksa ini dan puluhan masalah lain dalam satu pemindaian gratis.
Pindai aplikasiku gratisPanduan terkait
Backup database yang terekspos: apa yang terjadi saat /backup.sql dapat dijangkau
Dump .sql yang dapat dijangkau sama dengan menyerahkan seluruh database Anda.
Direktori .git yang terekspos: kebocoran source code yang tersembunyi di depan mata
/.git yang dapat dijangkau menyerahkan seluruh codebase dan riwayat commit Anda.
Halaman error verbose dan stack trace di production
Stack trace memberi tahu penyerang persis ke mana harus membidik.