SSL Sertifika Analizi Açık Port Tespiti Web Uygulama Tarama DNS Güvenlik Denetimi HTTP Başlık Analizi Yanlış Yapılandırma Tespiti Yazılım Parmak İzi Alt Alan Adı Tarama
SSL Sertifika Analizi Açık Port Tespiti Web Uygulama Tarama DNS Güvenlik Denetimi HTTP Başlık Analizi Yanlış Yapılandırma Tespiti Yazılım Parmak İzi Alt Alan Adı Tarama

Tüm Rehberler

Dosya yükleme işlevi, kötü amaçlı kod çalıştırmak, kimlik doğrulamayı atlamak veya sunucu kaynaklarını tüketmek isteyen saldırganlar için sık tercih edilen bir hedeftir. Bu rehber, web uygulamalarında sağlam ve güvenli dosya yükleme işlemlerini hayata geçirmek isteyen geliştiriciler, teknik yöneticiler ve güvenlik bilincine sahip işletme sahipleri için hazırlanmıştır. En kritik yükleme kaynaklı güvenlik açıklarını ortadan kaldırmak için her adımı uygulayın.

01

Sunucu Tarafında Dosya Türü Doğrulaması Yapın

İstemci taraflı doğrulama (JavaScript dosya türü kontrolleri veya HTML accept öznitelikleri) kolayca atlatılabilir. Her yükleme, birden fazla bağımsız sinyal kullanılarak sunucuda doğrulanmalıdır. Yalnızca dosya uzantısına veya tarayıcının sağladığı MIME türüne güvenmek yetersizdir; saldırganlar her ikisini de manipüle edebilir.

  • Dosyanın ilk birkaç baytını (sihirli baytlar / dosya imzası) okuyun ve izin verilen formatların beyaz listesiyle karşılaştırın (örneğin PNG \x89PNG ile, PDF %PDF ile başlar).
  • Sunucu tarafında tespit edilen MIME türünü, istemci tarafından gönderilen Content-Type başlığından bağımsız olarak doğrulayın.
  • İzin verilen uzantıların katı bir beyaz listesini tutun (örn. .jpg, .png, .pdf) — bilinen kötü uzantıları engellemeye çalışmak yerine listede olmayanları reddedin.
  • evil.php.jpg gibi çift uzantılı dosyaları, her uzantı bileşenini soyarak ve doğrulayarak reddedin.
  • Görsel yüklemeleri için, gömülü yükleri temizlemek ve geçerli bir görsel olduğunu doğrulamak amacıyla görseli sunucu tarafında yeniden kodlayın (örn. ImageMagick veya Pillow kullanarak).
02

Dosya Boyutu ve Adet Sınırları Uygulayın

Sınırsız yükleme boyutları, saldırganların disk alanını veya belleği tüketerek hizmet engelleme durumlarına yol açmasına imkân tanır. Birden fazla katmanda sınır belirlemek, isteklerin önemli kaynaklar tüketmeden reddedilmesini sağlar.

  • Kullanım durumunuza uygun bir maksimum dosya boyutu belirleyin (örn. profil fotoğrafları için 5 MB, belgeler için 50 MB) ve bunu hem web sunucusu yapılandırmanızda hem de uygulama kodunuzda zorunlu kılın.
  • Aşırı büyük istekleri uygulamanıza ulaşmadan sunucu düzeyinde reddetmek için client_max_body_size (Nginx) veya LimitRequestBody (Apache) ayarlarını yapılandırın.
  • Tek bir istekte yüklenebilecek dosya sayısını ve kullanıcı başına zaman pencerindeki yükleme sayısını sınırlayın (hız sınırlama).
  • Sınırlar aşıldığında net bir hata mesajı döndürün — dosyaları sessizce kesmekten kaçının; bu durum bozuk verinin depolanmasına yol açabilir.
03

Yüklenen Dosyaları Temizleyin ve Yeniden Adlandırın

Kullanıcı tarafından kontrol edilen dosya adlarına izin vermek, yol geçişi, üzerine yazma saldırıları ve çalıştırılabilir adlandırma hileleri gibi risklere kapı aralar. Orijinal dosya adını her zaman tamamen sizin kontrolünüzde olan bir adla değiştirin.

  • Her yüklenen dosya için kriptografik olarak rastgele bir dosya adı oluşturun (örn. bir UUID veya güvenli rastgele hex dizesi) — diskte asla orijinal dosya adını kullanmayın.
  • Orijinal dosya adındaki uzantıyı değil, sunucu tarafı tür kontrolünüzle belirlenen ve beyaz listede yer alan uzantıyı ekleyin.
  • Orijinal dosya adını görüntüleme amacıyla saklamanız gerekiyorsa, bunu diskteki gerçek dosya adı olarak değil, yalnızca veritabanınızda tutun.
  • Dosyayla birlikte saklanacak meta verileri temizleyin (örn. GPS koordinatları veya cihaz bilgilerinin sızmasını önlemek için görsellerden EXIF verilerini silin).
