CSRF

Sefa Yıldırım
4 min readJul 27, 2023

--

CSRF (Cross Site Request Forgery) Nedir?

CSRF’i anlamak için öncelikle cookie ve session’ı anlamak gerekir. Biraz bunlardan bahsedeceğim.

Cookie ve session genelde birbirleriyle karıştırılabiliyor. Cookiler: Kullanıcılar web sitelerinde gezinirken, kullanıcıların verdiği bilgileri alan saklayan, depolayan dosyalardır. Cookie’de hangi bilgiler olabilir, ülke durumu,dil ayarları, kullanıcı adı ve parolalarınız ya da bir alışveriş sitesinde sepete eklediğiniz ürünler gibi.

Session Cookie ise bir cookie çeşidir. Bizim oturum bilgilerimizi saklar. Sessionlar geçicidir. Log-out yaptığımızda session bilgilerimiz silinir.

Cookie ler nasıl oluşur, bir http requestinde bulunduğumuzda, bu requesti yapan browser dır. Browser sunucudan aldığı cookie bilgisini response da header alanında set ederek ekler ve bunu kendi yerel veritabanına kaydeder. İkinci request de bulunduğumuzda browser kendi veritabanına kaydettiği bilgiyi requestin header ında cookie olarak ekler ve bunu sunucuya gönderir bu sayede web uygulaması seni tanır.

Eğer cookiler olmasaydı her seferinde kullanıcı adı parola girmemiz gerekirdi. Browserlar cookieleri eklerken belli faktörleri göz önüne alarak ekler.

Her requeste cookie bilgilerimizi eklemez. http://www.sefa.com:80/ adresimiz olsun browser cookie eklerken protokol,domain ve port a bakar ve buna göre ekler. Eğer http://www.sefa.com:80 adresindeyken http://www.talha.com:80 adresine request de bulunursan sefa.com daki cookileri eklemeyecektir.

CSRF

Kullanıcı güvendiği bir web sitesine giriş yapar ve oturum oluşturur. Bu, sunucu tarafında bir cookie oluşturur ve browserda bu bilgi saklanır.

Kötü niyetli kişi bu cookie bilgisine erişemez. Ancak saldırgan, başka bir web sitesinde zararlı html içeriklerini oluşturur ve kullanıcıyı bu içeriğe yönlendirmeye çalışır. Kullanıcı bu siteyi ziyaret ettiğinde saldırganın kontrol ettiği istekler yapılır ve kullanıcının güvendiği web sitesine doğrulanmış gibi gönderilir.

Kullanıcının güvendiği web sitesi, browser da saklanan cookie bilgilerine güvenir ve bu sahte istekleri gerçekleştirir.

Çünkü zararlı içeriği ziyaret eden kullanıcının browserındaki session bilgileri ile gönderildiğini düşünür.Bu durumda CSRF zafiyeti oluşur.

CSRF i ANLAMAK

Bir örnek üzerinden detaylıca anlatmaya çalışacağım.

Bir web sitemiz olsun ve burda delete işlemini gerçekleştirelim. Giden request aşağıdaki görseldeki gibi olacaktır.

Bu request de adress/delete/17 e giden bir GET isteği var. Bu requesti login olmuş sefa kullanıcısı isteyerek mi gönderdi yoksa farkına varmadan mı gönderdi burası önemli bir nokta. Farkına varmadan nasıl gönderebilir aşağıya bir hackera ait web sitesinin basit bir html içeriğini yazacağım ve nasıl gönderebileceğini anlamış olacağız.

<html>

<img src= “http:18.132.45.78/adress/delete/17”><img>

<h1>IPHONE 14 PRO MAX KAZANDINIZ<h1>

</html>

Kullanıcı normal bir web sitesinde login olmuşken bir şekilde hacker’ın hazırladığı web sitesine girdiğinde reponse’ı alan browser img etiketinde bulunan adrese request isteğinde bulunacak.

Bir request gönderildiğinde browser hangi kurallara göre cookie bilgisini ekliyordu, protokol, domain, port ve path’e bakıyordu.

Browser bu resmi yüklemek için bit GET requesti gönderecek ve yukardaki görselle aynı requesti üretecek. Browser bakacak sefa kullanıcısı login ve diğer herşey doğru kullanıcı farkına bile varmadan delete işlemini gerçekleştirmiş olur.

