Açık dizin indeksleri: dosya sunucun her şeyi listelediğinde
Dizin indeksleme etkin olduğunda, /uploads/ gibi bir yolu ziyaret etmek 403 veya 404 yerine o dizindeki her dosyanın gezilebilir bir listesini döndürür. Saldırganlar önce buraya bakar, çünkü yedek arşivleri, log dosyaları ve kullanıcıların yüklediği içerikler web üzerinden sunulan dizinlerde düzenli olarak herkesin okuyabileceği şekilde bırakılır.
Nedir
Dizin listeleme (dizin indeksleme olarak da bilinir), bir dizin istendiğinde ve içinde index dosyası bulunmadığında bir HTML dosya tarayıcısı oluşturan bir web sunucusu özelliğidir. Bazı nginx yapılandırmalarında (autoindex on) ve Apache'de (Options +Indexes) varsayılan olarak etkindir; statik host'lar için bir kolaylık olsa da dosyaların herkese açık olmaması gereken her yerde bir zafiyete dönüşür.
AppSafe, sıkça yanlış yapılandırılan bir dizi yolu — /uploads/, /files/, /backup/, /backups/, /logs/ ve /tmp/ — kontrol eder ve tanınabilir bir dizin listeleme yanıtı döndüren her birini işaretler. Tek bir açık dizin bile asla keşfedilmesi amaçlanmamış verileri açığa çıkarabilir.
Neden önemli
Açıkta kalan dizinler rutin olarak kullanıcıların yüklediği dosyaları, sıkıştırılmış veritabanı dump'larını, kimlik bilgileri veya oturum token'ları içeren uygulama log'larını ve deploy'lardan kalan kaynak arşivlerini barındırır. Onları bulmak kimlik doğrulama ya da istismar gerektirmez — sadece URL'yi yazmak yeterlidir.
Otomatik tarayıcılar, AppSafe'in kontrol ettiği aynı bilinen yolları erişilebilir her host'a karşı sürekli olarak yoklar. İçinde bir .sql.gz dump'ı bulunan açık bir /backup/ dizini, fiilen parolasız teslim edilmiş tam bir veritabanı export'udur.
Nasıl düzeltilir
Kullanıcı kontrolündeki dizinleri sunan her server veya location bloğunda autoindex direktifini kaldır ya da açıkça kapat.
location /uploads/ {
autoindex off;
# Serve individual files but never list directory contents
}En güvenli çözüm, yüklemeleri, yedekleri ve log'ları web sunucusunun hiç sunmadığı bir dizinde saklamaktır. Uygulaman dosyaları kimlik doğrulamalı bir route üzerinden okur ve stream eder — ham dosya sistemi yolu asla erişilebilir olmaz.
Kullanıcı yüklemelerini veya yedekleri asla public/ dizinine koyma. Onları kimlik doğrulamayı zorunlu kılabilen ve istenen yolu temizleyebilen bir API route'u üzerinden sun.
// 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);
}Gerçekten gezilebilir bir dosya arayüzüne (bir medya kütüphanesi, dahili bir log görüntüleyici) ihtiyacın varsa, gizliliğe güvenmek yerine yolu kimlik doğrulamayla koru.
location /logs/ {
autoindex on;
auth_basic "Internal only";
auth_basic_user_file /etc/nginx/.htpasswd;
}SSS
Dizin listeleme her zaman bir sorun mu, yoksa yalnızca belirli yollarda mı?
Dosyalar hassas herhangi bir şey içerdiği her yerde sorundur. İndekslemesi açık, statik görseller sunan herkese açık bir CDN genellikle zararsızdır; /logs/, /backup/ ve /uploads/ ise neredeyse hiçbir zaman zararsız değildir, çünkü herkese açık erişim için incelenmemiş dosyalar biriktirirler.
Listelemeyi engellemek için dizine boş bir index.html koymam yeterli mi?
Bu, yalnızca o dizinin listesini gizler ama her alt dizini açık bırakır. Yeni dizinler oluşturulduğunda gözden kaçırmak da kolaydır. autoindex'i sunucu seviyesinde kapatmak, altındaki her şeyi kapsayan güvenilir, yapılandırma düzeyinde bir çözümdür.
AppSafe açık bir dizin indeksi için hangi önem derecesini raporlar?
Orta. Listelemenin kendisi bir ele geçirme değildir — ona giden yoldur. Veritabanı dump'ı içeren gezilebilir bir /backup/ dizini veya düz metin kimlik doğrulama token'ları barındıran bir /logs/ dizini, tek başına hızla ortanın ötesine tırmanır.
Uygulaman etkileniyor mu?
AppSafe, bunu ve onlarca başka sorunu tek bir ücretsiz taramada kontrol eder.
Uygulamamı ücretsiz taraİlgili rehberler
Açıkta kalan veritabanı yedekleri: /backup.sql erişilebilir olduğunda ne olur
Erişilebilir bir .sql dump'ı, tüm veritabanını eksiksiz teslim etmek demektir.
Açıkta kalan .git dizini: göz önünde saklanan kaynak kodu sızıntısı
Erişilebilir bir /.git, tüm kod tabanını ve commit geçmişini teslim eder.
Production'da ayrıntılı hata sayfaları ve stack trace'ler
Bir stack trace, saldırganlara tam olarak nereye nişan alacaklarını söyler.