Güvenli bir dosya yükleme özelliği, birlikte uygulanan birden fazla kontrole dayanır ve OWASP File Upload Cheat Sheet bu kontrolleri listeler. Bu makale söz konusu listeyi gözden geçiriyor, kolayca atlanan maddelere dikkat çekiyor ve listeyi her yükleme uç noktasına karşı çalıştırabileceğiniz testlere dönüştürüyor.
Neye karşı savunma yapıyorsunuz
Cheat sheet, tehditleri "malicious files" (zararlı dosyalar) başlığı altında toplar. İlki, dosyayı işleyen yazılıma yönelik saldırıdır. Saldırgan, ayrıştırıcıdaki (parser) veya işleme modülündeki bir zafiyeti istismar eden bir dosya iletir. Cheat sheet örnek olarak ImageTrick exploit'ini ve XXE'yi sayar.
İkincisi oltalamadır (phishing). Cheat sheet örnek olarak bir kariyer formunu kullanır. Bu, yüklemenin zararlı bir dosyayı onu açacak kişilerin önüne koymanın yolu haline gelebileceği anlamına gelir.
Üçüncüsü erişilebilirliktir. ZIP bombaları, XML bombaları (billion laughs saldırısı) ve sadece çok büyük dosyalar sunucunun depolama alanını doldurabilir ve sunucunun erişilebilirliğine zarar verebilir.
Kabul etmeden önce doğrulayın
Cheat sheet bir sıra belirler: uzantıyı doğrulamadan önce girdi doğrulaması (input validation) uygulayın. Ardından bir izin listesi (allowlist) üzerinden ilerler.
- İzin verilen uzantıları listeleyin. Yalnızca iş fonksiyonunun gerektirdiği güvenli olanlara izin verin. Bir profil fotoğrafı formunun birkaç görsel türü dışında bir şeyi kabul etmesi için hiçbir neden yoktur.
- Dosya türünü doğrulayın. Beyan edilen
Content-Typedeğerine güvenmeyin, çünkü sahte olabilir. Yüklemeyi kabul etmeden önce dosya türünü ve imzasını (signature) doğrulayın. - Dosya adı uzunluğu için bir sınır belirleyin ve mümkünse izin verilen karakterleri kısıtlayın.
- Dosya boyutu için bir sınır belirleyin.
Bir dosya bu kontrollerden herhangi birini geçemezse reddedin.
Ada ve konuma özen gösterin
Cheat sheet, kullanıcının verdiği dosya adını uygulama tarafından üretilen bir adla değiştirmenizi söyler. Dosya türü ne olursa olsun bunu her yüklemede yapın.
Dosyanın nerede saklandığı, ne olduğu kadar önemlidir. Mümkünse yüklemeleri ayrı bir sunucuda saklayın. Bu mümkün değilse webroot dışında saklayın.
Dosyaların herkese açık erişilebilir olması gerekiyorsa, depolama yolunu doğrudan göstermek yerine bir tanımlayıcıyı bir dosyaya eşleyen (someid değerinden file.ext değerine) uygulama içi bir handler kullanın.
Listeden kolayca unutulan iki madde daha var:
- Yalnızca yetkili kullanıcılar dosya yükleyebilmelidir.
- Yüklemeyi CSRF saldırılarına karşı koruyun.
Sakladığınız dosyayı tarayın ve işleyin
Doğrulama, bir dosyanın doğru göründüğünü kontrol eder. Cheat sheet ek bir adım önerir: varsa dosyayı bir antivirüs motorundan veya sandbox'tan geçirerek zararlı veri içermediğini doğrulayın.
PDF ve DOCX gibi uygun doküman türleri için ek bir işleme adımı olarak CDR (Content Disarm & Reconstruct) kullanmayı değerlendirin.
Cheat sheet ayrıca kullanılan tüm kütüphanelerin güvenli biçimde yapılandırılması ve güncel tutulması gerektiğini söyler. Ayrıştırıcı zafiyetleri adı geçen tehditlerden biri olduğundan, bu madde isimli bir kişiye ve bir inceleme tarihiyle atanması gereken maddedir.
Her uç noktayı test edin
Cheat sheet test senaryoları değil, kontroller listeler. Aşağıdaki her satır, kendi kontrol listesinden türettiğimiz bir çıkarımdır ve üçüncü sütun hangi maddeden geldiğini gösterir. Testleri yönetim araçları ve tek bir müşteri için eklenenler dahil, her yükleme uç noktasına karşı çalıştırın.
| Test | Başarılı sonuç nasıl görünür | Dayanak |
|---|---|---|
| İzin verilen bir uzantıya yeniden adlandırılmış bir betik dosyası yükleyin | Dosya türü doğrulamasından sonra reddedilir | Türetilmiş: dosya türünü doğrulayın |
İzin verilen bir Content-Type ile izin verilmeyen bir dosya gönderin | Yine reddedilir | Türetilmiş: Content-Type başlığına güvenmeyin |
| Çok uzun bir dosya adı gönderin | Reddedilir veya üretilmiş bir adla değiştirilir | Türetilmiş: dosya adı uzunluğu sınırı, üretilmiş dosya adları |
| Boyut sınırını aşan bir dosya yükleyin | Reddedilir | Türetilmiş: dosya boyutu sınırı |
| Saklanan dosyayı yolunu tahmin ederek talep edin | Handler dışında erişilemez | Türetilmiş: depolama konumu, eşlenmiş handler |
| Oturum olmadan veya CSRF token'ı olmadan yükleme yapın | Reddedilir | Türetilmiş: yetkili kullanıcılar, CSRF koruması |
| Test ortamında bir ZIP veya XML bombası yükleyin | Servis erişilebilir kalır | Türetilmiş: erişilebilirlik tehdidi |
Daha geniş bir referans için OWASP Web Security Testing Guide, kendisini web uygulaması geliştiricileri ve güvenlik uzmanları için önde gelen siber güvenlik test kaynağı olarak tanımlar. OWASP Application Security Verification Standard ise karşısında doğrulama yapabileceğiniz numaralı gereksinimler sunar. Bir bilette veya raporda bunlardan birine atıf yapıyorsanız, örneğin v5.0.0-1.2.5 gibi sürümü de belirtin, çünkü tanımlayıcılar standardın sürümleri arasında değişebilir.
Nereden başlamalı
- Yönetim araçları, içe aktarma fonksiyonları ve eski eklentiler dahil, dosya kabul eden her uç noktayı listeleyin.
- Her biri için izin verilen uzantıları, azami dosya boyutunu ve azami dosya adı uzunluğunu belirleyin ve uzantı kontrolünden önce girdi doğrulaması uygulayın.
- Kullanıcının verdiği dosya adlarını üretilmiş adlarla değiştirin. Depolamayı ayrı bir sunucuya veya webroot dışına taşıyın ve herkese açık dosyaları kimlikleri dosya adlarına eşleyen bir handler üzerinden sunun.
- Dosya türü ve imza doğrulaması, bir antivirüs veya sandbox adımı ve kabul ettiğiniz doküman türleri için CDR ekleyin. Ayrıştırma kütüphanelerinin güncel ve güvenli biçimde yapılandırılmış olduğunu kontrol edin.
- Test tablosunu betikli kontrollere dönüştürün ve her sürümden önce çalıştırın. Sonuç için dışarıdan bir inceleme isterseniz sızma testi hizmetimiz uç noktaları test edebilir, özellik hâlâ tasarım aşamasındaysa güvenli yazılım geliştirme desteğimiz yardımcı olabilir. OWASP dosya yükleme rehberi her iki durumda da inceleme kontrol listesi olarak işe yarar.
