File Upload (dosya yükleme) zafiyeti, bir uygulamanın kullanıcılardan gelen dosyaları yeterli güvenlik kontrolü olmadan kabul etmesi sonucu ortaya çıkan kritik bir web uygulaması güvenlik açığıdır. Normalde uygulama yalnızca güvenli dosyaları kabul eder. Fakat saldırgan bu kontrolleri atlatıp zararlı içerikli dosyalar yüklediğinde sistem üzerinde kötü amaçlı davranışlar gerçekleştirebilirler. Bu zafiyet kötü amaçlı kodları yüklenip çalıştırılmasına izin vererek uygulama veya sunucu üzerinde yetkisiz komut çalıştırma gibi kritik sorunlara yol açabilir.
Zafiyet Nasıl Oluşur?
Bu zafiyetin ortaya çıkmasının başlıca nedenleri şunlardır:
· Sadece dosya uzantısına bakarak kontrol yapılması (örneğin .jpg, .png)
· Kullanıcı tarafından kontrol edilebilir MIME tipi validasyonlarının yapılmaması
· Dosya içeriğinin incelenmemesi (sadece isim kontrolü)
· Yüklenen dosyaların web root altında çalıştırılabilir şekilde saklanması
· İsim filtreleme ve güvenlik kontrollerinin eksik olması
Bu eksiklikler, saldırganın zararlı kod veya web shell gibi dosyaları sanki masum bir dosyaymış gibi başarılı bir şekilde yüklemesine izin verir.
File Upload Blacklist ve Whitelist Yaklaşımı
File Upload da uygulanan güvenlik kontrolleri, sistemin saldırılara karşı dayanıklılığını doğrudan etkiler. Bu kapsamda en yaygın kullanılan iki yaklaşım Blacklist ve Whitelist yöntemleridir.
Whitelist (İzin Verilen Dosya Türleri Yaklaşımı)
Whitelist yaklaşımında, dosya yükleme işlemi sırasında yalnızca önceden belirlenmiş ve güvenli olduğu kabul edilen dosya türlerinin yüklenmesine izin verilir. Uygulama, bu listede yer almayan tüm dosyaları otomatik olarak reddeder.
Bu yöntem, güvenlik açısından en etkili ve önerilen yaklaşımdır. Çünkü saldırganın yükleyebileceği dosya türleri net bir biçimde sınırlandırılmıştır. Bilinmeyen veya çalıştırılabilir dosyaların sisteme yüklenmesi engellenir.
Blacklist (Engellenen Dosya Türleri Yaklaşımı)
Blacklist yaklaşımında ise sistemde, yalnızca yüklenmesi istenmeyen dosya türleri engellenir. Örnek olarak .php, .py veya .exe gibi çalıştırılabilir dosya uzantılarını yasaklarken, verilen listenin dışında kalan dosyaların uygulama yüklenmesine izin verilir.
Bu yaklaşım güvenlik açısından pekte yeterli değildir. Çünkü saldırganlar, dosya uzantılarında bazı değişiklikler yaparak bu kontrolü kolaylıkla aşabilirler. Bu durum, zararlı içerik barındıran dosyaların masum dosyalar gibi sisteme yüklenmesine olanak tanır.
Örnek Seneryo
Örnek olarak Cyber Exam platformu üzerinden Learn File Upload Exploitation labı üzerinden ilerleyeceğiz.
Örneği lab2 üzerinden gerçekleştireceğiz. Bir .php uzantılı dosya oluşturacağım. Dosyanın mantığı bana URL üzerinden hangi komut gönderilirse, onu sunucuda çalıştır ve sonucunu ekrana yazdır olacak.

.php uzantılı dosyayı yüklemeye çalıştım.

Ardından uygulama bu isteğimi reddetti. Uygulamaya .php uzantılı dosyaların yüklenemeyeceğini anlamış oldum.

Daha sonra sadece yeni bir uzantı ekleyerek içindeki koda dokunmadan .png uzantılı dosyayı yükledim.

Dosya bu sefer başarı ile yüklendi.
Burada zararlı kodu içeren dosyayı uzantısını değiştirerek dosyayı sisteme masum bir dosya olarak gösterdik. Bu dosya sayesinde sunucuda yetkisiz kod çalıştıra bilir ve daha kritik sonuçlara yol açılabilir.
Bu Zafiyet Nasıl Önleyebiliriz ?
Sunucu Taraflı Dosya Doğrulama
Dosya yükleme kontrolleri sadece istemci tarafına bırakılmamalı ve tüm doğrulamalar sunucu tarafında yapılmalıdır. Kullanıcı tarafından manipüle edilen istemci kontrolü etkisiz hale getirilir.
MIME Type Doğrulaması
Dosyanın MIME type bilgisi sunucu tarafında doğrulanmalıdır. Kullanıcıdan gelen header bilgilerine güvenilmemelidir. Bu doğrulama dosya uzantısı değiştirilmiş dosyaların tespit edilmesine yardımcı olur.
Dosya İçeriği (Magic Byte) Kontrolü
Dosyanın gerçek türü, ilk baytlarının (magic byte / file signature) analiz edilerek belirlenmelidir. Uzantısı güvenli görünen ancak çalıştırılabilir kod içeren dosyalar bu sayede engellenebilir.
Web Root Dışında Dosya Saklama
Yüklenen dosyalar web root dizini dışında saklanmalıdır. Bu yöntem, zararlı dosyaların URL üzerinden çalıştırılmasını önler.
Çalıştırma Yetkilerinin Kaldırılması
Dosya yükleme dizinlerinde script çalıştırma izinleri kapatılmalıdır. Böylece yüklü bir dosya zararlı içerik barındırsa dahi sunucu tarafından çalıştırılamaz.
Dosya Adlarının Rastgeleleştirilmesi
Yüklenen dosyalar, kullanıcıdan gelen isimlerle kaydedilmemeli; sunucu tarafında rastgele adlandırılmalıdır. Dosyaya doğrudan erişimi ve tahmin edilebilir URL yapılarını engeller.