Türkçe
  • csrf saldırısı
  • web güvenliği
  • cross-site request forgery
  • çerez güvenliği
  • aynı köken politikası
  • csrf koruması
  • SameSite

CSRF'yi derinlemesine anlamak

Cross-Site Request Forgery (CSRF) saldırılarına ilişkin derinlemesine bir araştırma sunar, mekaniklerini açıklar, örnekler gösterir ve web uygulaması güvenliğini artırmak için çeşitli önleme yöntemlerini detaylandırır.

Yijun
Yijun
Developer

Web geliştirme üzerinde çalışırken, özellikle çerezlerle, sık sık "bu ayar CSRF'yi önlemeye yardımcı olur" gibi ifadeler duyuyoruz. Ancak, birçok kişi "CSRF"nin gerçekten ne anlama geldiği konusunda sadece belirsiz bir fikre sahiptir.

Bugün, yaygın bir web güvenlik açığı olan CSRF (Cross-Site Request Forgery)'yi derinlemesine inceleyeceğiz. Bu, CSRF ile ilgili sorunları daha etkili bir şekilde ele almamıza yardımcı olacak.

CSRF nedir?

CSRF (Cross-Site Request Forgery), saldırganların kimliği doğrulanmış kullanıcıları, istenmeyen eylemleri gerçekleştirmeleri için kandırdığı bir tür web saldırısıdır. Basit terimlerle, bu, "hackerlerin, yetkisiz eylemler gerçekleştirmek için kullanıcı gibi davranmaları"dır.

CSRF nasıl çalışır?

CSRF'yi anlamak için birkaç temel kavramı kavramamız gerekiyor:

Tarayıcının Aynı Köken politikası

Aynı köken politikası, bir belgenin veya betiğin bir kökenden diğer kökene kaynaklarla nasıl etkileşime girebileceğini sınırlayan tarayıcıdaki bir güvenlik özelliğidir.

Bir köken, bir protokol (HTTP veya HTTPS gibi), alan adı ve bağlantı noktası numarasından oluşur. Örneğin, https://example.com:443 bir kökendir, https://demo.com:80 ise başka bir kökendir.

Aynı köken politikası, farklı kökenlerden sayfalar arasında veri erişimini kısıtlar, yani:

  • Bir kökenin JavaScript'i başka bir kökenin DOM'unu okuyamaz
  • Bir kökenin JavaScript'i başka bir kökenin Çerezini, IndexedDB'sini veya localStorage'unu okuyamaz
  • Bir kökenin JavaScript'i başka bir kökene AJAX istekleri gönderemez (CORS kullanılmadıkça)

Ancak, Web'in açıklığı ve birlikte çalışabilirliğini korumak için (CDN'lerden kaynak yüklemek veya üçüncü taraf API'larına istek göndermek gibi), aynı köken politikası çapraz köken ağ isteklerini sınırlamaz:

  • Sayfalar herhangi bir kökene GET veya POST istekleri gönderebilir (resim yüklemek veya formlar göndermek gibi)
  • Herhangi bir kökenden kaynaklar içe aktarılabilir (<script>, <img>, <link>, <iframe> etiketleri gibi)

Otomatik çerez gönderme mekanizması

Otomatik çerez gönderme mekanizması, tarayıcıların önemli bir özelliğidir. Bir tarayıcı bir etki alanına bir istek gönderdiğinde, otomatik olarak o etki alanının tüm çerezlerini ekler. Bu işlem otomatik olup, herhangi bir JavaScript kodu veya kullanıcı etkileşimi gerektirmez.

Bu mekanizma, web sitelerinin kullanıcıların oturum açma durumlarını kolayca hatırlamasına olanak tanır çünkü her istek otomatik olarak kullanıcının kimlik bilgilerini taşır. Kalın Örneğin, bir bankanın web sitesine (bank.com) giriş yaptığınızda bir kimlik çerezi alırsınız ve ardından hesabınızı görüntülemek için tıkladığınızda, tarayıcı otomatik olarak bank.com ile eşleşen tüm çerezleri bulur ve bu isteğe ekler. Bankanın sunucusu bu sayede backend'den sizi tanımlayabilir ve hesap bilgilerinizi döndürebilir.

