File Inclusion
File Inclusion zafiyetleri, web uygulamalarında oldukça yaygın olarak bulunabilen ve tehlikeli güvenlik açıklarından biridir. Bu zafiyetler, bir web uygulamasının kullanıcı girdilerini uygun şekilde doğrulamadığında ortaya çıkar ve saldırganların sunucu üzerindeki dosyalara erişmesine veya uzaktan zararlı dosyalar dahil etmesine olanak tanır.File Inclusion zafiyetleri iki ana kategoriye ayrılır. Bu yazıda LFI'dan bahsedeceğim.
- Local File Inclusion (LFI)
- Remote File Inclusion (RFI)
File Inclusion Zafiyetlerinin Nedenleri
File Inclusion zafiyetleri, genellikle geliştiricilerin kullanıcı girdilerini yetersiz şekilde doğrulaması veya filtrelemesi sonucu ortaya çıkar. Web uygulamaları, dinamik olarak belirli dosyaları dahil etmek için kullanıcıdan dosya adı veya yol bilgisi alabilir. Eğer bu girdiler uygun şekilde kontrol edilmezse, saldırganlar bu girdileri manipüle ederek istenmeyen dosyalara erişebilir veya zararlı dosyaları sunucuya dahil edebilir.Örnek
PHP ile yazılmış bir web uygulamasının aşağıdaki gibi bir dosya dahil etme işlemi gerçekleştirdiğini varsayalım:
Bu örnekte, kullanıcıdan alınan<?php $file = $_GET['page']; include($file);?>
Page parametresi doğrudan include fonksiyonuna aktarılıyor. Eğer kullanıcı page=../../../etc/passwd gibi bir değer gönderirse, uygulama sunucu üzerindeki passwd dosyasını dahil edebilir. Bu, saldırganın sunucunun yapılandırma dosyalarına ve diğer hassas bilgilerine erişim sağlamasına olanak tanır.
File Inclusion Zafiyetlerinden Korunma
File Inclusion zafiyetlerinden korunmanın en etkili yolu, kullanıcı girdilerini doğru şekilde doğrulamak ve filtrelemektir. Bunun yanı sıra, aşağıdaki güvenlik önlemleri de alınmalıdır:- Girdi Doğrulama ve Filtreleme: Kullanıcı girdilerini sıkı bir şekilde doğrulamak ve potansiyel zararlı girdileri filtrelemek önemlidir.
- Dosya Yolunu Sabitleme: Dahil edilecek dosyaların yollarını sabitlemek ve sadece belirli dizinler içerisindeki dosyaların dahil edilmesine izin vermek.
- Güvenlik Duvarları ve WAF Kullanımı: Web Uygulama Güvenlik Duvarı (WAF) gibi araçlar kullanarak zararlı istekleri tespit etmek ve engellemek.
- Güvenlik Güncellemeleri: Web uygulamalarını ve sunucu yazılımlarını düzenli olarak güncelleyerek bilinen güvenlik açıklarını kapatmak.
Local File Inclusion (LFI)
LFI zafiyetleri, genellikle aşağıdaki gibi dinamik dosya dahil etme işlemlerinde ortaya çıkar:Bu örnekte,<span><?php</span><span> $file = $_GET['page'];</span><span> include($file);</span><span>?></span>
page parametresi kullanıcıdan alınır ve doğrudan include fonksiyonuna aktarılır. Kullanıcı,
page=../../../../etc/passwd gibi bir değer gönderirse, sunucu üzerindeki /etc/passwd dosyasını dahil edebilir. Bu dosya, sistem kullanıcıları hakkında kritik bilgileri içerebilir ve saldırganın sunucuya yetkisiz erişim sağlamasına yardımcı olabilir.
LFI payloadlarında kullanılan ../ ifadesi Linux sistemlerde bir önceki dizini işaret eder. Bizim amacımız /etc/passwd dosyasını okumak olabilir ancak web uygulamasında bu dosyayı /var/www/html/project gibi bir dizinde arayabilir. Dolayısıyla biz payloadımıza bir çok kez ../ifadesini ekleyerek öncelikle Linux sistemin kök dizinine (/) erişip ardından /etc/passwd dosyasını okumaya çalışırız.
LFI Saldırıları ve Senaryoları
Log Dosyalarına Erişim
Web sunucuları genellikle erişim ve hata günlükleri tutar. Saldırganlar, bu log dosyalarına erişerek önemli bilgiler elde edebilirler.PHP Kod Enjeksiyonu (Log Poisoning)
LFI zafiyeti, saldırganların zararlı PHP kodlarını çalıştırmasına da olanak tanıyabilir. Örneğin, web sunucusunun erişim loglarına bir PHP kodu eklenmişse, bu kod LFI zafiyeti kullanılarak çalıştırılabilir.Aşağıda User-Agent alanına enjekte edilmiş PHP kodu bulunan bir HTTP isteği bulunuyor.
Bu isteği gönderdikten sonra tarayıcıdan access.log dosyasını görüntüleyelim.GET /index.php HTTP/1.1
User-Agent: <?php system('ls'); ?>
Bu durumda, zararlı PHP kodu sunucu üzerinde çalıştırılır ve saldırgan sunucu dosya sistemindeki dosyaları listeleyebilir.
PHP://filter ile Dosya Okuma
PHP'nin php://filter özelliği, dosya içeriğinin okunması sırasında belirli filtrelerin uygulanmasına olanak tanır. Bu özellikle bir dosyanın Base64 ile kodlanarak okunması, dosya içeriğini direkt olarak okumanın mümkün olmadığı durumlarda kullanışlı olabilir. Bu, özellikle web uygulamalarında hata mesajlarında veya bazı log dosyalarında yararlı olabilir.- Payload:
<span>php://filter/convert.base64-encode/resource=home.php</span>
<span>http://4oca4.com/index.php?page=php://filter/convert.base64-encode/resource=home.php</span>
- Çıktı:
PD9waHAKCmVjaG8gImhlbGxvIHdvcmxkIjsKCj8+
- Base64 Kodunu Çözme:
echo 'PD9waHAKCmVjaG8gImhlbGxvIHdvcmxkIjsKCj8+' | base64 --decode
- Base64 Kodununun Çıktısı:
<?php echo "hello world"; ?>
Bypass Yöntemleri
Local File Inclusion (LFI) zafiyetlerine karşı birçok web uygulaması çeşitli koruma mekanizmaları uygular. Ancak, bu korumalar genellikle yeterli değildir ve çeşitli bypass teknikleri kullanılarak aşılabilir.1. Dizin Geçişi Filtreleri (Path Traversal Filters)
Bazı web uygulamaları, dizin geçişlerini (../) engellemek için basit bir arama ve değiştirme filtresi kullanır. Bu filtreler, ../ alt dizelerini kaldırarak dizin geçiş saldırılarını önlemeyi amaçlar.Örnek Kod
Bu kod, ../ alt dizelerini kaldırarak dizin geçişini engellemeyi hedefler. Ancak, bu filtreler genellikle yetersizdir çünkü girdiyi sadece bir kez işler ve çıktıya yeniden filtre uygulamaz. Bu nedenle, ....// gibi girdiler kullanarak filtreyi aşmak mümkündür.$language = str_replace('../', '', $_GET['language']);
Bypass Yöntemi
- Gönderdiğimiz Payload:
....//....//....//....//etc/passwd
- Filtrelendikten Sonraki Hali:
Bu şekilde, ../ alt dizeleri kaldırıldıktan sonra hala dizin geçişi gerçekleştirebiliriz. Benzer şekilde, ..././ veya ..../ gibi diğer dizin geçiş alt dizeleri de kullanılabilir.../../../../etc/passwd
2. Kodlama (Encoding)
Bazı web uygulamaları, LFI ile ilgili karakterleri içeren girdileri engelleyen filtreler kullanır. Ancak, bu filtreler URL kodlama kullanılarak aşılabilir. URL kodlama, kötü karakterleri içermeyen ancak yine de çözülerek dizin geçişi sağlayacak bir giriş sağlar.Örneğin, . ve / karakterlerini içeren girdiler engelleniyorsa, ../ dizesini- %2e%2e%2f
- https://4oca4.com/index.php language=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64
Not: URL encoding ve decoding işlemleri için kullanılabilecek birçok çevrimiçi site vardır, buralardan yararlanılabilir.
3. İzin Verilen Yollar (Approved Paths)
Bazı web uygulamaları, dosyanın belirli bir dizin altında olmasını sağlamak için düzenli ifadeler (regex) kullanır.Örnek
Yukarıdaki kod parçacığında, kullanıcıdan gelen get parametresininif(preg_match('/^\.\/languages\/.+$/', $_GET['language'])) { include($_GET['language']);} else { echo 'Invalid path specified!';}
language
kelimesi ile başlayıp başlamadığı kontrol ediliyor. Bu filtreyi aşmak için, sunucu tarafından izin verilen yol ile başlamalı ve ardından ../ kullanarak kök dizine dönmeliyiz:
Bu yöntem, izin verilen yolu kullanarak filtreyi aşar ve dizin geçişi gerçekleştirir.
4. Null Byte Enjeksiyonu
Bazı web uygulamaları, girdi dizisine belirli bir uzantı ekleyerek (örneğin .php) dosya dahil etme işlemini sınırlar. Ancak, eski PHP sürümlerinde bu tür filtreler null byte (%00) enjeksiyonu kullanılarak aşılabilir.Null byte, dizeyi sonlandırır ve sonraki karakterleri yok sayar.
Null Byte Karakteri: %00
Bu şekilde, .php uzantısı yok sayılır ve /etc/passwd dosyası dahil edilir.
Önleme Yöntemleri
File Inclusion zafiyetleri, özellikle web uygulamalarında ciddi güvenlik açıklarına neden olabilir. Bu zafiyetlerin önlenmesi için çeşitli yöntemler ve uygulamalar mevcuttur. Bu bölümde, File Inclusion zafiyetlerinden korunmak için alınabilecek önlemleri detaylı bir şekilde ele alacağız.
- Input Validation (Girdi Doğrulama)
- Beyaz Liste (Whitelist) Kullanımı: Yalnızca belirli ve güvenli dosyaların yüklenmesine izin verin. Beyaz liste, izin verilen dosya adlarını veya yollarını içerir.
- Regex Kullanımı: Dosya yollarını ve adlarını belirli bir desenle eşleştirerek doğrulayın.
- Uzantı Kontrolü: Yalnızca belirli dosya uzantılarına izin verin (örneğin, .pdf, .jpg).
- Path Traversal Önleme
- Gerçek Yol (Realpath) Kullanımı: Dosya yolunu realpath() gibi fonksiyonlarla çözümleyin ve beklenen dizin içinde olup olmadığını kontrol edin.
- Dizin Sabitleme (Chroot Jail): Uygulamayı belirli bir dizinle sınırlayarak dışarıya erişimi engelleyin.
- Dosya Dahil Etme Kısıtlamaları
- Tam Yol (Full Path) Kullanımı: Dosya adlarını tam yollarıyla belirtin ve dinamik girdi yerine sabit yollar kullanın.
- Dış Kaynak Kısıtlamaları: Dış kaynaklardan dosya dahil edilmesini engelleyin. Özellikle, URL tabanlı dosya dahil etme işlemlerine izin vermeyin.
- Dosya İzinleri ve Güvenlik
- Dosya İzinleri: Yalnızca gerekli izinlere sahip dosyaların dahil edilmesini sağlayın. Dosya izinlerini chmod ile ayarlayın ve minimum izinleri kullanın.(Dosya izinleri ile ilgili yazıma da buradan ulaşabilirsiniz.)
- Dosya Sahipliği: Dosya sahibi ve grup sahipliğini kontrol edin ve sadece yetkili kullanıcıların dosya erişimini sağlayın.
- Kod İnceleme ve Güvenlik Testleri
- Kod İnceleme: Manuel ve otomatik kod inceleme araçları kullanarak kod güvenliğini kontrol edin.
- Sızma Testleri: Düzenli sızma testleri yaparak file inclusion zafiyetlerini tespit edin ve düzeltin.
- Güvenlik Duvarları ve WAF (Web Application Firewall)
- WAF Kullanımı: ModSecurity gibi WAF araçları kullanarak file inclusion saldırılarını otomatik olarak engelleyin.
- Güvenlik Kuralları: Özelleştirilmiş güvenlik kuralları oluşturarak belirli saldırı türlerini hedefleyin ve engelleyin.