"Session Hijacking" Nedir? Nasıl Önlenir?

"Session hijacking" kelime anlamı olarak "oturum çalmak" demektir. Kullanıcı bir siteye girdiğinde, her sayfada tekrar giriş bilgilerinin sorulmaması, $_SESSION ve $_COOKIE değişkenlerince taşınan veriler sayesinde sağlanır. $_COOKIE(çerez) kullanıcı bilgisayarına gönderilirken, $_SESSION sunucuda kalır. Bu bilgiler el değiştirirse, sizin nüfus cüzdanınız artık bi başkasının elindedir ve sizin yerinize iş yapabilir demektir.


Çerezler kullanıcı bilgisayarı aracılığı ile yönetilir demiştik. Her kullanıcı sizin sunucunuz kadar güvenlik tedbiri almayabilir dolayısıyla bu verilere sizin kadar sahip çıkamaya da bilir. Eğer sitelerinizde javascript gibi hash çalabilen kodlara izin veriyorsanız, siz de kullanıcının bilgilerini çaldırmasına yardım etmiş olursunuz ve kullanıcı çerezlerini çaldırdığında içinde kullanıcı adı ve şifresinin kriptolanmış hallerinin olması asla çözüm olmayaz. Şöyle ki;

A Kişisi için çerez   kullanici: seyranli,sifre: a231a31232a23123a213

olsun. Bu çerezi biz hangi bilgisayara atarsak, A kişisi o bilgisayarda giriş yapmış olarak görünür. Buraya kadar olan kısım cookie spoofing olarak geçiyor.

Spoofing belasıyla uğraşmak istemeyen arkadaşlar da bunun yerine $_SESSION kullanıyor ki, kullanıcı bilgileri çalınamasın. Gözden kaçırılan ise, $_SESSION takibi için kullanılan session id(oturum numarası) iyi korunamıyor. Session id ya sayfalarda index.php?SESSID=asdqweasd123 şeklinde ya da kullanıcı bilgisayarındaki bulunan çerezler aracılığyla taşınır. O halde;

A kişisi için session dosyası kullanici: seyranli,sifre: a231a31232a23123a213
ve
A kişisinin çerezindeki veya adres satırındaki bilgi SESSID=asdqweasd123


olsun. A kişisinin oturum numarasını bulan her kişi sanki A kişisiymiş gibi kendini sistemimize tanıtabilir. Bu da bir session hijacking örneğidir.

Session hijacking bir de ortak kullanılan sunucularda session dosyalarının ortak bi dizinde tutulmasıyla olur. Biraz daha zor olan bu yöntemde ise direk olarak session dosyalarının içeriği yer değiştirir. A kişisinin sessionı olan kullanici: seyranli,sifre: a231a31232a23123a213 satırlarını kendi session dosyasına kaydeden aynı sunucudaki başka bir site sahibi artık bizim sitemizdee A kişi olarak hareket eder. Bu da başka bir oturum çalma örneğidir.

neresinden baksak başka bi derdi çıkıyor bu oturumun ama hiç biri çözümsüz değil. Farklı çözüm yolları üretilebilir. Örneğin şifre hashi olarak, tarayıcıyı ve ip adresini de ekleyebiliriz.

PHP kodu
  1. if($_SESSION['sifre']!='' && $_SESSION['sifre'] != md5($sifre. $_SERVER['REMOTE_ADDR']. $_SERVER['HTTP_USER_AGENT'])
  2. {
  3. die('Oturumunuzu tazeleyin');
  4. }

görüldüğü üzere, yeterince sağlam bir yoldur. Artık kullanıcının oturumunu çalacak kişi mecburen aynı tarayıcı kullanmalı ve aynı ağda olmalıdır. Eğer ki session dosyalarınızın küçük boyutlarda olmasını istiyorsanız veya oturumları daha rahat yönetmek istiyorsanız bir de veritabanı kullanmanızı tavsiye ederim.
ip, session_id ve tarayici alanlarından oluşan bir tablo vasıtası ile session kontrol edilebilir.

PHP kodu
  1. $sorgu=mysql_query("SELECT session_id,tarayici FROM oturum WHERE ip='".$_SERVER['REMOTE_ADDR']."'");
  2. $veri=mysql_fetch_assoc($sorgu);
  3. if( ($veri['session_id']!='' && $veri['session_id']!=session_id() ) || ($veri['tarayici']!='' && $veri['tarayici']!=$_SERVER['HTTP_USER_AGENT'] )) {
  4. die('Oturumunuzu tazeleyin');
  5. }

şeklinde önlem alabilirsiniz.

Sürekli olarak anahtar değiştirerek güvenliğinizi artırabilirsiniz. session_start(); satırından sonra hatta alta bile geçmeyin hemen yanına "session_regenerate_id();" kodunu ekleyin ve anahtarınız tekrar üretilsin. Eski veriler bu haldeyken silinmez çünkü varsayılan şekli böyledir, ama eşşeğinizi sağlam kazığa bağlamak  isterseniz "session_regenerate_id(false);" olarak da kullanabilrisiniz.
Oturum bilgileri dosya olarak tutuluyorsa(varsayılanı böyledir) dosya adında, veritabanı kullanıyorsanız yine kendine göre yerlerde değişiklik yapılacağından çok fazla tekrar üretim, sunucuya yine ek yük bindirecektir.

Sonuç olarak tavsiyelerim şunlardır;

  • Çerez veya session, hangi yöntemi kullanırsanız kullanın muhakkak hash içerisine kullanıcıdan kullanıcıya değişen özellikler ekleyin.
  • Session kullanıyorsanız session.save_path değerini değiştirin.
  • Her sayfada oturum bilgilerinin doğruluğundan emin olun. Eğer oturum açıksa kontrol fonksiyonunu çalıştır şeklinde bir mantık kurup, yukarıdaki kodlardan faydalanarak kontrol fonksiyonu yazın.

 

Okunma: 773 , Oy Sayısı: 24 , Puan: 9.13

Etiketler

session hijacking nedir , session hijacking , hijacking ne demek , session_id() nedir , hijacking nedir ,

deathisonitsway01 Ocak 2010 Cuma 09:30:44


ellerine saglık cok degerli bir makale olmus...al google indexle işte...ozgun bir icerik :)
||


