EMZETT.
Giriş yap

Path traversal ve güvensiz dosya yüklemeleri: tanıma ve önleme

Kısaca: Path traversal’da saldırgan, izin verilen klasörün dışındaki dosyaları okumak için dosya isteğine ../ gibi yol parçaları sokar; güvensiz yüklemeler zararlı dosyaların sisteme girmesine izin verir.

Biraz daha ayrıntılı: Web uygulamaları dosyaları sık sık kullanıcı girdisine göre okur veya kaydeder (/download?file=report.pdf). Girdi denetlenmeden yola eklenirse file=../../etc/passwd sistem dosyalarını açığa çıkarabilir. Bu makale kendi uygulamalarınız için anlama ve savunmayı anlatır.

Ayrıntılı

Path traversal (dizin aşma)

../ dizin ağacında yukarı çıkar. Örnek: taban /var/www/files/ + girdi ../../../etc/passwd → /etc/passwd. Varyantlar: URL kodlu (%2e%2e%2f), çift kodlu, Windows’ta ters eğik çizgi (..\), mutlak yollar, null baytlar, sembolik bağlantılar. Sonuçlar: yapılandırmaları, anahtarları, kaynak kodu, veritabanı kimlik bilgilerini okuma; yazma erişiminde hatta kod çalıştırma. Tipik yerler: indirme/resim/şablon uç noktaları, ZIP açma (Zip Slip: ../../evil girdisi), günlük görüntüleyiciler, şablon seçimi.

Savunma

  • Kullanıcı girdisinden dosya adı kullanmayın; kimlik (ID) (veritabanı kaydı → kayıtlı yol) veya izin listesi kullanın.
  • Yolu normalleştirip denetleyin: çözülmüş yolu oluşturun (Path.resolve(), realpath) ve taban klasörle başladığından emin olun.
base = Path("/var/www/files").resolve()
target = (base / user_input).resolve()
if not target.is_relative_to(base):
    abort(400)
  • Yetkileri en aza indirin (süreç yalnızca kendi klasörünü okuyabilsin), chroot/konteyner, salt okunur dosya sistemleri.
  • Çerçeve işlevleri kullanın (send_from_directory), ZIP girdilerini denetleyin.
  • Hata mesajlarında yol göstermeyin.

Güvensiz dosya yüklemeleri

Riskler: web kökünde çalıştırılabilir dosyalar (PHP/JSP web shell), başka dosyaların üzerine yazma, çok büyük dosyalar (DoS), zararlı kod içeren resim/belge biçimleri (betikli SVG → XSS, PDF/Office makroları, polyglot dosyalar), yanlış türler (uzantı ≠ içerik), dosya adında yol. Korunma:

  • Türü denetleyin (yalnızca uzantı/Content-Type değil, magic byte/içerik), biçimler için izin listesi.
  • Yeniden adlandırın (rastgele ID), özgün ad yalnızca üst veri olarak.
  • Web kökünün dışında saklayın veya nesne depolama (S3) üzerinden sunun, çalıştırmaya izin vermeyin (noexec, X-Content-Type-Options: nosniff başlığı, Content-Disposition: attachment).
  • Boyut sınırı, hız sınırlama, virüs taraması, resimleri yeniden kodlama (üst veriyi/yükü siler).
  • SVG’yi temizleyin veya yasaklayın, ayrı bir alan adından sunun (ayrı çerezler/köken).

Test ve öğrenme

  • Kendi uygulamanızı ../ girdileriyle test edin (birim testleri), statik analiz (Semgrep/CodeQL), bağımlılık güncellemeleri (açma kütüphaneleri).
  • Yasal biçimde çalışın: OWASP Juice Shop, DVWA, WebGoat, PortSwigger Academy, TryHackMe (kendi laboratuvarınız!).
  • Hukuk: üçüncü kişilerin sistemlerini asla izinsiz test etmeyin (§ 202a–c StGB, bkz. hacking hukuku).
  • Sınıflandırma: OWASP Top 10 (bozuk erişim denetimi, enjeksiyon, güvenlik yanlış yapılandırması).
  • Bulguları sorumlu ifşa yoluyla bildirin.

Ayrıca bakınız: OWASP Top 10, SQL enjeksiyonu, Sorumlu ifşa