CSRF Zafiyetinin Önlenmesi

CSRF (Cross-Site Request Forgery) zafiyetini önlemek için aşağıdaki yöntemleri kullanabilirsiniz:

CSRF Token Kullanımı:

Web uygulamanızın her formu ve önemli işlemi için kullanıcıya özgü CSRF token oluşturulmalıdır.

Bu token, kullanıcının tarayıcısında tutulan bir cookie veya başka bir güvenli mekanizma ile birleştirilerek kullanıcıya özel ve tahmin edilemez bir değer oluşturur.

Her istekle birlikte bu CSRF token’ı göndererek, tarayıcıda çalışan kötü niyetli bir betiğin istek göndermesini engelleyebilirsiniz.

CSRF Token değeri oluşturulma ve saklanma yöntemine göre farklılıklar gösterebilir.

CSRF Synchronizer Token Pattern Yöntemi

Kullanıcı oturumu başlatılır ve her kullanıcı için benzersiz bir token oluşturulur.

Bu token, kullanıcının tarayıcısında saklanır (genellikle bir cookie içinde).

Kullanıcı bir formu doldurur veya AJAX isteği yapar.

Form veya istek, kullanıcının tarayıcısında saklanan token ile birlikte sunucuya gönderilir.

Sunucu, gelen istekteki token’ı kullanıcı oturumuyla eşleştirir. Eğer token geçerliyse, isteği işler; aksi takdirde, isteği reddeder.

Double Submit Cookie Pattern Yöntemi

Kullanıcı oturumu başlatılır ve sunucu, iki farklı cookie oluşturur:

  • Oturum çerezi: Kullanıcının oturumunun sürdürülmesi için kullanılır.
  • CSRF belirteci (token): Kullanıcının tarayıcısında saklanan ve CSRF saldırılarına karşı koruma sağlayan bir belirtecidir.

Kullanıcı bir formu doldurur veya bir işlem gerçekleştirir.

Form veya işlemle birlikte, tarayıcıdaki iki cookie (oturum çerezi ve CSRF belirteci) sunucuya gönderilir.

Sunucu, gelen istekteki oturum çerezini kullanarak kullanıcının kimliğini doğrular.

Sunucu, gelen istekteki CSRF belirtecini kullanarak CSRF saldırılarına karşı koruma sağlar.

SameSite Çerez Attribütü:

SameSite çerez özelliği, tarayıcıların çerezleri hangi sitelerle paylaşacaklarını kontrol etmelerini sağlar.

SameSite çerezi ile, sadece aynı orijinden (site) gelen istekler, çerezlere erişebilir. Bu da CSRF saldırılarını zorlaştırır.

SameSite çerezini kullanmak için, çerezinizi oluştururken SameSite attribütünü Strict veya Lax olarak ayarlayabilirsiniz.

Referer Kontrolü:

HTTP başlıklarında bulunan Referer alanını kontrol ederek, isteğin geldiği kaynağı doğrulayabilirsiniz.

Ancak, bu yöntem güvenilir değildir çünkü bazı tarayıcılar bu başlığı silebilir veya değiştirebilir.

HTTP Only ve Secure Çerezler:

Çerezlerinizi HttpOnly ve Secure attribütleri ile oluşturun.

HttpOnly ile çerezlere JavaScript tarafından erişim engellenir.

Secure ile çerezler sadece HTTPS üzerinden iletilir.

CORS (Cross-Origin Resource Sharing) Politikaları:

Eğer web uygulamanız farklı kaynaklardan (origin) gelen isteklere açık değilse, bu saldırı türünden korunabilirsiniz.

Access-Control-Allow-Origin başlığını doğru bir şekilde ayarlayarak sadece güvenilir kaynaklardan gelen isteklere izin verebilirsiniz.

Access-Control-Allow-Origin başlığı, bir web sunucusunun, tarayıcının aynı orijinden (origin) olmayan bir kaynaktan gelen HTTP isteğine izin verip vermediğini belirler. Bu başlık, CORS (Cross-Origin Resource Sharing) politikalarının bir parçasıdır ve web uygulamalarının güvenliğini artırmak için kullanılır.

--

--