Web Uygulama Güvenliğinde Cookie Özellikleri

Ahmet Can KARAAĞAÇLI
5 min readJan 21, 2023

--

Daha önceki yazımda CORS ve SOP kavramlarına değinmiş, cookie mekanizmasına giriş yapmıştık. Ek olarak tarayıcıda kullanıcılan cookie mekanizmasından önceki yazılarda bahsetmiştik. Bu yazıda ilk olarak RFC-6265 kapsamında bir özet niteliğinde cookie konusunda bazı detayların notları ve ikinci olarak web uygulamalarını test ederken karşımıza çıkan bazı güvenlik başlıklarının ne ve nasıl çalıştığına yönelik notlarım olacak.

Bu yazıda bahsetmek istediğimiz cookie özellikleri;

  • expire
  • max-age
  • path
  • domain
  • secure
  • httponly
  • samesite

Cookienin Bazı Özellikleri

Web uygulamalarında oturumu sağlayan, kullanıcılı uygulamalarda kullanıcı durumunu (state) yönetebilmemizi sağlayan yapı aslında cookie yapısı. Sunucu tarafından set edilerek mini bir database gibi tarayıcıda tutularak her giden istekte kimliğimizi doğrulamamızı sağlıyor. Client tarafında bu durumun yönetilebilmesi için bazı özellikler barındırıyor.

Bu özellikleri anlatırken aslında ezbere değilde mantık yürüterek anlatarak akılda kalıcı olmasını sağlamak istiyorum.

Öncelikli olarak her bir cookie nin bir adı var, bu da name parametresi ile belirleniyor buna oldukça aşinayız. Örneğin sessionid=6161..

Bir uygulamada kimlik doğrulama ile oturum açtığımızı varsayalım. En basitinden bu oturum yapılan konfigürasyona göre belli bir zaman sonra sona erecek.(Bu konfigürasyon sunucu tarafında set edilebilir ancak client tarafında da bunu kullanıcıya yansıtmak için tarayıcı üzerinde tutulan cookie bilgisi silinebilir.) Bu cookie bilgisinin tarayıcıda ne kadar süre sonra silinmesi gerektiğini belirleyecek bir cookie özelliği mevcut: expire.

Photo by Angelo Pantazis on Unsplash

Expire değerini aşağıdaki gibi set edebiliriz.

Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Örnek : Set-Cookie: id=xx; Expires=Fri, 5 Oct 2021 11:10:00 GMT;

Aynı şekilde cookie nin yaşam süresini belirtmek için max-age de kullanılabilir. max-age formatında ise aslında cookie nin yaşamasını istediğiniz süreyi saniye cinsinden belirtilir.

Set-Cookie: <cookie-name>=<cookie-value>; max-age=<saniye>
Örnek : Set-Cookie: id=xx; Expires=max-age=61

Her ikisininde set edildiği durumda modern tarayıcılarda max-age özelliği expire özelliğini ezecektir, zira expire özelliği depreciate edilerek max-age kullanımı yaygınlaşmış.

İkinci olarak path parametresi. Uygulamanın dizaynına göre farklı dizinler içerisinde farklı web uygulamaları geliştirmek ve bu dizinlerde farklı cookie ler set etmek isteyebilirsiniz. Bu durumda geliştirici olarak path parametresi işinizi görecektir.

Photo by Aubrey Odom-Mabey on Unsplash

example.com/app1 ve example.com/app2 gibi iki ayrı uygulamayı aynı domain altında farklı dizinlerde oluşturduğunuzu varsayın. path değerini /app1 olarak belirlediğiniz cookie, /app1/…/ altındaki tüm dizinler için iletilen isteklerle birlikte iletilecektir.

Set-Cookie: <cookie-name>=<cookie-value>; path=/<path>
Örnek : Set-Cookie: id=xx; Expires=max-age=61; path=/app1

Farklı uygulamalar demişken, farklı uygulamalarımızı dizinlerde değilde subdomainlerde oluşturduğumuzu varsayalım. app1.example.com ve app2.example.com için farklı cookie ler set etmek istiyoruz. Bu durumda kullanacağımız cookie özelliği domain.

Set-Cookie: <cookie-name>=<cookie-value>; domain=<domain>
Örnek : Set-Cookie: id=xx; Expires=max-age=61; domain=app1.example.com

Yukarıdaki örnek göz önüne alındığında app1.example.com domaininin tüm subdomainlerine yapılan istekte cookie bilgisinin iletileceğini belirtmekte fayda var.

