Muallim-i Ali Posted June 18, 2007 Share Posted June 18, 2007 Yazar: Ferit Bu makaleyi okuyanlar; - İçerik yönetimini farklı dosyaları çağırarak yapmanın yol açabileceği güvenlik sorunlarını, - Bu tür bir sistemde güvenliğin nasıl sağlanabileceğini öğrenecekler. Dosya 'Include' Saldırıları İnternette dolaşırken mutlaka görmüşsünüzdür, foo.php?hede=Homepage temasındaki içerik yönetim sistemlerini... hede bilgisine olmayan bir dosya ismi yazdığınızda da PHP'nin verdiği hata çıktısını da birkaç kişi fark etmiştir pekala Peki hiç bu şekilde basit olarak çalışan bir sitenin ne gibi ciddi sorunlara yol açabileceğini ya da güvenlik ile alakalı siteleri dolaşırken, eski PHP yazılımlarının büyük çoğunluğunda çıkan bu güvenlik açığının nedenlerini düşündünüz mü? O zaman sizi bu yazının devamına alalım... Nasıl Çalışırlar? Şöyle bir düşünün; PHP olarak hazırladığınız bir siteniz var ve bu site ana dosya olan index.php üzerinden çalışıyor. URL adresinden ?page=sayfa şeklinde aldığınız bilgi yoluyla dosya içeriğini sayfaya 'include' ediyorsunuz. Kaba taslak bir kodla yazacak olursak; <?phpif(!$_GET['page'])include('anasayfa.php');elseinclude($_GET['page'].'.php');//// ... ve diğer kodlar ...//?>[/CODE]Evet, herşey daha net oldu sanırım şimdi. Kullanıcıdan aldığımız sayfa adına .php uzantısını ekliyor ve sayfaya doğrudan 'include' ediyoruz.Öyleyse, bu yazıda anlatılmaya çalışılan ciddi sorun nedir? Eğer kendinize böyle bir sistem hazırlamışsanız, sayfanıza foo.php?page=olmayanbirsayfa diye girdiğinizde [1] PHP'nin şuna benzer bir uyarı -ya da require() için mantık hatası (fatal error)- verdiğini göreceksiniz;Warning: main(olmayanbirsayfa.php) [function.main]: failed to open stream: No such file or directory in /home/myxomatose/public_html/test.php on line 1Warning: main() [function.include]: Failed opening 'olmayanbirsayfa.php ' for inclusion (include_path='/usr/share/php') in /home/myxomatose/public_html/test.php on line 1"E biz de zaten bu tür bir URL adresine bağlantı koymuyoruz sitemizde, n'olacak ki?" derseniz, page bilgisine konulan bir uzak URL adresi [2], bu cümlenizin kursağınızda kalmasına sebep olabilr Bu tür bir yöntemle site tamamen ele geçirilerek zararlı kodlar çalıştırılabilir...[b]Nasıl Korunurum?[/b]Kod yazma aşamasına geçmeden önce bilmemiz gereken bazı şeyler var;- include(), include_once(), require() ve require_once() fonksiyonları dosya ekleme işlevindedirler. Sonu _once ile bitenler, dosyayı daha önce eklemişlerse bir daha eklememe gibi bir farka sahiptirler. Eğer bunlardan herhangi birini kullanacaksanız; require()'ın koddan çıkacak bir 'Fatal Error', include()'un ise koddan çıkmayacak bir uyarı (warning) vereceğini unutmamanız gerekmektedir. Bir hata durumunda yapılacakları/ekrana yazılacakları belirlemek içinse or die() ve or exit() gibi deyimleri de kullanabilirsiniz.- Dosya çağırma fonksiyonları, dosyanın tam yolu belirtildiğinde de çalışma özelliğine sahiptirler. include('/home/myxomatose/public_html/include.php') gibi bir komut sağlıklı olarak çalışacaktır. Bu, yazacağımız kodda çok işimize yarayacak...- Çağrılacak dosyaların isimlerini bir listede tutmanız her zaman en iyisi olacaktır[b]Kodlar...[/b]Birkaç satır önce bahsettiğimiz gibi, kötü niyetli birileri sayfa olarak uzak bir URL adresi yazarsa, bu herşeyin sonu olabilir Peki eğer bir çağrılacak dosyayı, kendi dosya sistemimiz içinden olmasını zorulu kılarsak n'olur?[CODE]<?phperror_reporting(0);define('PATH', '/home/myxomatose/public_html');include_once(PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');?>[/CODE]Bu kodda belirtilen URL adresi dahi olsa, dosya sisteminde bulunamayacağı için "Sayfa bulunamadı!" hatası gösterilecektir. Peki, sistemimiz çağrılan dosya içeriğini görüntülemek gibi bir işlem yapıyorsa diyelim, o zaman dosya sistemimiz içindeki dosyaları nasıl koruyacağız? Tabii ki bir dizi kontrolü yaparak [3][CODE]<?phperror_reporing(0);define('PATH', '/home/myxomatose/public_html');$pages = array('anasayfa', 'uyeler', 'kayit');if(in_array($_GET['page'], $pages))include_once(PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');elseexit('Olmayan bir sayfa!');?>[/CODE]İşte şimdi çok daha güvenli bir dosya çağırma sistemi oluşturduk Yazacağıız sistemlerde dosya 'include' açıklarının asgari seviyede olması için bu kod iskeletini düşünerek kod yazabilirsiniz. Ve son rötuşlar;[CODE]<?phperror_reporing(0);define('PATH', dirname(<u>__FILE__</u>));$pages = array('anasayfa', 'uyeler', 'kayit');if(in_array($_GET['page'], $pages))include_once(PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');elseexit('Olmayan bir sayfa!');//// dirname(<u>__FILE__</u>) komutu, çalışan dosyanın bulunduğu tam dizin yolunu// döndürür. <u>__FILE__</u> dosya yoluyla birlikte dosya adını alırken, dirname()// ise dosya adını atar.//// Not: FILE komutunun başında HTML etiketleri var, kaldıramadım, onları// görmezden gelin :]//?>[/CODE][b]DİPNOTLAR:[/b][1] Ve tabii dosya sisteminizde olmayanbirsayfa.php isminde bir dosyanız bulunmuyorsa,[2] PHP ayarlarınızda "allow_url_fopen" seçeneği kapalıysa çalışmayacaktır pekala ancak hâlâ tehlikeli bir durumda olacaktır.[3] in_array() fonksiyonu, kendisine verilen ilk parametrenin, ikinci parametrede verilen dizi (array) içinde olup olmadığını kontrol eder. Link to comment Share on other sites More sharing options...
Administrator sk8er_boi Posted June 18, 2007 Administrator Share Posted June 18, 2007 Ama konuları taşımaktan yoruldum? Link to comment Share on other sites More sharing options...
Muallim-i Ali Posted June 18, 2007 Author Share Posted June 18, 2007 anlamadım ? hatamız nedir ? ortaya atılan bir problem ve bunun çözüm yolu Link to comment Share on other sites More sharing options...
Administrator sk8er_boi Posted June 18, 2007 Administrator Share Posted June 18, 2007 anlamadım ? hatamız nedir ? Bu başlığın ilk açıldığı yer Yazılım. Taşındığı yer: Web Sorunları & Çözüm Yolları Taşınma zamanı: 1 Dakika ÖnceKonuları nereye açacağınızı bilmiyorsanız burayı okuyunuz.[/CODE] Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.