Web Uygulamalarında Hatalı Oturum Yönetimi ve Oturum Sabitleme Zafiyeti

Cookie/session, web uygulamalarında sunucu tarafının, kendisini ziyaret eden kullanıcıları ayırt etmek, yetkilendirmek, mevcut oturumunu belli bir sure tutma, çeşitli bilgileri taşıma veya oturumunu yönetmek gibi sebepler ile geliştirme aşamasında ihtiyaç duyulan web uygulama bileşenleridir. Cookie ve session benzer amaçlar için kullanılan fakat temel bazı farklılıkları olan web uygulama ifadeleridir. Güvenlik açısından genelde tercih edilen session kullanımıdır. 

Cookie bilgisi client tarafında tutulduğu için üzerinde hassas veriler (kullanıcı adı,parola,kredi kart numarası vs.) veya manipule edilmesi mümkün değerler taşınmamasına dikkat edilmelidir. Session kullanımında hassas verilerin tutulması veya bazı kontrollerin yapılması sunucu tarafında yapılmaktadır.
Session kullanıldığı durumlarda client tarafına mevcut oturuma karşılık gelen şifreli bir Session ID değeri gönderilmektedir. Bu durumda session kullanımı her ne kadar güvenli olsa da Client tarafına gönderilen SessionID değerinin saldırganlar tarafından ele geçirilmesi ile kullanıcılara ait oturumlar elde edilebilmektedir. Ayrıca Session kullanımında üretilen Session ID değerinin yeterli uzunlukta ve karmaşık karakterlerden oluşmasına dikkat edilmelidir. Aksi halde mevcut session ID politikasına uyumlu değerler üretilerek o an aktif bir kullanıcı oturumu elde edilebilir. Session kullanıldığı durumlarda kullanıcıya gönderilen SessionID değerleride Cookie HTTP başlık bilgisi içerisinde tutularak client-server arasında taşınır.
Sunucu tarafına istek yapan her kullanıcı için dönen http response içerisinde Set-Cookie başlık bilgisi ile bir cookie değeri client tarafına gönderilir ve client browserinda bu bilgi tutulur. Daha sonra sunucu tarafına yapılan requestlerde bu set edilen Cookie değeri ile gidilir. Uygulama sunucusu tarafı da bu cookie değerine gore ilgili kullanıcıya muamele edecektir. Cookie değerinin geçerlilik süreside yine atanan cookie içerisinde belirtilmektedir.

Aşağıda client tarafının sunucu tarafından cookie bilgisini almasına ait ekran görüntüsü verilmiştir.

MACBOOKPRO:Users:celalerdik:Desktop:Screen Shot 2014-04-22 at 11.24.04.png

Kullanıcılar hedef uygulamlar üzerinde kimlik doğrulama gerçekleştirdikten sonra kendilerine atanan bu Cookie/SessionID değerini kullanarak uygulamaya tekrar tekrar kimlik doğrulama gerektirmeksizin bağlanabilir. Durum böyle olunca kimlik doğrulama gerektirmeden sistemlerde oturum sahibi olmak isteyen saldırganlar çeşitli yöntemler ile bu değerleri ele geçirme yoluna gidebilmektedir.
Cookie/SessionID bilgisi hedef alınarak çeşitli saldırılar gerçekleştirilmektedir. Session hijacking, session fixation, cookie theft, exposed session data , cookie attribute manipulate, sessionid-token randomless açıklığı gibi bir çok açıklık istismar edilerek kullanıcı adına işlemler gerçekleştirebilir. Cookie/SessionID bilgisi her ne kadar sunucu tarafında üretiliyor olsada client tarafında browserda tutulmaktadır. Buda client tarafında kullanıcılara bir script çalıştırılarak elde edilebileceğini göstermektedir. Bu aşamada XSS açıklığı sıklıkla kullanılan bir yöntemdir.

