Session Fixation Nedir?
Session fixation, kullanıcının giriş yapmadan önce oluşturulan bir oturum kimliğinin login sonrasında da değiştirilmemesi durumunda ortaya çıkar.
Akış genellikle şöyledir:
- Saldırgan sistemden geçerli bir session ID üretir.
-
Bu ID’yi kurbana iletir. Örneğin:
- URL parametresi
- XSS açığı
- Cookie manipülasyonu
- Kullanıcı bu session ile giriş yapar.
- Sistem login sonrası session ID’yi yenilemez.
- Saldırgan aynı ID ile sisteme erişir.
Bu saldırı tipi özellikle eski uygulamalarda ve yanlış konfigüre edilmiş framework’lerde görülür.
Session Hijacking ile Farkı
Session hijacking mevcut aktif oturumun çalınmasıdır.
Session fixation ise kullanıcı giriş yapmadan önce oturumun sabitlenmesidir.
Bu fark kritik önemdedir çünkü:
- HTTPS tek başına çözüm değildir.
- Network sniffing gerektirmez.
- Uygulama mantık hatasına dayanır.
Teknik Saldırı Vektörleri
1. URL Tabanlı Session ID
Bazı eski sistemler session ID’yi URL içinde taşır:
https://site.com/login?sessionid=ABC123
Bu model fixation için idealdir.
2. Cookie Zorlama
Saldırgan kurbanın tarayıcısına:
- XSS ile
- Alt domain manipülasyonu ile
- HTTP response splitting ile
sabit bir cookie yazdırabilir.
3. HTTP Üzerinden İlk Oturum
Kullanıcı login sayfasına HTTP ile gelir, ardından HTTPS’e yönlendirilirse, aradaki zayıf halka fixation’a kapı açabilir.
Modern Framework’lerde Risk Durumu
Modern framework’ler varsayılan olarak session rotation yapar. Ancak:
- Yanlış middleware sıralaması
- Custom authentication yazımı
- Legacy kod entegrasyonu
- API + Web hibrit mimariler
risk oluşturabilir.
Aşağıda yaygın framework yaklaşımlarını inceleyelim.
Spring Security (Java)
Spring Security login sonrası varsayılan olarak session ID yeniler.
Koruma mekanizması:
- SessionFixationProtectionStrategy
- migrateSession() davranışı
Ancak eğer geliştirici:
- Stateless JWT yapısına geçip yanlış konfigürasyon yaparsa
- Custom login handler yazarsa
koruma devre dışı kalabilir.
Laravel (PHP)
Laravel login işlemi sonrası otomatik olarak regenerate() çağırır.
Ancak risk oluşabilir:
- Eğer developer manuel session yönetimi yaparsa
- Remember me token yanlış implemente edilirse
- Load balancer cookie senkronizasyonu bozuksa
Django (Python)
Django authentication sonrası session key’i otomatik yeniler.
Risk noktaları:
- Custom middleware
- Session engine değişimi
- Cache tabanlı session saklama hataları
Express.js (Node.js)
Express.js kendi başına session yönetmez. express-session gibi paketler kullanılır.
Güvenli kullanım için:
req.session.regenerate(function(err) { // login sonrası yeni session });
Eğer bu yapılmazsa fixation riski doğar.
Gerçek Hayatta Görülen Hatalar
- Login sonrası session yenilenmiyor
- Logout sonrası session invalid edilmiyor
- Aynı session ID privilege escalation için kullanılıyor
- Multi-tab login senaryoları test edilmiyor
- SSO entegrasyonlarında session rotation atlanıyor
Session Fixation’a Karşı Güvenlik Önlemleri
1. Login Sonrası Session ID Yenileme
En kritik kontrol budur.
Authentication sonrası her zaman yeni session ID üretilmelidir.
2. Secure Cookie Ayarları
Cookie özellikleri:
- HttpOnly
- Secure
- SameSite=Strict veya Lax
Bu ayarlar fixation riskini azaltır.
3. URL’de Session Taşımayı Yasaklama
Session ID asla URL içinde taşınmamalıdır.
4. HTTPS Zorunluluğu
HTTP → HTTPS yönlendirmesi ilk istekte yapılmalı.
Login sayfası doğrudan HTTPS olmalıdır.
5. XSS Koruması
XSS fixation’ın en büyük tetikleyicisidir.
CSP politikaları etkinleştirilmelidir.
6. Privilege Escalation Kontrolü
Login sonrası:
- Session ID değişmeli
- Role bilgileri yeniden oluşturulmalı
- Eski session invalidate edilmeli
API ve JWT Ortamlarında Fixation
Stateless yapılarda klasik session fixation yoktur. Ancak:
- Refresh token sabitlenebilir
- Token reuse saldırıları yapılabilir
- Local storage hijack senaryoları oluşabilir
JWT mimarilerinde:
- Token rotation
- Short expiration
- Refresh token blacklist
kritik önemdedir.
OWASP Perspektifi
OWASP, session fixation’ı kimlik doğrulama zafiyetleri arasında değerlendirir ve login sonrası session rotation’ı zorunlu kontrol olarak önerir.
Test Nasıl Yapılır?
Pentest sırasında:
- Login öncesi session ID alınır.
- Login yapılır.
- Session ID değişiyor mu kontrol edilir.
- Aynı ID ile ikinci bir tarayıcıdan erişim denenir.
Eğer ID değişmiyorsa zafiyet vardır.
Sonuç
Session fixation gürültülü bir saldırı değildir.
Firewall’u aşmaz. Şifre kırmaz. Trafiği dinlemez.
Sadece sistemin unutkanlığından faydalanır.
Modern framework’ler büyük ölçüde güvenlidir.
Ancak güvenlik, varsayılan ayarlarla değil; bilinçli konfigürasyonla korunur.
Oturum kimliği küçük bir string olabilir.
Ama doğru yönetilmezse, o string bir anahtar haline gelir.
Ve anahtarın kopyası saldırgandaysa, kapı çoktan açılmıştır.
Session Fixation Saldırıları ve Modern Framework’lerde Korunma