Merhaba! Bu yazıda sizlere LFI (Local File Inclusion) açığı nedir anlatacağım. Ayrıca, TryHackMe'de bulunan LFI açığına sahip Lo-Fi makinesini de birlikte çözeceğiz.
LFI (Local File Inclusion), web uygulamalarında kullanıcının belirttiği dosyayı sunucuda okuma veya çalıştırma yetkisi elde etmesine olanak sağlayan bir güvenlik açığıdır. Bu açık sayesinde saldırganlar, sistemdeki önemli dosyaları okuyabilir; örneğin /etc/passwd dosyasındaki kullanıcı adlarını görebilir veya sunucudaki gizli bilgileri elde edebilirler.
LFI Neden olur ?
PHP'de include, require, include_once veya require_once fonksiyonları kullanılırken, kullanıcı girişleri hatalı veya doğrulanmamışsa LFI açığı oluşabilir. Bunu örneklemek için aşağıdaki iki koda göz atabilirsiniz.

Örnek 1'de görülen kod parçasında sistemden sadece istenilen dosya çekiliyor, örneğin: http://victimweb.net/index.php?page=about.php
Burada page parametresi ile about.php çağrılmıştır. Ancak kodda herhangi bir kontrol veya kısıtlama bulunmadığı için saldırgan, about.php yerine sunucudaki başka bir dosyayı okumaya çalışabilir.
Örnek 2'de saldırgan /etc/passwd dosyasını okumaya çalışır, ancak başarısız olur. Bunun nedeni, kodda yapılan istekleri kontrol eden bir if bloğunun bulunmasıdır. Bu blok sayesinde yalnızca $allowed_pages değişkeninde tanımlı dosyalara erişim sağlanabilir. Bu yöntem kodu bir nebze güvenli hâle getirir, ancak tam anlamıyla güvenli değildir; sadece bir örnek olarak verilmiştir.
LFI Açığına sahip Lo-Fi Makinesi
Bunu daha iyi kavrayabilmek için, TryHackMe'de bulunan Lo-Fi makinesini birlikte çözelim.
Eğer siz de çözmek istiyorsanız, TryHackMe'ye girip kayıtlıysanız doğrudan makineye erişebilir ve çözebilirsiniz. Kayıtlı değilseniz, üye olup benimle birlikte çözmeye başlayabilirsiniz.
Makineyi Start tuşu ile başlatıp 1–2 dakika bekliyoruz. Ekranda, CTF makinesinin IP adresi görüntülenecektir.

Verilen linkteki adrese girdiğimizde, bizi ders çalışmak için çeşitli şarkıların bulunduğu bir web sitesi karşılıyor.

Web sitesinin yanında çeşitli müzik seçenekleri bulunuyor. Bu seçeneklerden birine tıklıyoruz.

Tıkladığımızda URL'de ?page=relax.php parametresini görüyoruz. Sunucu, tıklanan sayfayı bu page parametresi aracılığıyla yüklüyor. Eğer sunucuda page parametresi doğru şekilde filtrelenmemiş veya doğrulanmamışsa, bu durum LFI açığına sebep olabilir.
Şimdi burada bir LFI denemesi yapalım. Payload'ımız ../../../../../etc/passwd olacak. Burada ../ bir üst dizine çıkmayı ifade ediyor.
http://<ip addresi>/?page=../../../../../etc/passwd

Başarılı bir şekilde /etc/passwd dosyasını okuyarak LFI açığını tespit etmiş oluyoruz. Makinedeki bayrağı almak için biraz çaba harcıyorum ve sonunda flag.txt dosyasını okuyarak makineyi tamamlıyorum.

KISACA LFI Açığından nasıl Korunulur ?
- Whitelist kullan: Sadece izinli dosyaları include et.
- Dosya yolunu normalize et ve belirli dizinle sınırla.
- Dosya uzantılarını kontrol et.
- PHP konfigürasyonunda
allow_url_includeveallow_url_fopenkapalı olsun. - Kullanıcı girdilerini siterilize et.
- Log ve session dosyalarını web root dışında tut.
- Hata mesajlarını kullanıcıya gösterme.
- Uygulamayı düzenli test et ve güvenlik açıklarını denetle.
LFI açığı, sizin için ciddi bir risk oluşturabilir; bu yüzden yazdığınız kodlara dikkat edin ve düzenli olarak testler yapın. Benim anlatacaklarım bu kadardı; umarım az da olsa size LFI açığını öğretmeyi başarabilmişimdir.