hacking teknikleri 2 Csrf Saldırıları

●ву_вяaωє●

Dost Üyeler
Katılım
10 Şub 2009
Mesajlar
32
Tepkime puanı
0
Puanları
0
CSRF, hemen hemen XSS ile zıt mantıkta çalışır.Birince hedef sunucudur, birinde istemci.Bu atak şeklinde, sahte HTTP istekleri söz konusudur.Kullanıcı farkında olmadığı halde, yönetim paneline sahip olduğu siteden bir üyeyi silebilir, bir alışveriş sitesinden bir şeyler satın alabilir.Gelelim bu işin nasıl olduğuna;

Bir site admini düşünün, ve admin arkadaşımız yönetim panelinden 67 nolu üyeyi silmek istediğinde panel üzerinde yaptığı istek x.com/uyesil.php?uye_id=67 gibi bir sayfayı açması yetiyor.Yani adminimiz tarafından yapılan x.com/uyesil.php?uye_id=67 isteğinde 67 nolu üye silinecek.

Şimdi admin arkadaşımızın başka bir siteye girdiğini düşünelim.O sitede de şöyle bir HTML kodu var;

Kod:
<img src="http://www.x.com/uyesil.php?uye_id=67" style="display:none">
Bu HTML kodu, sayfada gözükmeden x.com/uyesil.php?uye_id=67 adresine HTTP isteğinde bulunuyor.

Normalde, admin haricinde herhangi bir saldırgan x.com/uyesil.php?uye_id=67 gibi bir HTTP isteğinde bulunduğunda yönetim panelinin olağan şifre yönetimi nedeniyle herhangi bir zararda bulunamayacak.Fakat ilgili yönetim panelinde, yönetici oturum bilgilerine sahip ( session ) olan adminimiz, bu siteye girdiğinde istemediği halde 67 no'lu üyeyi silmiş olacak.Ve büyük ihtimalle bunun farkında da değil.

Bu durum bir çok uygulamada mevcut, hatta öyleki google adsense şifreleri CSRF yardımıyla değiştirilebiliyor, digg.com sahte digg istekleri ile kandırılabiliyordu.

Nasıl Önlem Alacağız?

CSRF'yi önlemenin en bilinen ve en sağlam yolu, token ( anahtar ) modelidir.Herhangi bir form düşünün, form sayfası her açıldığında rastgele bir sayı veya string üretiyoruz ve bunu anahtar olarak hafızaya kaydediyoruz.Daha sonra aynı anahtarı veritabanına anahtarlar şeklinde kaydediyoruz.

Form işleme sayfasına geldiğinde, session'daki anahtarı veritabanındaki anahtarla kontrol ediyoruz.Eğer gerçekten böyle bir anahtar mevcutsa işlemi yapıyoruz, aksi taktirde işlemi durduruyoruz.

CSRF ile yapılan isteklerde, form kısmına hiç giriş yapılmayacağı için anahtar session'a kayıt edilmeyecektir.Dolayısıyla, form işleme sırasında CSRF ile yapılan sahte istek geçersiz kalacaktır.

Kafanızda biraz daha açık olması için ufak bir PHP betiği; ( örnek amaçlıdır. )

HTML
Kod:
[COLOR=#000080]session_start();[/COLOR]
 
[COLOR=#000080]/*** MySQL Baglantisi ***/[/COLOR]
[COLOR=#000080]mysql_connect("localhost","root","");[/COLOR]
[COLOR=#000080]mysql_select_db("anahtarlar");[/COLOR]
 
[COLOR=#000080]/*** FORM ***/[/COLOR]
[COLOR=#000080]if(empty($_GET["kutucuk"])) {[/COLOR]
 
[COLOR=#000080]/* Anahtar degerlerini yenile */[/COLOR]
[COLOR=#000080]$_SESSION["anahtar"] = md5(rand(0,999));[/COLOR]
 
[COLOR=#000080]/* Anahtarlar tablosunu guncelle -vt icin- */[/COLOR]
[COLOR=#000080]mysql_query("INSERT INTO anahtarlar (anahtar) VALUES('$_SESSION[anahtar]')");[/COLOR]
 
[COLOR=#000080]/* Formu Bas */[/COLOR]
[COLOR=#000080]echo('<form method=[/COLOR][COLOR=#0000ff]"GET"[/COLOR][COLOR=#000080]><input type=[/COLOR][COLOR=#0000ff]"text"[/COLOR][COLOR=#000080] name=[/COLOR][COLOR=#0000ff]"kutucuk"[/COLOR][COLOR=#000080] /><input type=[/COLOR][COLOR=#0000ff]"submit"[/COLOR][COLOR=#000080] value=[/COLOR][COLOR=#0000ff]"Flood Me"[/COLOR][COLOR=#000080] /></form>');[/COLOR]
[COLOR=#000080]}[/COLOR]
 
[COLOR=#000080]/*** FORM İŞLEME **/[/COLOR]
[COLOR=#000080]elseif(isset($_GET["kutucuk"])) {[/COLOR]
[COLOR=#000080]$anahtar_kontrolu = mysql_query("SELECT anahtar FROM anahtarlar WHERE anahtar='$_SESSION[anahtar]'");[/COLOR]
[COLOR=#000080]if(mysql_num_rows($anahtar_kontrolu) >[/COLOR] 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");
}
}
 
?>

Betik, form açıldığında rastgele bir değer üretip hem session'a hem veritabanına kaydediyor. Form'un işlendiği bölümde session'dan gelen değer ile veritabanındaki anahtarlar kontrol ediliyor, eğer kayıtlı bir anahtar ise kabul ediliyor. ve anahtar bir daha kullanılmamak üzere veritabanından siliniyor.

Aynı mantığı ASP ve diğer web programlama dillerinde uygulabilirsiniz.

Bunun dışında almanız gereken önlemler;


Form iletişiminde GET değil POST kullanın.
*PHP kullanıyorsanız, $_POST dizisini kullanın.Zira register_globals ile exploit edilebildiği sürece form iletişiminde POST kullanmanızın önemi kaybolur.
 
Üst