04

Dosyaları Web Kökü Dışında Depolayın

Yüklenen dosyalar herkese açık bir dizinde depolanıyorsa, bir web kabuğu yükleyen saldırgan URL üzerinden doğrudan erişebilir ve rastgele komutlar çalıştırabilir. Depolama alanını web kökü dışına taşımak en etkili azaltma yöntemlerinden biridir.

  • Yüklenen dosyaları web sunucunuzun doğrudan servis etmediği bir dizinde saklayın (örn. /var/www/html/uploads/ yerine /var/uploads/).
  • Yüklenen dosyaları, dosyayı özel dizinden okuyan ve uygun başlıklarla istemciye akıtan uygulama tarafından kontrol edilen bir uç nokta üzerinden sunun.
  • Zaman sınırlı, kimliği doğrulanmış erişim için özel demet politikaları ve önceden imzalanmış URL'lerle nesne depolama (örn. AWS S3, Google Cloud Storage) kullanmayı değerlendirin.
  • Web sunucunuz tarafından hâlihazırda statik içerik olarak sunulan dizinlere asla yazma erişimi vermeyin.
05

Yükleme Dizinlerinde Betik Çalıştırmayı Engelleyin

Dosyalar web erişimine açık bir dizinde saklanıyor olsa bile, web sunucusunun bu dizindeki dosyaları uzantılarından bağımsız olarak asla betik olarak çalıştırmamasını sağlayarak riski önemli ölçüde azaltabilirsiniz.

  • Nginx: Yükleme dizininiz için default_type application/octet-stream ayarlayan ve fastcgi_pass ya da uwsgi_pass yönergelerini kaldıran bir location bloğu ekleyin.
  • Apache: Yükleme dizinine, Options -ExecCGI, AddHandler default-handler .php .py .pl .rb ve php_flag engine off içeren bir .htaccess dosyası ekleyin.
  • Web sunucusu yapılandırmanızın rastgele dosya türlerini betik olarak çalıştıran kapsamlı bir işleyicisinin olmadığından emin olun.
  • Yüklenen içeriklerin bulunduğu dizinler için sunucu taraflı içerme (SSI) özelliğini devre dışı bırakın.
06

Yüklenen Dosyaları Kötü Amaçlı Yazılım İçin Tarayın

Tür doğrulamasını geçen dosyalar bile aşağı yönlü kullanıcıları hedef alan gömülü kötü amaçlı yükler içerebilir (örn. makro içeren Office belgeleri, çok biçimli dosyalar). Kötü amaçlı yazılım taramasının entegre edilmesi kritik bir ikinci savunma hattı ekler.

  • Yükleme hattınıza sunucu taraflı bir antivirüs çözümü (örn. ClamAV) entegre edin — dosyaları kalıcı depolamaya alınmadan önce tarayın.
  • Yüksek riskli ortamlar için, sıfır gün tehditlerini tespit etmek amacıyla dosyaları yalıtılmış bir ortamda çalıştıran kum havuzlu analiz hizmetleri kullanın.
  • Kötü amaçlı yazılım taramasında başarısız olan dosyaları karantinaya alın ve güvenlik ekibinizi derhal uyarın — sessizce atmadan araştırın.
  • Yeni tehditlerin hızla yakalanması için virüs tanımlarını ve tarama motorlarını otomatik olarak güncel tutun.
  • Tanımlar geliştikçe arşivinizdeki daha önce tespit edilememiş tehditleri yakalamak için depolanan dosyaları periyodik olarak yeniden tarayın.
07

Dosyaları Son Kullanıcılara Güvenli Biçimde Sunun

