- Konu sahibi
- #1
Oturum kimliği, kullanıcının giriş yapmış durumunu sunucuya kanıtlayan değerdir. Kullanıcı giriş yaptıktan sonra bu kimlik yenilenmelidir; çünkü saldırgan girişten önce bilinen veya kullanıcıya kullandırılan eski oturum kimliğini biliyorsa, kimlik değiştirilmezse kurbanın giriş yapmış oturumunu ele geçirmeye çalışabilir. Bu saldırı oturum sabitleme (session fixation) olarak adlandırılır.
Normal akışta tarayıcı bir oturum çerezi taşır. Kullanıcı giriş formunu gönderdiğinde sunucu parolayı doğrular ve bu oturum kimliğini yetkili hale getirir. Eski kimlik girişten önce saldırgan tarafından biliniyorsa, saldırgan aynı kimlikle sunucuya istek göndererek kurbanın hesabına erişebilir.
Giriş başarılı olduğunda sunucu, yalnız gerekli ve güvenilir oturum verilerini kontrollü taşıyarak yeni ve öngörülemez bir oturum kimliği üretmelidir. Eski kimlik geçersiz bırakılmalıdır. Böylece girişten önce bilinen değer, giriş sonrasında yetkili oturum olarak kullanılamaz.
Bu işlem yalnızca çerezi tarayıcıda değiştirmek değildir. Sunucu tarafındaki oturum kaydı da yeni kimliğe taşınmalı veya yeniden oluşturulmalı ve eski kayıt geçersiz kılınmalıdır. Kimlik yenileme başarısız olursa kullanıcı yetkili hale getirilmemelidir.
Bir ziyaretçi giriş sayfasını açtığında oturum kimliği
Güvenli akışta ise parola doğrulandıktan sonra sunucu
Giriş işlemini aşağıdaki sırayla tasarlayın:
Kimlik döndürme ile oturumun sona erdirilmesi aynı işlem değildir. Girişte mevcut oturumun kimliği yenilenir. Çıkışta ise oturum sunucuda sonlandırılır, yetkili bilgiler silinir ve tarayıcıdaki oturum çerezi temizlenir. Parola değişikliği veya hesabın kritik güvenlik ayarlarının değiştirilmesi gibi olaylarda, uygulamanın güvenlik politikasına göre diğer aktif oturumların da sonlandırılması gerekebilir.
Bu kontrolleri kendi yalıtılmış deneme ortamınızda, özel test hesabıyla yapın; gerçek kullanıcı kimliklerini günlüğe veya ekran paylaşımına taşımayın. Tarayıcının geliştirici araçlarında giriş öncesi ve sonrası çerez değerlerini karşılaştırabilirsiniz; ancak asıl ölçüt, eski kimliğin sunucu tarafından yetkili kabul edilmemesidir. Yeni çerez görünmesine rağmen eski kimlik giriş sonrası yetkiyle çalışıyorsa döndürme eksiktir. Anonim eski kaydı yarış koşulları için kısa süre tutmak ile eski kimliğe yetki vermek aynı şey değildir.
En yaygın hata, yalnızca giriş yanıtında yeni bir çerez göndermek fakat eski sunucu oturumunu iptal etmemektir. Bir diğer hata, kullanıcı kimliğini yeni oturuma taşımak yerine istemciden gelen bir alanı yetki kaynağı kabul etmektir. Ayrıca oturum kimliğini URL parametresinde taşımak, kimliğin geçmiş, günlük ve yönlendiren bilgileri içinde sızmasına yol açabileceğinden kaçınılmalıdır.
Girişten sonra kimlik yenilemek tek başına tüm oturum güvenliğini sağlamaz. HTTPS, güvenli çerez ayarları, sunucu tarafında yetki denetimi ve uygun çıkış işlemi birlikte uygulanmalıdır. Kimlik döndürme sırasında alışveriş sepeti gibi anonim oturum verileri korunacaksa, bunun yalnızca beklenen verilerle sınırlı olduğundan emin olun.
Sorun nasıl oluşur?
Normal akışta tarayıcı bir oturum çerezi taşır. Kullanıcı giriş formunu gönderdiğinde sunucu parolayı doğrular ve bu oturum kimliğini yetkili hale getirir. Eski kimlik girişten önce saldırgan tarafından biliniyorsa, saldırgan aynı kimlikle sunucuya istek göndererek kurbanın hesabına erişebilir.
Giriş başarılı olduğunda sunucu, yalnız gerekli ve güvenilir oturum verilerini kontrollü taşıyarak yeni ve öngörülemez bir oturum kimliği üretmelidir. Eski kimlik geçersiz bırakılmalıdır. Böylece girişten önce bilinen değer, giriş sonrasında yetkili oturum olarak kullanılamaz.
Bu işlem yalnızca çerezi tarayıcıda değiştirmek değildir. Sunucu tarafındaki oturum kaydı da yeni kimliğe taşınmalı veya yeniden oluşturulmalı ve eski kayıt geçersiz kılınmalıdır. Kimlik yenileme başarısız olursa kullanıcı yetkili hale getirilmemelidir.
Somut örnek
Bir ziyaretçi giriş sayfasını açtığında oturum kimliği
A olsun. Saldırgan bu değeri bir şekilde kurbana kullandırmayı başarır. Kurban doğru parolayı girer ve sunucu kimlik A değerini değiştirmeden yetkili kabul ederse, saldırgan A ile yaptığı isteklerde kurbanın oturumunu kullanabilir.Güvenli akışta ise parola doğrulandıktan sonra sunucu
A yerine B gibi yeni bir kimlik üretir, kullanıcı hesabını B oturumuna bağlar ve A değerini geçersiz kılar. Saldırganın bildiği eski değer artık yetki taşımaz.| Kontrol | Beklenen davranış | Hata işareti |
|---|---|---|
| Giriş öncesi kimlik | Girişten sonra yetki taşımaz | Eski kimlik giriş sonrası yetkiyle kabul edilir |
| Yeni kimlik | Öngörülemez ve sunucuda geçerlidir | Eski değerle aynı veya istemcinin seçtiği değer |
| Oturum verisi | Yalnız gerekli veriler yeni oturuma aktarılır | İstemciden gelen rol veya yetki bilgisi kullanılır |
| Çıkış | Sunucu oturumu geçersiz kılar | Çerez silinse bile eski kimlik çalışır |
Uygulanacak işlem
Giriş işlemini aşağıdaki sırayla tasarlayın:
- Kullanıcının gönderdiği kimlik bilgilerini doğrulayın. Başarısız girişte oturumu yetkili duruma getirmeyin.
- Doğrulama başarılıysa sunucu tarafında oturum kimliğini yenileyin. Kullanılan dil veya çatının kimlik döndürme işlevini tercih edin; yalnızca yeni bir çerez yazmakla yetinmeyin.
- Gerekli ve güvenilir oturum verilerini yeni oturuma taşıyın. Kullanıcı adı veya hesap kimliği gibi değerleri sunucunun doğruladığı sonuçtan yeniden yazın; istemciden gelen yetki alanlarına güvenmeyin.
- Eski oturum kaydını geçersiz kılın ve yeni kimlikle kullanıcıyı yetkili olarak işaretleyin.
- Yeni oturum çerezini güvenli çerez özellikleriyle gönderin. HTTPS kullanın; çerezin JavaScript tarafından okunmasını gerektirmiyorsa
HttpOnly, istek bağlamına uygun olarakSecureve uygunSameSitepolitikasını belirleyin. - Girişten sonra yetki kontrolü yapan bir sayfayı test edin. Eski kimlikle yapılan isteğin reddedildiğini, yeni kimlikle yapılan isteğin ise yalnızca doğru kullanıcı hesabına eriştiğini doğrulayın.
Kimlik döndürme ile oturumun sona erdirilmesi aynı işlem değildir. Girişte mevcut oturumun kimliği yenilenir. Çıkışta ise oturum sunucuda sonlandırılır, yetkili bilgiler silinir ve tarayıcıdaki oturum çerezi temizlenir. Parola değişikliği veya hesabın kritik güvenlik ayarlarının değiştirilmesi gibi olaylarda, uygulamanın güvenlik politikasına göre diğer aktif oturumların da sonlandırılması gerekebilir.
Bu kontrolleri kendi yalıtılmış deneme ortamınızda, özel test hesabıyla yapın; gerçek kullanıcı kimliklerini günlüğe veya ekran paylaşımına taşımayın. Tarayıcının geliştirici araçlarında giriş öncesi ve sonrası çerez değerlerini karşılaştırabilirsiniz; ancak asıl ölçüt, eski kimliğin sunucu tarafından yetkili kabul edilmemesidir. Yeni çerez görünmesine rağmen eski kimlik giriş sonrası yetkiyle çalışıyorsa döndürme eksiktir. Anonim eski kaydı yarış koşulları için kısa süre tutmak ile eski kimliğe yetki vermek aynı şey değildir.
Sık yapılan hatalar
En yaygın hata, yalnızca giriş yanıtında yeni bir çerez göndermek fakat eski sunucu oturumunu iptal etmemektir. Bir diğer hata, kullanıcı kimliğini yeni oturuma taşımak yerine istemciden gelen bir alanı yetki kaynağı kabul etmektir. Ayrıca oturum kimliğini URL parametresinde taşımak, kimliğin geçmiş, günlük ve yönlendiren bilgileri içinde sızmasına yol açabileceğinden kaçınılmalıdır.
Girişten sonra kimlik yenilemek tek başına tüm oturum güvenliğini sağlamaz. HTTPS, güvenli çerez ayarları, sunucu tarafında yetki denetimi ve uygun çıkış işlemi birlikte uygulanmalıdır. Kimlik döndürme sırasında alışveriş sepeti gibi anonim oturum verileri korunacaksa, bunun yalnızca beklenen verilerle sınırlı olduğundan emin olun.