Path traversal: hedef klasörün dışındaki dosyaları okumak

Bir istek dosya yolunun bir kısmını verdiğinde, ../ kastettiğin klasörden yukarı çıkar ve dosya sisteminin geri kalanına girer.

Örnek

Zafiyetli
app.get("/files", (req, res) => {
  res.sendFile(path.join(__dirname, "uploads", req.query.name));
});
Güvenli
const BASE = path.resolve(__dirname, "uploads");

app.get("/files", (req, res) => {
  const target = path.resolve(BASE, String(req.query.name));
  if (!target.startsWith(BASE + path.sep)) return res.sendStatus(400);
  res.sendFile(target);
});

Nasıl oluşur

İndirme uç noktaları, görsel boyutlandırıcılar ve şablon yükleyiciler bir taban klasörü istekten gelen bir adla birleştirir. path.join ../../../../etc/passwd'yi durdurmaz; string'in çözümlenmeden önce klasör adıyla başladığını kontrol etmek de durdurmaz. Yazma, okumadan kötüdür: bir başlangıç script'inin veya şablonun üzerine yazmak traversal'ı kod çalıştırmaya çevirir.

Nasıl düzeltilir

Önce çözümle, sonra kontrol et.

  • Yol kabul etmek yerine sunucuda bir kimliği kayıtlı bir yola eşle
  • Aksi halde tam yolu çözümle ve hâlâ taban klasörün içinde olduğunu doğrula
  • Yalnızca dosya adı bekleniyorsa path.basename kullan
  • Süreci ihtiyaç duyduğu en az dosya sistemi erişimiyle çalıştır

RepoVerse bunu nasıl bulur

  • Yüksekİstek girdisi bir dosya yoluna dönüşüyor

    `../` dizileri hedeflenen klasörün dışına çıkar ve sürecin erişebildiği her dosyayı okur veya üzerine yazar.

    veri akışı · CWE-22

  • Ortaİstekten gelen değer dosya yoluna ekleniyor

    Yol, istekle birlikte gelen bir şeyden kuruluyor.

    örüntü

Sorular

URL decode etmek path traversal'da önemli mi?
Evet. %2e%2e%2f gibi kodlanmış biçimler dosya sistemi görmeden önce ../'ye çözülür; kontroller çözülmüş ve çözümlenmiş yol üzerinde çalışmalıdır.
RepoVerse path traversal'ı nasıl buluyor?
İstek girdisini fs çağrılarına ve res.sendFile, res.download gibi hedeflere kadar izler; basename() ve sabit metinle başlayan yolları güvenli sayar.

İlgili

Güncellendi 2026-10-11