October 18, 2026
Bir Hacker Gibi Düşünmek — #14
File Upload Zafiyetleri Nedir? Bir Dosya Yükleme Özelliği Nasıl Güvenlik Riskine Dönüşür?

By Abdulkadir Kayacan
7 min read
File Upload Zafiyetleri Nedir? Bir Dosya Yükleme Özelliği Nasıl Güvenlik Riskine Dönüşür?
Günümüzde neredeyse her web uygulamasında dosya yükleme özelliği bulunuyor. Sosyal medya platformlarına profil fotoğrafı yüklüyor, forumlarda dosya paylaşıyor, başvuru sistemlerine PDF belgeleri gönderiyor veya bulut servislerinde dosyalarımızı saklıyoruz. Kullanıcı açısından oldukça sıradan görünen bu işlemler, bir web uygulamasının güvenliği açısından önemli bir risk oluşturabilir.
Peki bir fotoğraf yüklemek nasıl olur da bir sunucunun güvenliğini tehdit edebilir?
Aslında sorun dosya yükleme özelliğinin kendisinde değil, uygulamanın yüklenen dosyalara ne kadar güvendiğindedir. Bir web uygulaması, kullanıcının gönderdiği dosyayı yeterince kontrol etmeden kabul eder, yanlış bir konumda saklar veya çalıştırılmasına izin verirse saldırganlar bu davranıştan yararlanabilir.
Bu yazıda File Upload Vulnerabilities, yani dosya yükleme zafiyetlerini inceleyeceğiz. Dosya türü kontrollerinin neden tek başına yeterli olmadığını, yüklenen dosyaların nasıl risk oluşturabildiğini ve güvenli bir dosya yükleme sisteminin hangi önlemleri içermesi gerektiğini ele alacağız.
Dosya yükleme işlemi nasıl çalışır?
Bir web sitesine dosya yüklediğinde genellikle birkaç işlem gerçekleşir. Tarayıcın dosyayı sunucuya gönderir, sunucu gelen isteği karşılar, dosyayı doğrular ve uygun bir konuma kaydeder. Gerekiyorsa dosya üzerinde ek işlemler yapar; örneğin bir görseli küçültür, PDF belgesini işler veya dosyaya ait bilgileri veritabanına kaydeder.
Bu süreç basitçe şöyle gösterilebilir:
Kullanıcı
|
| Dosya yükleme isteği
v
Web uygulaması
|
| Dosyayı doğrula
v
Dosyayı sakla
|
| Gerekirse işle
v
Dosyayı kullanıcıya sunKullanıcı
|
| Dosya yükleme isteği
v
Web uygulaması
|
| Dosyayı doğrula
v
Dosyayı sakla
|
| Gerekirse işle
v
Dosyayı kullanıcıya sunGüvenli bir uygulama, bu adımların her birinde dosyanın nasıl ele alınacağını kontrol eder. Güvenli olmayan bir uygulama ise dosyanın yalnızca yükleme sırasında kabul edilip edilmediğine odaklanabilir ve sonrasındaki riskleri gözden kaçırabilir.
Örneğin bir uygulamanın yalnızca PNG görsellerini kabul etmesi gerektiğini düşünelim. Uygulama, dosyanın adının .png ile bitmesine bakarak dosyayı kabul ediyorsa güvenilir bir kontrol yapmış sayılmaz. Dosya adı kullanıcı tarafından belirlenebilir ve dosyanın gerçek içeriğini garanti etmez.
İşte dosya yükleme zafiyetlerinin önemli bir bölümü, bu tür yanlış varsayımlardan kaynaklanır.
1. Dosya uzantısına güvenmek
Dosya yükleme sistemlerinde karşılaşılan en yaygın tasarım hatalarından biri, dosyanın türünü yalnızca uzantısına bakarak belirlemektir.
Bir dosyanın adı fotoğraf.png, belge.pdf veya rapor.docx olabilir. Ancak bu isimler, dosyanın içeriğinin gerçekten belirtilen formatta olduğunu kanıtlamaz. Dosyanın adı değiştirilebilir; içeriği ise farklı bir veri formatına ait olabilir.
Örneğin uygulamanın yalnızca görsel kabul ettiğini varsayalım. Sunucu, dosya adının .jpg ile bittiğini kontrol edip başka hiçbir doğrulama yapmıyorsa saldırgan, görsel olmayan bir dosyayı bu kontrolü geçecek şekilde göndermeyi deneyebilir.
Bu durum her zaman doğrudan bir saldırıya yol açmaz. Ancak uygulama dosyayı daha sonra nasıl işlediğine bağlı olarak risk oluşturabilir. Özellikle dosyalar web sunucusunun çalıştırılabilir içerik olarak yorumladığı bir konuma kaydediliyorsa, uzantıya güvenmek ciddi sonuçlar doğurabilir.
Temel kural: Dosya adı, dosyanın gerçek türü için güvenilir bir kanıt değildir.
2. MIME türüne güvenmek
Dosya yükleme isteklerinde çoğunlukla Content-Type başlığı bulunur. Bu başlık, gönderilen içeriğin hangi türde olduğunu belirtmek için kullanılır.
Örneğin bir görsel yükleme isteğinde şu başlık görülebilir:
Content-Type: image/pngContent-Type: image/pngAncak bu başlık da tek başına güvenilir değildir. İstek içindeki başlıklar istemci tarafından gönderildiği için saldırgan tarafından değiştirilebilir. Bir dosyanın image/png olarak bildirilmesi, içeriğinin gerçekten geçerli bir PNG görseli olduğu anlamına gelmez.
Bu nedenle güvenli bir uygulama birden fazla kontrol kullanmalıdır. Dosya uzantısı, bildirilen MIME türü ve dosyanın gerçek yapısı birlikte değerlendirilebilir. Gerekiyorsa dosya, ilgili formatı doğru şekilde anlayan bir kütüphane ile ayrıştırılmalı veya yeniden oluşturulmalıdır.
Örneğin profil fotoğrafları için uygulama, yüklenen görseli güvenilir bir görüntü işleme kütüphanesiyle açıp yeni bir görsel dosyası oluşturabilir. Bu yaklaşım, özgün dosyanın doğrudan saklanıp sunulmasına kıyasla bazı riskleri azaltabilir. Yine de kullanılan kütüphanenin güvenliği ve kaynak tüketimi ayrıca değerlendirilmelidir.
3. Zararlı dosyaların sunucuda çalıştırılması
Dosya yükleme zafiyetlerinin en ciddi sonuçlarından biri, yüklenen bir dosyanın sunucu tarafında kod olarak çalıştırılabilmesidir.
Bunu anlamak için bir web sunucusunun iki farklı dosyayı nasıl ele aldığını düşünelim. Bir PNG dosyası çoğunlukla tarayıcıya sunulan bir görseldir. Sunucu tarafında çalıştırılmak üzere tasarlanmış bir dosya ise belirli bir çalışma ortamı tarafından yorumlanabilir.
Eğer uygulama kullanıcıların yüklediği dosyaları doğrudan çalıştırılabilecek bir dizine kaydediyorsa ve sunucu bu dosyaları çalıştıracak şekilde yapılandırılmışsa, saldırganın yüklediği içerik beklenmedik biçimde yürütülebilir. Web güvenliğinde bu durum, yapılandırmaya bağlı olarak uzaktan kod çalıştırma gibi çok ciddi sonuçlara yol açabilir.
Burada yalnızca dosyanın kabul edilmesi yeterli değildir. Dosyanın nerede saklandığı, sunucunun o dosyayı nasıl yorumladığı ve uygulamanın hangi izinlerle çalıştığı belirleyici faktörlerdir.
Örneğin bir profil fotoğrafı sistemi, yüklenen dosyaları uygulamanın kodlarının bulunduğu dizinde saklamak yerine ayrı bir depolama alanında tutabilir. Bu depolama alanında dosyaların sunucu tarafında çalıştırılması engellenirse, hatalı bir dosyanın yüklenmesi durumunda bile olası etki sınırlandırılmış olur.
Bu nedenle güvenli dosya yükleme tasarımı, yalnızca "Hangi dosyaları kabul ediyorum?" sorusuna değil, "Kabul ettiğim dosyalar daha sonra nerede ve nasıl kullanılacak?" sorusuna da cevap vermelidir.
4. Dosya yükleme zafiyetleri yalnızca kod çalıştırmakla ilgili değildir
Bir dosya yükleme zafiyeti, sunucuda kod çalıştırılmasa bile önemli sonuçlar doğurabilir.
Örneğin yüklenen dosyalar herkesin erişebildiği bir dizinde saklanıyorsa kullanıcıların özel belgeleri yetkisiz kişiler tarafından görüntülenebilir. Uygulama dosyalara erişim izni kontrolü uygulamıyorsa bir kullanıcı başka bir kullanıcının yüklediği dosyayı açabilir.
Başka bir senaryoda saldırgan, aşırı büyük bir dosya yükleyerek sunucunun disk alanını tüketmeye çalışabilir. Uygulama yüklenen dosyaları işlerken çok fazla bellek veya işlemci kaynağı kullanıyorsa, özel hazırlanmış bir dosya da kaynak tüketimini artırabilir.
Görünüşte sıradan bir görselin veya belgenin işlenmesi sırasında kullanılan yazılımda bir güvenlik açığı bulunması da ayrı bir risk oluşturur. Dosyayı ayrıştıran kütüphaneler güncel tutulmadığında, saldırganın hazırladığı dosya bu bileşenlerdeki bilinen veya henüz giderilmemiş hataları tetikleyebilir.
Dolayısıyla dosya yükleme güvenliği şu alanlarla ilişkilidir:
- Dosya türünün doğru belirlenmesi.
- Dosyaların güvenli bir konumda saklanması.
- Erişim izinlerinin doğru uygulanması.
- Dosya boyutu ve kaynak tüketiminin sınırlandırılması.
- Dosyaları işleyen yazılımların güvenli ve güncel tutulması.
Bu kontroller birlikte düşünülmelidir; yalnızca birini uygulamak bütün riskleri ortadan kaldırmaz.
5. Çift uzantılar ve dosya adı manipülasyonu
Dosya adları, uygulamanın dosyayı nasıl ele alacağını belirleyen mekanizmalardan biri olabilir. Bu nedenle dosya adının kullanıcı tarafından kontrol edilebilmesi ayrıca risk oluşturur.
Örneğin bir dosyanın adı fotoğraf.jpg.php olabilir. Uygulama yalnızca dosya adının içinde .jpg ifadesi bulunmasına bakıyorsa bu dosyayı yanlışlıkla kabul edebilir. Ancak dosyanın gerçek uzantısının nasıl belirleneceği, web sunucusunun yapılandırmasına ve uygulamanın kullandığı doğrulama yöntemine bağlıdır.
Benzer şekilde dosya adlarında beklenmeyen karakterler, yol ayraçları veya özel dizin ifadeleri bulunması, dosyaların yanlış konuma kaydedilmesine neden olabilir. Bu tür problemler yol geçişi (path traversal) gibi başka güvenlik sorunlarıyla da ilişkili olabilir.
Bunu önlemek için uygulama, kullanıcının gönderdiği dosya adını doğrudan depolama yolu olarak kullanmamalıdır. Bunun yerine sunucu tarafında rastgele veya benzersiz bir dosya adı oluşturulabilir. İzin verilen dosya türleri açıkça belirlenmeli ve dosyanın kaydedileceği konum uygulama tarafından kontrol edilmelidir.
Örneğin kullanıcı tatil-fotografi.png adlı bir dosya yüklediğinde, sunucu bu dosyayı kendi oluşturduğu bir kimlikle saklayabilir. Orijinal dosya adı gerekiyorsa yalnızca görüntülenecek bir bilgi olarak ayrıca tutulabilir. Böylece dosya adı üzerinden depolama konumunu kontrol etme riski azaltılır.
6. Dosya yükleme istekleri nasıl incelenir?
Bir güvenlik araştırmacısı, dosya yükleme özelliğini incelerken yalnızca yükleme formuna bakmaz. İsteğin nasıl gönderildiğini, sunucunun hangi kontrolleri uyguladığını ve yüklenen dosyanın daha sonra nasıl kullanıldığını anlamaya çalışır.
Tarayıcının geliştirici araçları veya yetkili test ortamlarında kullanılan bir HTTP proxy aracı, yükleme isteğini gözlemlemek için yardımcı olabilir. İstek içerisinde dosyanın adı, bildirilen içerik türü ve dosyanın gönderildiği alan görülebilir.
Örneğin bir dosya yükleme isteğinin basitleştirilmiş biçimi şöyle olabilir:
POST /upload HTTP/1.1
Host: example.test
Content-Type: multipart/form-data; boundary=----ExampleBoundary
------ExampleBoundary
Content-Disposition: form-data; name="file"; filename="photo.png"
Content-Type: image/png
[Dosya içeriği]
------ExampleBoundary--POST /upload HTTP/1.1
Host: example.test
Content-Type: multipart/form-data; boundary=----ExampleBoundary
------ExampleBoundary
Content-Disposition: form-data; name="file"; filename="photo.png"
Content-Type: image/png
[Dosya içeriği]
------ExampleBoundary--Bu örnekte multipart/form-data, form verilerinin ve dosya içeriğinin aynı HTTP isteğinde gönderilmesini sağlar. filename alanı dosyanın adını, dosya bölümündeki Content-Type ise istemcinin bildirdiği türü belirtir.
Ancak bu alanların hiçbiri tek başına dosyanın güvenli olduğunu kanıtlamaz. Güvenlik testi sırasında şu sorular sorulabilir: Sunucu geçersiz bir dosyayı reddediyor mu? Dosya boyutu sınırlandırılmış mı? Yüklenen dosya hangi konumda saklanıyor? Dosyayı başka bir kullanıcı görüntüleyebiliyor mu? Dosya tarayıcıda açıldığında nasıl sunuluyor?
Bu sorular, dosya yükleme özelliğinin hangi güvenlik kontrollerini uyguladığını anlamaya yardımcı olur. Testler yalnızca sana ait sistemlerde veya açıkça izin verilmiş laboratuvarlarda yapılmalıdır.
7. Güvenli bir dosya yükleme sistemi nasıl tasarlanır?
Güvenli bir dosya yükleme sistemi, tek bir kontrol yerine birden fazla savunma katmanı kullanır.
İlk olarak uygulama, hangi dosya türlerine gerçekten ihtiyaç duyduğunu belirlemelidir. Bir profil fotoğrafı özelliği için PDF, arşiv dosyaları veya çalıştırılabilir dosyaları kabul etmek gerekmeyebilir. Kabul edilen türlerin kapsamını daraltmak, saldırı yüzeyini azaltır.
İkinci olarak dosya doğrulaması yalnızca uzantıya veya istemcinin gönderdiği MIME türüne dayanmamalıdır. Uygulama, dosyanın içeriğini uygun bir yöntemle kontrol etmeli ve beklenmeyen formatları reddetmelidir. Görseller gibi belirli türlerde dosyayı güvenilir bir kütüphane ile yeniden işlemek yararlı olabilir.
Üçüncü olarak yüklenen dosyalar, mümkünse uygulamanın çalıştırılabilir kodlarından ayrı bir depolama alanında tutulmalıdır. Bu alanın sunucu tarafında dosya çalıştırmasına izin verilmemeli ve dosyalara erişim gerektiğinde uygulama tarafından kontrollü biçimde sağlanmalıdır.
Dördüncü olarak dosya adları güvenli biçimde oluşturulmalı, dosya boyutları sınırlandırılmalı ve kullanıcının yetkileri kontrol edilmelidir. Özel bir belgeyi yalnızca yükleyen kullanıcı veya yetkili kişiler görüntüleyebilmelidir. Dosya indirme uç noktaları da erişim denetimini atlamamalıdır.
Son olarak dosyaları işleyen kütüphaneler güncel tutulmalı, hatalar güvenli şekilde yönetilmeli ve gerektiğinde zararlı yazılım taraması uygulanmalıdır. Özellikle herkese açık platformlarda dosya yükleme özelliğinin kötüye kullanılmasını önlemek için hız sınırları ve izleme mekanizmaları da faydalıdır.
En önemli yaklaşım şudur: Dosyayı kabul etmek, ona güvenmek anlamına gelmez. Dosya yükleme işleminin her aşaması, uygulamanın güvenlik tasarımının bir parçasıdır.
Sonuç: Bir dosyanın adı, onun ne olduğunu söylemez
Dosya yükleme özellikleri web uygulamalarının vazgeçilmez parçalarından biridir. Ancak dosyalar kullanıcı tarafından gönderildiği için uygulama bunların içeriğine, adına veya tür bildirimine koşulsuz güvenmemelidir.
Bir dosya yükleme zafiyeti; hassas verilerin açığa çıkmasına, hizmetin aksamasına, yetkisiz dosya erişimine veya yanlış yapılandırılmış sistemlerde kod çalıştırılmasına kadar uzanan sonuçlar doğurabilir. Bu risklerin gerçekleşip gerçekleşmeyeceği uygulamanın mimarisine, sunucu yapılandırmasına ve uygulanan güvenlik kontrollerine bağlıdır.
Bir hacker gibi düşünmek, yalnızca yükleme formunun hangi dosyaları kabul ettiğini test etmek değildir. Dosyanın sunucuya ulaştıktan sonra nerede saklandığını, hangi yazılımlar tarafından işlendiğini, kimlerin erişebildiğini ve nasıl sunulduğunu da sorgulamaktır.