ModSecurity ile Dosya Yükleme Zafiyetinin Engellenmesi

ModSecurity ile web güvenlik açıklarının engellenmesi hakkındaki yazı dizimizin bu son bölümünde, ModSecurity kullanarak web uygulamalarında unutulan dosya yükleme kontrolleri nedeniyle ortaya çıkan ve sistemde arka kapılar açılmasına neden olabilecek dosya yükleme zafiyetinin engellenmesinden bahsedeceğiz.

 

Dosya Yükleme Zafiyeti (Arbitrary File Upload Vulnerability) Nedir?

Dosya yükleme zafiyeti, web uygulamalarında dosya yüklemenin doğrulanmaması/onaylanmaması veya dosyaların sisteme yüklenmeden önce yanlış doğrulanması sonucu ortaya çıkan bir güvenlik açığıdır. Birçok yerde ortaya çıkan bu zafiyeti kapatmanın birçok yolu vardır.

Birçok türü olan dosya yükleme zafiyetinin default ModSecurity CRS kuralları ile kapatılması pek mümkün olamıyor. Bu yüzden uygulamaya hakim olup, uygulamadaki zafiyete özel bir ModSecurity kuralının yazılması dosya yükleme zafiyetinin kolayca kapatılmasını sağlayacaktır.

Yazı dizimizin bu bölümünde ağırlıklı olarak High-Tech Bridge kaynağı referans olarak alınmıştır. Ayrıca dosya yükleme zafiyetiyle ilgili bir Türkçe kaynak olarak bu bağlantıdan da yararlanabilirsiniz.

 

— BÖLÜM 8: ModSecurity ile Dosya Yükleme Zafiyetinin Engellenmesi —

Alttaki dosya yükleme zafiyetine açık PHP script’ini inceleyelim:

upload_image.php

<?
 if($_FILES['f'] && move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name']))
 {
  echo "Upload success!\r\n<br>";
 }
?>
<form enctype="multipart/form-data" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
<input name="f" type="file">
<input type="submit">
</form>

Yukarıdaki koda göre default ModSecurity CRS kurallarının herhangi bir faydası olmayacaktır. Saldırgan alttaki haliyle bu dosya yükleme zafiyetini istismar edecektir:

POST /upload_image.php HTTP/1.1
Host: [host]
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/1.0
Accept: text/html
Content-Type: multipart/form-data; boundary=---------------------------248082149912414
Content-Length: 335

-----------------------------248082149912414
Content-Disposition: form-data; name="MAX_FILE_SIZE"

10000000
-----------------------------248082149912414
Content-Disposition: form-data; name="f"; filename="shell.php"
Content-Type: application/x-httpd-php

<? system("id"); ?>
-----------------------------248082149912414--

Dosya başarılı bir şekilde sisteme yüklenecek ve sytem “id” komutunu alttaki URI ile çalıştıracaktır:

http://[host]/shell.php
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Alttaki özel ModSecurity kuralı ise bu zafiyetin sömürülmesini, sadece GIF, JPEG ve PNG dosyalarının sunucuya yüklenmesine izin vererek engelleyecektir:

mod_security_custom_rules.conf

SecRule REQUEST_FILENAME "/upload_image.php" "phase:2, t:none, t:normalisePath, t:lowercase, t:urlDecodeUni, chain, deny, log, id:1101"
SecRule FILES:f "![a-z0-9]\.((jpe?g|png|gif))" "t:none, t:lowercase"

Yazı dizimizin bu son bölümü ile bir kez daha ModSecurity CRS’in varsayılan kurallarının dikkatli bir şekilde kullanılmasının gerekliliğini ve sadece buna bağlı kalınmayarak uygulamaya ve zafiyete özel yeni ModSecurity kuralları yazmanın her zaman için çok daha isabetli olacağını göstermiş oluyoruz.

— YAZI DİZİSİ SONU —

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir