Konuyu görüntüle
IUCODERS FORUM > Programlama > PHP > File Include Atakları ve Korunma Yöntemleri
Yazar
dotnetonur


avatar
Dersaadet
Kayıt: 21.11.2007
11.07.2008-02:52 #48738
File Include Attack Methods
File Inclusion atakları, genel bir tabir olmasına rağmen çoğunlukla PHP mimarisi üzerine kurulu sistemlerde karşımıza çıkmaktadır. Gerek sistemi tasarlayıp inşa eden yazılımcının deneyimsiz oluşu, gerek PHP`nin yapısının güvenlik zafiyetlerine müsait oluşu ve gerekse yazılımcıların güvenlik tarafını hafife almaları, güvenlik açıklarıyla sık olarak karşılaşmamıza sebep olmaktadır ve File Inclusion atakları, hem remote olarak hem de local olarak yapılabileceği için iki türlü de sistem zarar görmektedir.
Sistemlerinizin zarar görmemesi için, göreceği zararı en aza indirgemek için bu atakların nasıl yapıldığını göstermeye çalışıp, korunma yollarından bahsedeceğim.

File Include Açıkları Nasıl Oluşur?
Yukarıda da bahsettiğim gibi, kullandığınız dilin mimarisi bu açıkların oluşmasına farklı nitelikte zeminler hazırlayabilir. Ama bu hususa en çok PHP yazılımcılarının dikkat etmesi gerekmektedir. Dilin mimarisinin esnekliği ve open source bir teknoloji olması nedeniyle, tüm yükümlülük yazılımcıya düşmekte ve yazılımcının sistem tarafında alacağı önlemler ile bu ataklar etkisiz kılınabilmektedir.
Demek ki bu açıklar siz PHP yazılımcılar nedeniyle ortaya çıkıyormuş :)
Şimdi FI ataklarını mümkün kılan kodlara göz atalım;
<a href=index.php?page=file1.php>Files</a>
<?php
$page = $_GET[page];
include($page);
?>
Burada görüldüğü üzere $page değişkeni veya değişkenin aldığı değerler hiçbir filtrelemeye tabi tutulmadan direkt olarak web sayfasına yönlendirilmektedir. (Kesinlikle Formlar ve QueryStringler arası geçişte kullandığınız değişkenlerden aldığınız değerleri filtrelemeden kullanmayın)
Kullanıcılar Files linkine tıkladığında index.php?page=file1.php gibi bir linke yönlenecek ve URL bu hali alacaktır. File1.php sayfası, index.php sayfasının kullandığı “page” parametresi üzerinden sayfaya include edildiğinden ve bu değişkenin aldığı değer kontrol edilip filtrelenmediğinden dolayı bu değişken üzerinden sisteminize yapılacak FI ataklarından, sizin açınızdan olumsuz olsa da, başarılı sonuçlar alınacaktır.

File Include Atakları Nasıl Yapılır ?
Senaryomuzdan devam edecek olursak;
$page değişkeninin aldığı değeri kontrol etmediğimizden dolayı, bu değişkene istediğimiz her değeri atayabiliriz. Eğer sisteminiz bir *nix sunucu da barınıyorsa, çeşitli PHP fonksiyonlarını içeren dosyamızı değişkene atayarak sistemde PHP komutları çalıştırabilir ki bu Remote File Inclusion olarak geçmektedir. Ya da *nix sunuculara has komutları bu değişken üzerinden çalıştırıp, sisteminiz ve bulunduğunuz server hakkında kritik bilgilere ulaşılabilir ki bu da Local File Inclusion atakları olarak isimlendirilmektedir.

File Include Ataklarından Nasıl Korunulur ?
Açıkların nasıl oluştuğunu ve atakların nasıl düzenlenebileceğini kavradığınız zaman, yapmanız gerekenler şunlardır;
- Kullanıcıdan aldığınız verileri ve input alanlarını filtreleyiniz ve değişkenlere öyle atama yapınız.
- SecurePHP güvenlik sistemini kullanınız.
- php.ini yapılandırmanızı iyi yapınız.
- Server kullanıcı grupları permissionlarını ayarlamayı unutmayınız.

Hepinize güvenli günler :)

http://www.onuryilmaz.info/yazilar.aspx?yazi_id=8





Ortam sanal olsa da, islenen suc gercektir...

Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
11.07.2008-09:55 #48740
 
File Include Ataklarından Nasıl Korunulur ?
Açıkların nasıl oluştuğunu ve atakların nasıl düzenlenebileceğini kavradığınız zaman, yapmanız gerekenler şunlardır;
- Kullanıcıdan aldığınız verileri ve input alanlarını filtreleyiniz ve değişkenlere öyle atama yapınız.
- *SecurePHP güvenlik sistemini kullanınız.
- *php.ini yapılandırmanızı iyi yapınız.
- *Server kullanıcı grupları permissionlarını ayarlamayı unutmayınız.

Ben burada konu başlığına uygun bir çözüm göremiyorum.

PHP oldukça esnek yapıya sahip bir dil olduğu için ezbere kod yazanlar hemen ortaya bir şeyler çıkarmaya çalışıyorlar. İki satır kodla bir şeyler oluştuduklarını görünce de hemen site işlerine falan giriyorlar. Yani PHP'ye uygun yoldan başlamış birinin bu bahsedilen açığı oluşturma ihtimali 100 üzerinden 0'dır.

include ve require komutları, yaygın olarak query string parametrelerine bağlı bir şekilde execute edilecek alt scriptler için kullanıldığından dolayı; bunların bu şekilde kullanımına örnekler gösteren kaynaklar, bu örnekleri mutlaka bir if-elseif-else ya da switch-case statement içerisinde gösterirler.

$_GET ile alınacak bir değer bağlı bir include söz konusu olacaksa aşağıdaki yapıya benzer bir kontrol uygulanmalıdır:
if($_GET['show']=='products') {
	include('inc/products.php');
}
elseif($_GET['show']=='members') {
	include('inc/members.php');
}
else {
	// default:
	include('inc/main.php');
}


Bu konu aslında sadece include olayını bağlamıyor, kullanıcıdan gelen paramtreye bağlı oluşacak içerikte mutlaka bir kotrol mekanizması olmalıdır.
$productId = intval($_GET['product_id']);
$product = new Product($productId);
if($product->GetId() > 0) {
	include('inc/product_details.php');
}
else {
	include('inc/product_error.php');
}

Ya da burada söz konusu verilerin bir SQL cümlesine eklenmeden önce de kontrol edilmesi gerekir. Örneğin bir integer bekleniyorsa kesinlikle o beklenen yere integer gönderilmelidir.

*Sağlam kod yazabilen biri için yukarıda sunulan diğer 3 çözüm yöntemi gereksizdir.


Daha kapsamlı ve çözüm yollarının daha net bir şekilde anlatıldığı bir yazı olsaydı keşke. Yine de paylaşma niyetin için teşekkürler.





Let`s make this world a better place to live !

Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb