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-Typedeğ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: nosniffbaş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