File Upload açığı, bir web uygulamasının kullanıcıların yüklediği dosyaları yeterince kontrol etmemesi sonucu oluşan ciddi bir güvenlik problemidir.

Örneğin PHP tarafında yalnızca dosya uzantısına bakılarak yükleme yapılıyorsa;

move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
saldırgan normal bir görsel yerine sunucu tarafından çalıştırılabilecek farklı bir dosya türü yüklemeyi deneyebilir.

Sadece dosya adının sonunda bulunan uzantıyı kontrol etmek çoğu zaman yeterli değildir. Örneğin;

image.php.jpg
shell.phtml
file.phar
gibi dosya adları, yanlış yapılandırılmış sistemlerde filtreleri aşmaya çalışmak için kullanılabilir.

Buradaki temel problem, kullanıcıdan gelen dosyanın gerçekten beklenen türde olup olmadığının güvenilir şekilde doğrulanmamasıdır.

Sadece .php uzantısını engellemek güvenli bir dosya yükleme sistemi oluşturmaz.

Dosya yükleme işlemlerinde uzantı, MIME türü ve dosya içeriği birlikte kontrol edilmeli, yüklenen dosyaların isimleri sistem tarafından yeniden oluşturulmalı ve mümkünse upload klasöründe PHP kod çalıştırılması tamamen kapatılmalıdır.

Ayrıca yükleme klasörü public alanda tutuluyorsa, kullanıcı dosyalarının doğrudan çalıştırılabilir hale gelmediğinden emin olunmalıdır.