CSRF saldırı adımları

  1. Kullanıcı hedef web sitesine giriş yapar (bir bankanın sitesi gibi) ve bir kimlik doğrulama çerezi alır. Bu adım, otomatik çerez gönderme mekanizmasını kullanır. Banka sitesi bir kimlik doğrulama çerezi ayarladıktan sonra, tarayıcı bu çerezi o siteye gönderilen her isteğe otomatik olarak ekleyecektir.

  2. Kullanıcı çıkış yapmaksızın zararlı bir web sitesini ziyaret eder. Bu noktada, aynı köken politikası nedeniyle, zararlı site doğrudan banka sitesinin çerezini okuyamaz veya değiştiremez. Bu, kullanıcı kimlik bilgilerini doğrudan çalınmaktan korur.

  3. Zararlı site hedef siteye bir istek ekler (bir transfer işlemi gibi). Aynı köken politikası çapraz köken erişimini kısıtlasa da, <img>, <form> etiketleri aracılığıyla başlatılan istekler gibi çapraz köken ağ isteklerine izin verir. Saldırganlar bu "açığı" kullanırlar.

  4. Kullanıcının tarayıcısı bu isteği otomatik olarak hedef sitenin çerezi ile birlikte gönderir. Bu, CSRF saldırısının özüdür. Hem çapraz köken isteklerine izin veren aynı köken politikasından hem de otomatik çerez gönderme mekanizmasından faydalanır (zararlı siteler tarafından tetiklenen istekler bile alanla eşleşen çerezleri taşır).

  5. Hedef site isteği alır, çerezin geçerli olduğunu doğrular ve işlemi gerçekleştirir. Sunucu bu isteğin meşru bir kullanıcı eyleminden gelip gelmediğini söyleyemez çünkü eklenen çerez geçerlidir.

CSRF saldırı örneği

CSRF saldırısının nasıl meydana geldiğini belirli bir örnekle açıklayalım. Kurgusal bir banka web sitesi bank.comu örnek olarak kullanacağız.

Öncelikle kullanıcı https://bank.comu ziyaret eder ve hesabına giriş yapar.

Başarılı girişten sonra sunucu bir kimlik doğrulama çerezi ayarlar, örneğin:

Kullanıcı banka web sitesinde bir transfer işlemi gerçekleştirir, örneğin Ali'ye 1000 $ transfer eder. Bu işlem şu şekilde bir istek gönderebilir:

Şimdi, bir saldırgan https://evil.com adlı zararlı bir web sitesi oluşturursa ve aşağıdaki HTML'i içerirse:

Kullanıcı https://evil.com bağlantısına tıkladığında banka hesabından çıkış yapmadan, çünkü zaten bank.coma giriş yapmış durumdadır, tarayıcıda geçerli bir session_id çerezi bulunmaktadır.

Kötü niyetli sayfa yüklendikten sonra, gizli formu otomatik olarak gönderir ve https://bank.com/transfere bir transfer isteği gönderir.

Kullanıcının tarayıcısı bu isteğe otomatik olarak bank.com çerezi ekler. bank.com sunucusu isteği alır, çerezin geçerli olduğunu doğrular ve bu izinsiz transfer işlemini gerçekleştirir.

CSRF saldırılarını önlemenin yaygın yöntemleri

İşte birkaç yaygın kullanılan CSRF savunma yöntemi. Her bir metodun prensibini ve CSRF saldırılarını nasıl etkili bir şekilde önlediğini ayrıntılı bir şekilde açıklayacağız:

CSRF tokenleri kullanmak

CSRF tokenleri, CSRF saldırılarına karşı savunmanın en yaygın ve etkili yöntemlerinden biridir. İşte nasıl çalıştıkları:

  1. Sunucu her oturum için benzersiz, tahmin edilemeyen bir token oluşturur.
  2. Bu token, hassas işlemler için tüm formlara gömülür.
  3. Kullanıcı bir form gönderdiğinde, sunucu tokenin geçerliliğini doğrular.

CSRF tokeni, kullanıcının oturumuna bağlı benzersiz bir değer olduğundan ve saldırgan bu değeri bilemez veya tahmin edemez (her oturum için farklı olduğundan), kullanıcıyı bir isteği göndermeye kandırsa bile istek, geçerli CSRF tokeni olmadığı için sunucu tarafından reddedilecektir.

Uygulama örneği:

Sunucu tarafında (Node.js ve Express kullanarak):

Ön uç JavaScript kodunda:

Referer başlığını kontrol etme

Referer başlığı, isteği başlatan sayfanın URL'sini içerir. Referer başlığını kontrol ederek, sunucu isteğin meşru bir kaynaktan gelip gelmediğini belirleyebilir.

