CSRF ile Oturum Aldatmacaları

@ 25 Nisan 2009 tarihinde yazdı. Yazıya yorum yazın.

Günümüzde var olan güvenlik politikalarının sonucu olarak sistemler üzerindeki yetkilerin manipüle edildiği durumlar yazılım sektörünün her geçen gün daha da güvenli hale gelmesi için yapılan çalışmalara hız katıyor.

Yazılımcıların sık karşılaştığı bir problem olan XSS (Cross Site Scripting) kavramının yerine oturması ve güvenlik çözümlerinin doğrulanabilir kaynaklar ile sunulmasının ardından epey bir zaman geçtiği söylenemez.

CSRF (Cross Site Request Forgery) kavramı tam bu noktada hayatımıza giriyor. XSS saldırıları için sıkı bir session kontrolleri ve çeşitli yazılımsal güvenlik çözümüyle önemli sayılabilecek düzeyde koruma sağlanabiliyor.

CSRF ile bu maalesef büyük oranda etkisiz kılınabiliyor. Şuan dünyanın önemli kurumlarında CSRF güvenlik zafiyeti bulunuyor ve her an bir manipüle edilme olanağına açık şekilde scriptkiddyleri bekliyor.

CSRF saldırıları ile session kontrollerinin göz ardı edilmeye zorlanarak varsayılan yetkilere sahip olan kullanıcının yetkisi dâhilinde işlem yapılabilmesi mümkün oluyor.

CSRF’nin en önemli noktası da işlemin bizim tarafımızdan belirtilen hedefler doğrultusunda yine bizim tarafımızdan belirtilen kişinin yetkilerinin sahip olduğu sınırlar içerisinde işlem yaptırabiliyor olmamızdır.

Bir sisteme direk saldırmak yerine aracı bağlantılar kullanılarak hedef kişinin authorization durumun el verdiği müddetçe hedef sistem üzerinde işlem yapılıyor.

Sosyal mühendislik ile birleştiğinde günümüz teknolojisinde pozitif yönde birçok sonuç vermesi mümkündür.

Yazılımlarımızda form aracılığıyla alınan bilgilerin kontrolü sırasında tercih ettiğimiz POST ve GET metotlarının önemi CSRF saldırılarında bir kez daha açıkça ortaya çıkıyor.

POST ya da GET metodu ile yolladığımız verilerin uzaktan bir kullanıcı tarafından belirttiği hedef komut dizimini takip ederek sistemimiz üzerinde işlem yaptırabilmesi her an için mümkündür.

<html>

<head>

</head>

<body onLoad=javascript:document.xsrf.submit()>

<form action=”http://[site]/privmsg.php?folder=inbox” method=”post”

name=”xsrf”>

<input type=”hidden” name=”mode” value=”" />

<input type=”hidden” name=”deleteall” value=”true” />

<input type=”hidden” name=”confirm” value=”Yes”>

</body>

</html>

Örneğimizi inceleyecek olursak POST metodunun kullanılarak hedef sistem üzerinde yetkisi bulunan kullanıcının private messages inboxunda bulunan bilgilerin silinme emri verilmiş durumda.

Kullanıcı bir web sitesi üzerinde belirtilen kodlara sahip bir uygulama ile karşılaşırsa komutlar devreye girerek belirtilen işlemi yapıyor.

GET kullanılarak parola değiştirme vs. önemli sayılabilecek işlemlerin yapıldığı noktalarda CSRF saldırılarına maruz kalma durumu daha fazladır.

Hedef sistem üzerinde gönderilecek bilgilerin ve parametrelerin önceden saldırgan tarafından tanımlanıp kurbanlar üzerinde çalıştırması riski artacağından dolayı kullanıcılar kolayca kurban konumuna geçebiliyorlar.

Oturum denetiminin sık yapılmadığı noktalarda sık sık karşılaşabilinecek bir problemdir. Bir veri güncelleme noktasında GET kullanılarak verilerin gönderildiği noktada urldeki parametrelerin isteğimize göre şekillenmesi durumu bu güvenlik zafiyetinin önemini daha da arttırıyor.

GET ile işlem yapılan bir scriptte aşağıdaki benzer bir güvenlik zayıflığı olması muhtemeldir.

<?

< form method=”get” action=”updatepassword.php”>
< input type=”text” name=”newpassword” />
< input type=”submit” name=”submit” value=”update” />
< /form >

if(!login_ok())

{

header (“Location:login.php”);
exit;
}

? >

//updatepassword.php

<?

if(!login_ok ())

{
header (“Location:login.php”);
}

update_password();
echo “password updated.”;

Updatepassword.php dosyamızdaki kontrol gereğince session kontrolü yapılmadan direk parola güncelleme işlemi gerçekleştiriliyor haliyle CSRF saldırısına açık hale geliyor.

Bir web sitesi üzerinde http://www.site.com/updatepassword.php?newpassword=123456 şeklinde bir link barındırdığında o web sitesine giren kişinin linke tıklaması halinde otomatik olarak eğer diğer web sitesi üzerindeki oturumu sonlanmamış ise parola güncelleme talebi gerçekleşecektir.

Bu linki bir resim dosyasının içine gömerek de farklı boyutlarda sosyal mühendislik çalışmaları yapılarak kurbanlar üzerinde aktif olarak saldırı gerçekleşebilir.

Güzel bir CSRF çalışma mantığı grafiği;

3-csrf-schem

csrf ile oturum bilgileri

