Dosya yükleme güvenlik açıklarını bulmak eğlencelidir, doğası gereği etkilidirler ve hatta bazı durumlarda uzaktan kod yürütülmesine neden olurlar. Günümüzde çoğu geliştirici, güvenli olmayan dosya yükleme uygulamaları konusunda eğitimlidir ancak pratikte hala potansiyel bir güvenlik açığı ortaya çıkabilir.
Bu makalede basit ve gelişmiş dosya yükleme güvenlik açıklarını ele alacağız ve ayrıca belirli ortamlarda yararlanılabilecek uç durumları da ele alacağız. Bu makaleyi bir sonraki hata ödül programınız için bir kontrol listesi olarak kullanmaktan çekinmeyin.
Dosya yükleme güvenlik açıkları, güvenli olmayan dosya yükleme uygulamalarından kaynaklanır. Özellikle bileşen, yüklenen dosyada yetersiz doğrulama gerçekleştirdiğinde veya hiç doğrulama yapmadığında.
Bu davranış, kötü niyetli kişilerin PHP veya ASP dosyaları gibi kötü amaçlı veriler yüklemesine ve hedef sunucuda kod yürütmeye çalışmasına neden olabilir.
Dosya yükleme formu örneği
Bu nedenle, dosya yükleme güvenlik açıkları genellikle doğası gereği etkilidir ve depolanan XSS’den, özel hazırlanmış bir yük dosyası yüklenerek uzaktan kod yürütülmesine kadar çok çeşitli başka güvenlik açıklarına yol açabilir.
Bu makalede dosya yükleme güvenlik açıklarının basit, gelişmiş ve uç durumlarını ele alacağız.
Tüm dosya yükleme uygulamaları yukarıda belirtilen güvenlik açıklarına karşı duyarlı değildir. Dosya yükleme güvenlik açığından başarıyla yararlanmak için öncelikle birkaç koşulun karşılanması gerekir.
Geri alınabilir
Yüklediğiniz dosyayı geri almanın bir yolu olmalıdır. Çoğu şirket özel depolama gruplarından veya uç noktalardan yararlanır, ancak genel olarak dosyanızı daha sonra tetiklemek için nerede saklandığını bilmeniz gerekir.
İçerik Türü
Yüklenen dosyalarınızı işleyen bileşen, içerik türünüzü örneğin şu şekilde geçersiz kılarsa içerik türü düzeltilemez: application/octet-stream
hedef sunucunun veya web tarayıcısının (XSS olması durumunda) dosya içeriklerinizi yürütmesini hiçbir zaman sağlayamamanız mümkün olabilir.
Dosya yüklemedeki güvenlik açıklarını nasıl tanımlayacağınızı daha ayrıntılı bir şekilde öğrenmek için bir video izlemek istiyorsanız YouTube kanalımızdaki Dosya Yükleme videomuzu öneririz:
Basit bir dosya yükleme güvenlik açığından yararlanarak başlayalım.
UÇ! Hiçbir arka uç aynı değildir. Tüm hedefler, dosya yüklemelerini uygulamak için farklı bir yaklaşım kullanır. Dosya yükleme güvenlik açıklarını bulma konusunda istediğiniz sonuca ulaşmak için aşağıda belgelenen atlamalardan bazılarını testinizde birleştirmenizi öneririz.
Kısıtlama yok
Bu durum eski bileşenlerde ve dosya yükleme uygulamalarında daha yaygındır. Dosya yükleme bileşeninin, yükleyebileceğiniz dosyalar üzerinde herhangi bir kısıtlaması yoktur. Bu, bundan yararlanmamızı son derece kolaylaştırıyor.
Sistem komutlarını hedef makinede uzaktan yürütmenize izin verecek bir kabuk dosyası yükleyebilirsiniz. Arka uç PHP’deyse, bir PHP Kabuğu yüklediğinizden emin olun. Arka uç Java ile yazılmışsa, bir JSP kabuğu vb. yüklemeyi deneyin.
POST /Api/FileUpload.aspx HTTP/2
Host: console.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq
Accept: */*
------WebKitFormBoundary3RwPFJztxaJvrqAq
Content-Disposition: form-data; name="file"; filename="intigriti.php"
Content-Type: application/x-php
------WebKitFormBoundary3RwPFJztxaJvrqAq--
Bu makale boyunca yukarıdaki HTTP isteğini örnek olarak kullanacağız.
UÇ! Program yönergelerini her zaman takip edin! Bazı programlar kötü amaçlı dosyaları (veya arka kapıları) yüklemenize izin vermez. Ancak izin verildiğinde, kötü amaçlı dosyanıza yalnızca sizin erişebilmeniz için rastgele bir ad kullanmayı deneyin.
İstemci tarafı kısıtlamalarını atlamak
Geliştiricilerin belirli dosya türlerini deneme ve kısıtlama eğiliminde oldukları başka bir yol da istemci tarafı kısıtlamaları uygulamaktır. Bunlardan biri, giriş formu alanlarındaki “kabul et” HTML özelliğidir. Bu, ortalama bir kullanıcının yanlış dosya türünü yüklemesini engelleyebilir. Ancak bu yaklaşım, istemci ile sunucu arasında bulunan proxy yakalayıcıları kullanan kötü niyetli aktörlere karşı etkisizdir.
Bu bağlamdan yararlanmanın en basit yolu, geçerli bir dosya yüklemek, isteğinizi engellemek ve yüklenen içeriği kötü amaçlı dosyanızla değiştirmektir.
Dosya uzantısı kara listesinin atlanması
Kara listeler, geliştiricilerin dosya yüklemelerini kısıtlamak için kullandıkları başka bir yaklaşımdır. Ve belki de tüm kötü amaçlı dosya uzantılarını düşünmüş olabilir, her zaman kimsenin bilmediği veya çok az bildiği belirsiz bir uzantı vardır.
Bazı yaygın bypasslara bir göz atalım:
Dosya uzantısı hariç tutma listelerini atla
İdeal olarak, bunların hepsini denemeli, arka ucun girişinizi nasıl işlediğini anlamalı ve kötü amaçlı dosyanızı yüklemek için herhangi bir normalleştirme yapıp yapmadığını doğrulamalısınız.
UÇ! Bir dışlama listesiyle mi yoksa izin verilenler listesiyle mi karşı karşıya olduğunuzu bilmiyor musunuz? Rastgele uzantılı bir dosya yüklemeyi deneyin; eğer kabul edilirse büyük olasılıkla bir kara listeyle karşı karşıya kalırsınız, aksi takdirde bu büyük olasılıkla kesin olarak tanımlanmış bir izin verilenler listesi olacaktır.
Dosya uzantısı beyaz listesinin atlanması
Beyaz listeyi atlama yaklaşımı yukarıda belirtilen durumdan biraz farklıdır. Burada, kesin olarak tanımlanmış uzantılara sahip mevcut bir izin verilenler listesinden yararlanmamız veya ayrıştırma yönteminde veya kullanılan normal ifade deseninde herhangi bir kusur bulmamız gerekecek.
Kapsamı gevşek olan herhangi bir normal ifade düzeninden yararlanmak için özel kodlamalara sahip olanlar da dahil olmak üzere, daha fazla bypass’a göz atalım:
Dosya uzantısı ekleme listelerini atla
Dosya yükleme uygulaması dosya türünüzü içerik türüne göre belirliyorsa, beyaz listede yer alan dosya uzantısına sahip ancak kötü amaçlı içerik türünüze sahip bir dosyayı da yüklemeyi deneyebilirsiniz:
POST /Api/FileUpload.aspx HTTP/2
Host: console.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq
Accept: */*
------WebKitFormBoundary3RwPFJztxaJvrqAq
Content-Disposition: form-data; name="file"; filename="intigriti.png"
Content-Type: application/x-php
------WebKitFormBoundary3RwPFJztxaJvrqAq--
Şunu not edin: filename
Ve Content-Type
yukarıdaki örnek istekte.
Daha önce olduğu gibi, arka uçta meydana gelen herhangi bir normalleşmeyi tespit etmeye çalışmalı ve bunu kendi avantajınıza kullanmaya çalışmalısınız.
Şimdi dosya yükleme kısıtlamalarını daha gelişmiş şekilde aşmaya geçelim.
İçerik türü kısıtlamalarını atlama
Geliştiricilerin kötü amaçlı dosyaları kısıtlamak için kullandığı başka bir yaklaşım da, yüklediğiniz dosyanın içerik türünü doğrulamaktır. Bu durumda, dosya uzantısını istediğimiz dosya türüne bırakırken içerik türünü izin verilen herhangi bir MIME türüne ayarlamayı deneyebiliriz:
POST /Api/FileUpload.aspx HTTP/2
Host: console.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq
Accept: */*
------WebKitFormBoundary3RwPFJztxaJvrqAq
Content-Disposition: form-data; name="file"; filename="intigriti.php"
Content-Type: image/png
------WebKitFormBoundary3RwPFJztxaJvrqAq--
Yine güvenlik açığı bulunan bileşene bağlı olarak, dosya alınırken dosya türünün dosya içerik türü yerine dosya uzantısına göre belirlenmesi mümkündür.
UÇ! Aynısını burada da uygulayın ve mevcut ayrıştırma ve doğrulama kusurlarından yararlanmaya çalışın. Birden fazla içerik türü gönderirken hedefinizin nasıl davrandığını kontrol edin, içerik türü parametresini hiç kullanmayın veya tamamen kaldırın.
Sihirli baytlar
Dosya içeriğinin ilk birkaç baytı (karakterleri) dosya türünü belirler ve tanımlar. Bunlara genel olarak sihirli baytlar, sihirli sayılar veya dosya imzaları da denir.
Geliştiriciler bunları belgeyi doğrulamak için kullanır ve içerik türü veya dosya uzantısı gibi diğer parametreleri göz ardı eder. Şanslıyız ki, bu doğrulamayı geçen bir dosyayı kötü amaçlı yükümüzle yükleyebiliyoruz.
Bunlar HEX’teki normal bir görüntünün (PNG) sihirli baytlarıdır:
89 50 4E 47 0D 0A 1A 0A
Dosya kısıtlama filtresinin sihirli baytlara dayalı olduğu kesinse, bunları kötü amaçlı dosyamızda kullanabiliriz:
POST /Api/FileUpload.aspx HTTP/2
Host: console.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq
Accept: */*
------WebKitFormBoundary3RwPFJztxaJvrqAq
Content-Disposition: form-data; name="file"; filename="intigriti.php"
Content-Type: application/x-php
‰PNG␍␊␚␊
------WebKitFormBoundary3RwPFJztxaJvrqAq--
Yüklediğimiz dosya ilk etapta resim olarak algılanacağı için doğrulamadan geçecektir. Ancak daha sonra PHP dosyasını istediğimizde, kötü amaçlı kodumuzun sunucuda tetiklenmesi ve çalıştırılması mümkün olabilir.
Wikipedia’da belgelenen dosya imzalarının listesine bir göz atın: https://en.wikipedia.org/wiki/List_of_file_signatures
UÇ! Daha agresif filtrelerden kaçınmak için birkaç bypass yönteminin bir kombinasyonunu kullanın!
Sunucu yapılandırma dosyalarının üzerine yazma
Dosya adında hiçbir katı kısıtlama yapılmadıysa veya doğru doğrulama yapılmadıysa, bazı uç durumlarda dosya dizinleri arasında geçiş yapabiliriz ve hatta yalnızca çakışan ada sahip bir dosya yükleyerek sunucu yapılandırma dosyalarının üzerine yazabiliriz.
Basit bir örneğe bakalım.
Hedefinizin HTTP üzerinden içerik sunmak için Apache kullandığını varsayalım. Apache’nin desteği .htaccess
yapılandırma dosyaları. Dosyalarımızın nereye kaydedildiğini bulduktan sonra, mevcut bir dosyanın üzerine yazmayı deneyebiliriz. .htaccess
yapılandırma dosyası veya yeni bir tane oluşturun.
POST /Api/FileUpload.aspx HTTP/2
Host: console.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.3
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary3RwPFJztxaJvrqAq
Accept: */*
------WebKitFormBoundary3RwPFJztxaJvrqAq
Content-Disposition: form-data; name="file"; filename="../../../.htaccess"
Content-Type: text/plain
# Your server configuraton rules
------WebKitFormBoundary3RwPFJztxaJvrqAq--
Bununla mevcut sunucu yapılandırmalarını değiştirebiliriz ve çoğu durumda bu, hedefte kod yürütülmesine yol açabilir.
Hedefinizde çalışan hizmetleri ve teknolojileri numaralandırmanızı ve hedefinize özel olarak yük taşımanızı öneririz.
Dosya yükleme güvenlik açıkları doğası gereği kritik öneme sahiptir, bu nedenle zaman ayırmaya ve bu tür güvenlik açıklarına yönelik testler dahil etmeye değer. Mümkün olan her yükü yüklemeye çalışmalı, dosya doğrulama süreçlerindeki olası zayıflıkları ve kusurları bulmalı ve kötü amaçlı dosyaları yüklemek için bunlardan yararlanmalısınız.
Gelişmiş dosya yükleme güvenlik açıklarından yararlanma konusunda yeni bir şey öğrendiniz… Şu anda becerilerinizi test etme zamanı! Intigriti’deki 70’ten fazla genel hata ödül programımıza göz atın ve kim bilir, belki bir sonraki ödülünüz bizimle kazanılır!
BUGÜN INTIGRITI’DE HACKLEMEYE BAŞLAYIN