Yine bazı durumlarda saldırganların hiç bir teknik açıklık istismar etmeden doğrudan uygulama geliştiricilerin kullandığı ve kimlik doğrulama olmayan elmah.axd ve trace.axd gibi hata loglama modüllerine erişim sağlayarak ilgili uygulamalarda admin kullanıcılarının sessionID değerlerini kullanarak oturumlarını ele geçirebilmektedir.

Trace.axd loglama modülü üzerinden elde edilen SessionID değeri:

MACBOOKPRO:Users:celalerdik:Desktop:Screen Shot 2014-04-23 at 12.57.52.png

Elmah.axd loglama modülü üzerinden elde edilen SessionID değeri:

MACBOOKPRO:Users:celalerdik:Desktop:Screen Shot 2014-04-23 at 13.00.00.png

Bu değerlerin doğrudan cookie manager benzeri uygulamalar ile browser üzerinde mevcut değerleri ile değiştirilmesi durumunda bu kullanıcılara ait oturumlar ele geçirilmiş olunacaktır. Bu şekilde doğrudan admin paneller veya kullanıcı oturumları elde edilebilir.

Bu yazımızda özellikle değinmek istediğimiz açıklık session fixation açıklığıdır. Client tarafına kimlik doğrulama yapılmadığında gönderilen SessionID bilgisi , kimlik doğrulama yapıktan sonra değiştirilmiyorsa sadece bu SessionID değerine yetkilendirme yapılıyorsa bu durumda session fixation açıklığı söz konusu olmaktadır.Basit bir kaç sosyal mühendislik methodu ile ilgili açıklık istismar edilebilmektedir.
Saldırganlar öncelikle oturumunu çalmak istedikleri kullanıcılara çeşitli sosyal mühendislik yöntemleri kullanarak kendi belirledikleri bir SessionID değeri ile uygulamayı ziyaret etmelerini sağlarlar. Daha sonra kurbanın bu uygulama üzerinde kimlik doğrulama işlemini gerçekleştirmesi durumunda  bu sessionID değerini saldırgan bildigi için kendi browserdinda ilgili hedef uygulama için set ederek kurbanın oturumunu ele geçirebilir. Saldırganın kendi browserinda zaten bu sessionID değeri tanımlı olduğundan uygulamayı çağırdığında kurbanın oturumu ile uygulama üzerinde erişim elde edecektir.

Aşağıdaki ekran görüntüsünde session fixation açıklığının nasıl gerçekleştiği daha kolaylıkla anlaşılabilir.

MACBOOKPRO:Users:celalerdik:Desktop:session_fixation.png
  1.     Kullanıcı web sunucuya bir bağlantı gerçekleştirmektedir
  2.     Sunucu tarafı kendisine yapılan istek karşısında bir session_id değeri ile saldırgana cevap dönmektedir.
  3.     Saldırgan,  aldığı session_id değerini kullanarak kurbanın sunucuya login olmasını sağlamaktadır. Bu durum çeşitli sosyal mühendislik yöntemleri kullanılarak kurbanın aşağıdaki gibi bir bağlantıyı ziyaret etmesi ile gerçekleştirilmektedir.
  4.     Kurban  http://www.bank.com/login.php?session_id=xyz bağlantısını ziyaret etmektedir.
  5.     Kurban bu bağlantıyı ziyaret ederek hedef web uygulamasına kimlik bilgileri ile giriş yaptığı anda mevzut xyz değerine sahip session_id artık bu kullanıcınının oturumunu ifade eden değer olacaktır.
  6.     Saldırgan kendi browserdina http://www.bank.com/ sayfasını çağırdığında artık kurbanın oturumuna erişimiş olacaktır.

İlgili açıklığa maruz kalmamak için cookie/session bileşenleri dikkatli kullanılmalı. Kullanıcılar hangi sessionID ile uygulamaya gelirse gelsin kimlik doğrulama gerçekleştirildikten sonra SessionID değeri uniq başka bir değer ile yenilenmelidir.