Some Security Flags Problem

Bir diğer bahsetmek istediğim özellikler biraz daha web uygulama güvenliğini ilgilendiren, bazı web uygulama saldırılarını önleyebilecek özellikler.

Sızma testlerinde veya diğer web uygulama güvenliği denetimlerinde varsayılan olarak karşılaştığımız konu güvenli olmayan bağlantı ile iletişim kurulması, yani http kullanılması. Olurda istek şifresiz http gider, bu durumda ağı dinleyen birileri session cookie yi ele geçirmesin diye kullanabileceğimiz secure özelliğidir.

Photo by Franck on Unsplash

Kısacası, sunucu tarafında yaptığınız ayarlarda eğer Cookie değeri secure olarak işaretlenmişse, tarayıcı ilgili cookie yi yalnızca https isteklerde iletecektir. İstek http ise tarayıcı bu cookie yi siteğe eklemeden iletecektir.

Bunun yanında en etkili özelliklerinden birisi olduğunu düşündüğüm httponly özelliği geliyor. XSS saldırılarının etkisinin en yüksek olduğu durumlardan birisi de account takeover. Bu açıklığın doğasında client tarafında javascript çalıştırmak var. Javascript demek cookie lere erişim demek (document.cookie), ajax ile istek gönderebilmek demek ve eğer oturum yönetimi için ekstra güvenlik önlemi alınmadıysa (ip bazlı kontrol vb.) elde edilen cookie bilgisi ile kurbanın hesabının ele geçirilmesi anlamına gelmekte.

Photo by Denny Müller on Unsplash

httponly özelliği ile tarayıcı, httponly işaretli olan cookie bilgisinin javascript tarafından erişilmesini engellemekte, böylece uygulamada xss açığı olsa dahi cookie verilerinin okunmasına ve dolayısıyla çalınmasını engellemektedir.

Bir diğer yaygın web uygulama güvenliği zafiyetlerinden birisi ise CSRF. Önceki yazılardan birinde tarayıcının istekleri iletirken cookie bilgilerine erişim davranışına biraz değinmiştik. Her ne kadar same origin policy ye göre A sitesinden javascript ile B sitesine cookie ye erişerek istek atılamasa da, A sitesindeki bir form u submit ettiğinizde B sunucusuna gidecek olan istek tarayıcıdan B sitesine ait cookie bilgilerini çekerek iletilir.

Aşağıdaki gibi malicious.com sitesinde gezindiğimizi düşünelim. Bu site üzerinde bir form oluşturulmuş, herhangi bir link veya butona tıklamanız durumunda isteği bank.com’a iletecek. Bu ilettiği isteğin bank.com da hassas bir fonksiyonu tetiklediğini düşünelim, örneğin para gönderme fonksiyonu. Tarayıcı, bank.com adresine bir istek göndereceği zaman, o sitenin cookie bilgisi tarayıcıda kayıtlı ise o cookie bilgisini isteğe ekleyerek gönderecektir. Bu durumda o siteye authenticated bir istek gidecek. Siz bu isteği aslında göndermek istememiştiniz, dolayısıyla bu saldırının isminde de geçtiği gibi bir sahtecilik mevcut: cross site request forgery (CSRF), siteler arası istek sahteciliği.

Bu noktada CSRF açıklığını önlemenin CSRF token, origin/referer başlığı kontrolü vb yöntemlerin yanında samesite başlığı gelir. Samesite olarak işaretlenen cookie, tarayıcı üzerinden iletilen istek/form eğer ilgili domain üzerinden gelmiyorsa engellenir. Cookie samesite özelliği üç farklı parametre ile kullanılabilir; strict ise cookie bilgisinin ait olduğu domain dışından gelen tüm isteklere ilgili cookie değeri eklenmeden iletilecek, dolayısıyla authenticated istek yapılamayacaktır. Bu özellik lax olarak işaretlenirse yalnızca get isteklerine cookie eklenecek, none ise samesite özelliği yokmuş gibi diğer sitelerden iletilen istekler cookie bilgisi ile iletilecektir.

Günümüz tarayıcılarında samesite özelliği varsayılan olarak kendiliğinden eklenebilmekte, testleri yaparken farklı browserlar kullanarak bu özelliğin sunucu tarafından set edildiğine emin olmakta fayda var.

Kaynaklar

--

--