Dosyaların kullanıcılara nasıl iletildiği, nasıl depolandığı kadar önemlidir. Hatalı başlıklar veya aynı kaynak üzerinden sunum, tarayıcının bir dosyanın türünü yanlış yorumlayıp çalıştırdığı Siteler Arası Betik Çalıştırma (XSS) veya İçerik Koklama saldırılarına yol açabilir.

  • Uygun durumlarda tarayıcıda işleme yerine indirme diyaloğunu zorunlu kılmak için tüm kullanıcı tarafından yüklenen dosyalara Content-Disposition: attachment; filename="guvenliisim.uzanti" başlığını ekleyin.
  • İstemci tarafından sağlanan Content-Type'ı yansıtmak yerine, sunucu tarafı doğrulamanıza dayalı açık ve doğru bir Content-Type başlığı ayarlayın.
  • Tarayıcıların içerik türünü MIME koklama yöntemiyle belirlemesini önlemek için yüklenen dosyaları sunan tüm yanıtlara X-Content-Type-Options: nosniff ekleyin.
  • Kötü amaçlı içeriklerin ana uygulama kaynağınızdaki çerezlere veya depolama alanına erişememesi için kullanıcı tarafından yüklenen içerikleri ayrı, kum havuzlu bir etki alanı veya alt etki alanından (örn. uploads.etkialaniniz.com veya bir CDN etki alanı) sunun.
  • Yüklenen içerikleri görüntüleyen veya bunlara bağlantı veren sayfalara kısıtlayıcı bir Content-Security-Policy başlığı uygulayın.
08

Katı Erişim Kontrolleri Uygulayın

Uygulamanız bunu açıkça gerektirmediği sürece yükleme işlevi halka açık olmamalıdır. Yüklemelerin herkese açık olduğu durumlarda bile ortaya çıkan dosyalara erişim, yetkisiz veri erişimini veya kötüye kullanımı önlemek için uygun şekilde kısıtlanmalıdır.

  • Tüm yükleme uç noktaları için kimlik doğrulama zorunlu kılın — kimliği doğrulanmamış yükleme uç noktaları kötüye kullanım ve spam için yaygın bir hedeftir.
  • Bir kullanıcının yalnızca görüntüleme iznine sahip olduğu dosyalara erişebildiğinden emin olmak için yetkilendirme kontrolleri uygulayın — gerçek depolama yolunu açığa çıkarmak yerine dolaylı referanslar (örn. veritabanında eşlenen bir UUID) kullanın.
  • Hangi kullanıcı rollerinin dosya yükleyebileceğini ve her rolün hangi dosya türlerini yüklemesine izin verileceğini kısıtlamak için rol tabanlı erişim denetimi (RBAC) uygulayın.
  • Paylaşılan dosya bağlantılarının maruz kalma penceresini sınırlamak için erişim belirteçlerini veya önceden imzalanmış URL'leri derhal geçersiz kılın veya süresi doldurun.
  • Ham depolama konumuna (bulut demeti, dosya sunucusu) kimin erişebildiğini denetleyin ve en az ayrıcalık ilkesini uygulayın — uygulama hizmet hesaplarının yalnızca ihtiyaç duydukları erişime sahip olması gerekir.
09

Yükleme Etkinliğini Günlüğe Kaydedin, İzleyin ve Uyarı Alın

Yükleme olaylarını kaydetmek, olay müdahalesi için denetim izi oluşturur ve anomali tespitini mümkün kılar. Yükleme davranışına ilişkin görünürlük olmadan, saldırılar önemli hasara yol açana kadar fark edilmeyebilir. Sensagraph, yükleme kaynaklı saldırılara işaret edebilecek anormal veya şüpheli davranışlar için web uygulama uç noktalarınızı sürekli olarak izler.

  • Her yükleme girişimini kaydedin — kimliği doğrulanmış kullanıcı, zaman damgası, orijinal dosya adı, tespit edilen MIME türü, dosya boyutu ve sonuç (kabul edildi/reddedildi) dahil.
  • Aynı IP adresinden veya kullanıcı hesabından gelen tekrarlanan yükleme başarısızlıklarında uyarı verin; bu durum araştırma veya fuzzing girişimlerine işaret edebilir.
  • Özellikle çalıştırılabilir biçimlere yakın olanlar başta olmak üzere alışılmadık dosya türlerinin yüklenmesi için uyarılar ayarlayın.
  • Depolama dizinlerini, dosya bütünlüğü izleme (FIM) araçları kullanarak çalıştırılabilir uzantılara sahip olanlar başta olmak üzere beklenmedik yeni dosyalar için izleyin.
  • Toplu yüklemeler veya mesai saatleri dışı etkinlikler gibi kalıpları aramak için yükleme günlüklerini rutin güvenlik operasyonlarınızın bir parçası olarak düzenli aralıklarla gözden geçirin.
  • Yükleme olay günlüklerini, diğer güvenlik olaylarıyla ilişkilendirilebilmeleri için SIEM'inize veya merkezi günlükleme platformunuza entegre edin.
