Dosya yükleme, neredeyse her web uygulamasında bulunan bir özelliktir: profil fotoğrafı, belge, ek dosya… Ama düzgün korunmadığında güvensiz dosya yükleme, saldırganın sunucuya çalıştırılabilir kod (web shell) bırakıp uzaktan komut çalıştırmasına (RCE) kadar giden ciddi bir zafiyettir.

Yalnızca kendi test ortamında veya yazılı izinli sistemlerde uygula.

Temel Risk: Çalıştırılabilir Dosya Yükleme

Saldırgan, sunucunun yorumlayabileceği bir dosya yükleyip ona doğrudan erişebilirse, o dosya sunucuda çalışır. Klasik PHP web shell:

1
<?php system($_GET['cmd']); ?>

shell.php olarak yüklenip https://site.com/uploads/shell.php?cmd=id şeklinde çağrılırsa, saldırgan sunucuda komut çalıştırır.

Sık Görülen Baypas Teknikleri

Zayıf filtreler çeşitli yollarla atlatılır:

1. Uzantı Hileleri

1
2
shell.php.jpg      shell.pHp       shell.php5
shell.phtml        shell.php%00.jpg   (null byte)

2. Content-Type Sahtekârlığı

Sunucu yalnızca Content-Type: image/png başlığına güveniyorsa, saldırgan bu başlığı elle image/png yapıp içeriği PHP bırakabilir.

3. Magic Byte + Polyglot

Dosyanın başına geçerli bir resim imzası (magic bytes) eklenip devamına kod yazılır; hem “resim” gibi görünür hem de yorumlanınca kod çalışır:

1
GIF89a; <?php system($_GET['cmd']); ?>

4. Yol Geçişi (Path Traversal)

Dosya adı doğrulanmıyorsa, dosya beklenen klasörün dışına yazdırılabilir:

1
filename = "../../var/www/html/shell.php"

Sadece RCE Değil

Güvensiz yükleme başka etkiler de doğurur:

  • XSS: Yüklenen SVG/HTML dosyası tarayıcıda script çalıştırabilir.
  • DoS: Çok büyük dosyalarla disk/bellek tüketimi (ZIP bomb dahil).
  • Antivirüs/depolama zehirlenmesi: Zararlı içeriğin sunucuda barınması.

Korunma Yöntemleri

Önlem Açıklama
Uzantı beyaz listesi Sadece izinli uzantılara izin ver (kara liste değil)
İçerik doğrulama Uzantıya değil, gerçek dosya türüne (magic byte + kütüphane) bak
Yeniden adlandırma Yüklenen dosyaya rastgele/güvenli bir ad ver, kullanıcı adını kullanma
Yürütmeyi kapat Yükleme klasöründe script çalıştırmayı engelle (web sunucu ayarı)
Ayrı depolama Dosyaları uygulama kök dizini dışında veya bir CDN/object storage’da tut
Boyut/oran limiti Maksimum boyut ve yükleme hız limiti uygula

Kritik İlke: Yükleme Klasöründe Çalıştırmayı Engelle

En etkili tekil önlem, dosyaların servis edildiği yerde kod çalıştırmayı tamamen kapatmaktır. Dosya “resim” bile olsa yorumlanamıyorsa, web shell işe yaramaz. Bunu web sunucusu yapılandırmasıyla (ör. o dizinde PHP/exec kapalı) veya dosyaları hiç kod çalıştırılamayan bir object storage’da tutarak sağlarsın.

Sonuç

Güvensiz dosya yüklemede tek bir kontrole güvenmek (yalnızca uzantı ya da yalnızca Content-Type) neredeyse her zaman atlatılır. Doğru yaklaşım katmanlı savunmadır: beyaz liste + gerçek içerik doğrulama + güvenli yeniden adlandırma + yükleme dizininde çalıştırmayı kapatma. Bu katmanlar birlikte, yüklenen bir dosyanın RCE’ye dönüşme ihtimalini pratikte ortadan kaldırır.