Ek kimlik doğrulamasının yapılması yazılımın gelecek noktalarda karşılaşabileceği güvenlik zayıflıklarının önüne geçecektir. CSRF, kimlik doğrulamasının olduğu ancak kullanıcılar tarafından halen aktif olduğu süre içinde dış etmenlerin o kullanıcıya fark ettirmeden işlem yaptırarak ortaya çıkmasından dolayı kimlik kontrollerinin denetimi yazılımcıların dikkat etmesi gereken noktadır.

Güvenli kimlik kontrollerinin ve oturum yönetimlerinin yapılıp CSRF’nin önüne geçmek mümkündür. İzlenecek birkaç yol mevcuttur. Önemli işlemlerin gerçekleştiği noktalarda (update,delete vs.) bir anahtar oluşturularak formdan veritabanına kaydedilip ardından sessiondaki anahtar ile doğruluğu karşılaştırılıp doğru olması halinde işlem yapılmasına olanak tanınması güvenlik çözümlerinden biridir.CSRF’nin etkisiz kaldığı nokta form noktasında saldırgan herhangi bir işlem yapmayacağı için hedef sisteme gönderilen etki karşılıksız kalacağı için token kontrolü başarılı şekilde görevini yerine getirecek ve saldırıyı etkisiz kılacaktır.Örnek bir uygulama olarak phpde hazırlanmış aşağıdaki örnekten yararlanabilirsiniz.

<?

session_start();

/*** MySQL Baglantisi ***/
mysql_connect(“localhost”,”root”,”");
mysql_select_db(“anahtarlar”);

/*** FORM ***/
if(empty($_GET["kutucuk"])) {

/* Anahtar degerlerini yenile */
$_SESSION["anahtar"] = md5(rand(0,999));

/* Anahtarlar tablosunu guncelle -vt icin- */
mysql_query(“INSERT INTO anahtarlar (anahtar) VALUES(‘$_SESSION[anahtar]‘)”);

/* Formu Bas */
echo(‘<form method=”GET”><input type=”text” name=”kutucuk” /><input type=”submit” value=”Flood Me” /></form>’);
}

/*** FORM İŞLEME **/
elseif(isset($_GET["kutucuk"])) {
$anahtar_kontrolu = mysql_query(“SELECT anahtar FROM anahtarlar WHERE anahtar=’$_SESSION[anahtar]‘”);
if(mysql_num_rows($anahtar_kontrolu) > 0 ) {
echo(“Anahtar kabul edildi.Senin formunu kabul ediyorum..”);
/* Anahtari kir ve cope at…*/
mysql_query(“DELETE FROM anahtarlar WHERE anahtar=’$_GET[anahtar]‘”);
$_SESSION["anahtar"] = ”;
}
else {
die(“Yanlis anahtar”);
}
}

?>
Script çalıştığında veritabanına bir anahtar yerleştiriyor ve aynı anahtar sessionada atanıyor. İşlemlerin gerçekleştiği noktada sessiondan gelen değer ile veritabanındaki değerler karşılaştırılıyor doğru olması halinde işleme devam ediliyor aksi halde sistemden çıkılıyor.

Uzak bağlantılardan dışarıdan gönderilen her verinin kontrolünü yapmanız halinde olası tehlikelerden büyük oranda kurtulursunuz.

CAPTCHA uygulamasının kullanılması da sizleri olası CSRF saldırılarından büyük oranda koruyacaktır. Önemli işlemlerin gerçekleştiği noktalarda random olarak üretilen bir CAPTCHA değerlerinin onaylanıp işleme dahil olması durumuyla birlikte işlemlerin gerçekleşmesi sizleri olası CSRF saldırılarında kurban konumundan kurtaracaktır.

Genel olarak bakıldığında kod tarafından yapmanız gerekenler form gibi dışarıdan veri alacağınız noktalarda veritabanıyla bağlantılı olarak anahtar kaydetme ve session ile anahtar doğruluğu eşitleme yapabilirsiniz. Session süresini işlemler dahilinde bir süre belirleyebilirsiniz.

Kullanıcılar olarak da web sitelerinden mutlaka oturumu kapat şeklinde çıkış yapmalıyız. Session süresinin belirli bir zaman diliminde olması kullanıcılar tarafından unutulan çıkış yapılmanın önüne geçecektir. Uygulamalarımızda captcha kullanmamız da olası tehlikelere karşı bizi güvenli kılacaktır.Kişisel güvenliğimize her noktada dikkat etmeliyiz.

Formdan alınan bilgilerde GET metoduna oranla POST metodunun tercih edilmesi CSRF saldırısının etkisini azaltmasa da saldırganın işini bir nebzede olsa zorlaştıracaktır. Profesyonel olmayan bir saldırgan tarafında ise lehimize bir sonuç verecektir.Dışarıdan gelen her http isteğine karşı önceden belirlediğiniz bir white listiniz olursa istenmeyen kayıtlardan ve saldırılardan etkili bir oranda korunabilirsiniz.Bu liste de girilmesini istediğiniz değerleri önceden belirleyip filtreleme işlemi gerçekleştirebilirsiniz.

İstenmeyen değerler girilmeye zorlandığında çıkış noktalarına kullanıcıları yönlendirebilirsiniz. CSRF açıkları son günlerde birçok ünlü web sitesi üzerinde aktif olarak bulunuyor. Sisteminizi korumak için kritik noktalara önceden belirtmiş olduğumu güvenlik metotlarını uygulamanız güvenliğiniz için faydalı olacaktır.

Olcay KÜK – ok@olcaykuk.com

MCP | MCTS | MCPD