10

Yükleme Güvenliğinizi Düzenli Olarak Test Edin

Güvenlik kontrolleri, kod değiştikçe, bağımlılıklar güncellendikçe ve yapılandırmalar kaydıkça zamanla bozulur. Düzenli ve yapılandırılmış testler, yükleme kontrollerinizin gelişen saldırı tekniklerine karşı etkili kalmasını sağlar.

  • CI/CD hattınıza yükleme güvenliği testleri ekleyin — eksik başlıklar, eksik tür doğrulaması ve korumasız uç noktalar için kontrolleri otomatikleştirin.
  • Yükleme işlevinin manuel sızma testini en az yılda bir veya herhangi bir önemli özellik değişikliğinin ardından yapın; çift uzantılar, null baytlar ve çok biçimli dosyalar gibi yaygın atlama tekniklerini deneyin.
  • Yanlış yapılandırılmış yükleme uç noktaları ve dosya sunma yanıtlarındaki eksik güvenlik başlıkları için uygulamanızı sürekli taramak amacıyla Sensagraph'ı kullanın.
  • Yeni desteklenen formatları veya kaldırılması gereken eski formatları hesaba katmak için dosya türü beyaz listenizi periyodik olarak gözden geçirin ve güncelleyin.
  • Yeni güvenlik açıklarının tanıtılmadığından emin olmak için değişiklikleri birleştirmeden önce yükleme işleme koduna özel olarak odaklanan kod incelemeleri yapın.

Sıkça sorulan sorular

İstemci taraflı doğrulama (JavaScript veya HTML accept öznitelikleri), tarayıcı geliştirici araçları kullanılarak veya ham bir HTTP isteği oluşturularak herhangi bir saldırgan tarafından kolayca atlatılabilir. Sunucu taraflı doğrulama tek yetkili kontroldür — istemcinin raporladığından bağımsız olarak gerçekleştirilmesi zorunludur.

Çok biçimli dosya, aynı anda iki farklı biçimde geçerli olan bir dosyadır; örneğin hem geçerli bir JPEG görsel hem de geçerli bir JavaScript dosyası olan bir dosya. Saldırganlar, tür doğrulamasını atlatmak ve aynı zamanda bir tarayıcı veya sunucu tarafından çalıştırılabilir olarak yorumlanmak için çok biçimli dosyaları kullanır. Görüntülerin sunucu tarafında yeniden kodlanması ve dosyaların kum havuzlu bir etki alanından sunulması etkili azaltma yöntemleridir.

Genellikle yüklenen dosyaları özel erişim politikalarına sahip özel nesne depolama alanında (AWS S3 veya Google Cloud Storage gibi) saklamak daha iyi bir uygulamadır. Bu yaklaşım, uygulama sunucunuzu yüklenen içerikten yalıtır, daha kolay ölçeklenir ve ayrıntılı erişim kontrolleri ile yaşam döngüsü politikaları uygulamayı basitleştirir.

Yol geçişi saldırıları, saldırgan tarafından kontrol edilen dosya adlarının dosyaları amaçlanan dizinin dışına yazmak için <code>../../</code> gibi diziler içermesiyle gerçekleşir. En iyi önlem, dosyaları kaydederken orijinal dosya adını asla kullanmamaktır — her zaman rastgele bir dahili ad oluşturun ve orijinal adı yalnızca veritabanınızda saklayın.

Uygun sınır, uygulamanızın kullanım durumuna bağlıdır. Başlangıç noktası olarak: profil görselleri genellikle 2–5 MB ile sınırlandırılır, genel belge yüklemeleri ise 10–50 MB ile. Sınırı kullanım durumunuzun izin verdiği kadar düşük tutun ve derinlemesine savunma için hem web sunucusu hem de uygulama düzeyinde zorunlu kılın.

PDF'ler JavaScript, gömülü çalıştırılabilirler ve diğer etkin içerikler barındırabilir. Dosyanın gerçek bir PDF olduğunu sihirli bayt denetimiyle her zaman doğrulayın, bir PDF sterilizatörü (Ghostscript renderlama gibi) aracılığıyla PDF'leri yeniden işlemeyi değerlendirin, mümkün olan yerlerde PDF'lerdeki JavaScript çalıştırmasını kısıtlayın ve PDF'leri ana uygulama kaynağınızda satır içi göstermek yerine kum havuzlu bir etki alanından sunun.