Gündüz Can YILMAZ01 Ocak 2010 Cuma 09:47:24


Artık orası google'ın bileceği iş :)
||


THR Tyranid02 Ocak 2010 Cumartesi 04:57:24


Çok teşekkürler seyranlı hocam
||


Gökhan02 Ocak 2010 Cumartesi 07:44:04


Kardeşim çok güzel bir makale olmuş teşekkürler..
||


Metin Seylan12 Şubat 2010 Cuma 22:54:05


ellerine sağlık hocam

bu arada bende seyranlıyım bağlar caddesi :)
||


Can19 Mart 2010 Cuma 16:04:24


Teşekkürler makale için. Bir sorum var.

Ben hesabıma evim dışından bir yerden erişmek istersem ne olacak bu durumda?
||


Gündüz Can YILMAZ19 Mart 2010 Cuma 20:31:24


Sizi rahatsız edecek bi durum olmaz. İstediğiniz yerden giriş yapabilirsiniz. Burda önüne geçilmek istenen kullanıcı adı ve şifre gibi işlemleri yapmaksızın girebilmeyi engellemek
||


Metin Seylan03 Nisan 2010 Cumartesi 16:16:13


ben şöle bir yöntem ile yaptım

sadece admin panelini korumak için yaptım

login olurken yetkiyi session a atıyorum kullanıcı admin paneline girdiği zaman tablodaki yetki ile session daki yetkiyi karşılaştırıyor aynı değil ise die(); ile atıyor
||


Gündüz Can YILMAZ03 Nisan 2010 Cumartesi 16:54:08


İşte session hijacking içerikle ilgilenmiyor. Sen session a bilgi attığında bir session_id oluşturuluyor. Sen login olduktan sonra, brute force ataklarla ben de sitene login olmayı başarabilirim. Çok düşük ihtimal olmasına rağmen yine de böyle bir şansım var. Eğer senin session_id değerini çalabilirsem hiç bunlara gerek kalmaz direk login olmuş sayılırım. Bunlara önlem olsun diyeydi yukarıdaki yazdıklarım. Yani, malesef önlemin hala yetersiz.
||


Metin Seylan03 Nisan 2010 Cumartesi 18:55:25


hoo ben işin lamerliğine kaçmışım :D sağol abi senin sınıfa bir göz atayım
||


Gündüz Can YILMAZ03 Nisan 2010 Cumartesi 22:08:39


Yok yok sınıf da çözüm olmaz, sınıf sadece dosya sistemi yerine veritabanı kullanmak için hazırlanmış bi sistem. hijacking olayına çözüm olmaz, çözüm için senin
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
tarzında ekelemeler yapıp, daha sonra da
if($_SESSION['ip']!=$_SERVER['REMOTE_ADDR']) {
session_destroy();
die('Lütfen tekrar giriş yapın');
}
tarzında bir ekleme yapman gerekir.

Bununla beraber bir de
session_regenerate_id(true); fonksiyonunu kullanırsan güvenliği maksimuma çıkarmış olursun. Geri kalan işler (tarayıcı kontrolü vs.) etkili önlemler değil, belki hackera zaman kaybettirebilir.
||


Metin Seylan04 Nisan 2010 Pazar 11:55:03


HOCAM! HOCAM! HOCAM! çok sağolun sess hack olayının mantığını anlayamamıştım :D şimdi anladım gündüz abiye selam projeye devam :)
||




Yorumunuz