CSRF saldırıları genellikle farklı alanlardan geldiğinden, Referer başlığı saldırganın alan adını gösterecektir. Referer'ın beklenen değer olup olmadığını doğrulamaya çalışarak, bilinmeyen kaynaklardan gelen istekler engellenebilir.

Ancak, bu yöntemin tamamen güvenilir olmadığını belirtmek gerekir, çünkü bazı tarayıcılar Referer başlığını göndermeyebilir ve kullanıcılar tarayıcı ayarları veya eklentiler aracılığıyla Referer başlığını devre dışı bırakabilir.

Uygulama örneği:

SameSite çerez niteliğini kullanma

SameSite, çerezlerin çapraz site istekleriyle birlikte gönderilip gönderilmeyeceğini kontrol etmek için kullanılan bir çerez niteliğidir. Üç olası değeri vardır:

  • Strict: Çerezler yalnızca aynı site isteklerinde gönderilir.
  • Lax: Çerezler aynı site isteklerinde ve üst düzey gezinmelerde gönderilir.
  • None: Çerezler tüm çapraz site isteklerinde gönderilir (bu, Secure niteliğiyle birlikte kullanılmalıdır).

SameSite özelliği Strict olarak ayarlandığında, üçüncü taraf sitelerin çerez göndermesini tamamen engelleyebilir, böylece CSRF saldırılarını etkili bir şekilde önler. SameSite Lax olarak ayarlandığında, hassas işlemleri korurken, dış bağlantılardan bir web sitesine girmek gibi bazı yaygın çapraz site kullanım durumlarına izin verir.

Uygulama örneği:

Özel istek başlıkları kullanma

AJAX istekleri için özel istek başlıkları eklenebilir. Aynı köken politikası kısıtlamaları nedeniyle, saldırganlar çapraz köken isteklerinde özel başlıklar ayarlayamaz. Sunucu, bu özel başlığın varlığını kontrol ederek isteğin meşruiyetini doğrulayabilir.

Uygulama örneği:

Ön uçta:

Sunucu tarafında:

Çift çerez doğrulaması

Çift çerez doğrulaması etkili bir CSRF savunma tekniğidir. Temel prensibi, sunucunun rastgele bir token oluşturması, bunu hem çerez olarak ayarlaması hem de sayfaya (genellikle gizli bir form alanı olarak) gömmesidir. Tarayıcı bir istek gönderdiğinde, otomatik olarak çerezi eklerken, sayfanın JavaScript'i isteğe bir parametre olarak token gönderir. Sunucu daha sonra çerezdeki tokenin istekteki parametrelerdeki token ile eşleşip eşleşmediğini doğrular.

Saldırganlar hedef web sitesinin çerezini çapraz site isteklerine dahil edebilseler de, çerezin değerini okuyamaz veya değiştiremezler, sayfadaki token değerine erişemez veya bunu değiştiremezler. Hem çerezden hem de parametrelerden gelen tokenleri içermesi gereken bir istek yaparak, isteğin çerezi okumak için izne sahip bir kaynaktan geldiğini garanti eder, böylece CSRF saldırılarına karşı etkili bir şekilde savunma sağlar.

Hassas işlemler için yeniden kimlik doğrulama kullanma

Özellikle hassas işlemler için (şifre değiştirme veya büyük transferler gibi) kullanıcıların yeniden kimlik doğrulamaları istenebilir. Bu, kullanıcılara ek bir güvenlik kontrol noktası sağlar. Kullanıcı, başarılı bir şekilde bir CSRF saldırısını başlatsa bile, yeniden kimlik doğrulama adımını geçemez.

Uygulama önerileri:

  • Hassas işlemleri gerçekleştirmeden önce, ayrı bir kimlik doğrulama sayfasına yönlendirin.
  • Bu sayfada, kullanıcıdan şifrelerini veya diğer kimlik doğrulama bilgilerini girmeleri istenebilir.
  • Doğrulama geçtikten sonra, bir kerelik bir token oluşturun ve bu tokeni sonraki hassas işlemlerde kullanın.

Özet

Bu derinlemesine tartışma sayesinde, CSRF saldırılarına daha kapsamlı bir bakış açısına sahip olmanızı umuyoruz. CSRF'nin nasıl çalıştığını öğrenmenin yanı sıra, çeşitli etkili savunma yöntemlerini de araştırdık. Tüm bu yöntemler, web uygulamalarının güvenliğini etkili bir şekilde artırabilir.

Umarız bu bilgiler, günlük gelişim çalışmalarınızda CSRF ile ilgili sorunları daha iyi ele almanıza ve daha güvenli web uygulamaları geliştirmenize yardımcı olur.