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;
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