İçeriğe geç

CSRF Saldırısı ve MVC’de AntiForgeryToken Koruması

Siteler Arası İstek Sahteciliği (CSRF – Cross-Site Request Forgery), web uygulamalarını hedef alan yaygın ve tehlikeli bir güvenlik açığıdır. Bu saldırı türünde, saldırgan kurbanın tarayıcısını kullanarak, kurbanın oturum açmış olduğu güvenilir bir web sitesine, kurbanın bilgisi veya onayı olmadan istenmeyen bir istek göndermeye çalışır. Kullanıcı, kötü niyetli bir siteyi ziyaret ettiğinde, tarayıcısı otomatik olarak oturum açtığı diğer sitelerdeki çerezleri (cookie) gönderir. CSRF saldırısı, bu davranıştan faydalanarak kullanıcının adına, örneğin para transferi, şifre değiştirme veya sipariş verme gibi eylemler gerçekleştirmeyi amaçlar. ASP.NET MVC, bu tür saldırılara karşı etkili bir koruma mekanizması sunar: @Html.AntiForgeryToken() ve [ValidateAntiForgeryToken] özniteliği, isteklerin gerçekten kullanıcının kendisi tarafından yapıldığını doğrular. Bu metin, CSRF’nin mantığını ve ASP.NET MVC’nin bu tehditle nasıl mücadele ettiğini detaylandıracaktır.

Siteler arası istek sahteciliği (CSRF) saldırısının mantığı

CSRF saldırısı, “tek tıkla saldırı” veya “oturum sabitleme” olarak da bilinen bir yöntemle, kurbanın güvenini ve tarayıcısının otomatik davranışını istismar eder. Saldırı senaryosu genellikle şöyledir: İlk olarak, bir kullanıcı güvenilir bir web sitesinde (örneğin, online bankacılık veya e-ticaret sitesi) oturum açar ve bu siteye ait oturum çerezleri tarayıcısında saklanır. Ardından, saldırgan tarafından hazırlanmış kötü amaçlı bir web sitesini (veya meşru bir sitedeki kötü amaçlı bir reklamı/bağlantıyı) ziyaret eder. Saldırganın sitesi, kurbanın oturum açmış olduğu hedef siteye, kurbanın bilgisi olmadan bir HTTP isteği (genellikle POST) gönderecek şekilde tasarlanmış bir HTML formu veya JavaScript kodu içerir.

Örneğin, saldırgan banka transferi yapan bir formun aynısını kendi sitesine yerleştirebilir:

<form action="https://banka.com/transfer" method="POST">
    <input type="hidden" name="aliciHesap" value="SALDIRGAN_HESABI" />
    <input type="hidden" name="tutar" value="1000" />
    <input type="submit" value="Hediye Kazanmak İçin Tıkla!" />
</form>

Kurban bu formu submit ettiğinde (veya saldırgan JavaScript kullanarak otomatik olarak submit ettiğinde), tarayıcı bu isteği banka.com’a gönderirken, banka.com için sakladığı geçerli oturum çerezlerini de otomatik olarak ekler. Banka sunucusu, isteğin geçerli bir oturumla geldiğini ve çerezlerin doğru olduğunu gördüğünde, isteği meşru kabul ederek saldırganın hesabına para transferini gerçekleştirir. Bu saldırının anahtarı, tarayıcının çerezleri otomatik olarak isteklerle birlikte gönderme davranışıdır ve saldırganın bu çerezlere doğrudan erişememesine rağmen, kurbanın tarayıcısını kullanarak bu işlemi gerçekleştirmesidir. Kullanıcı, isteği kendisi başlatmadığı için savunmasız kalır.

ASP.NET MVC’de CSRF savunması: anti-forgery token mekanizması

ASP.NET MVC, CSRF saldırılarına karşı koymak için “anti-forgery token” olarak bilinen güçlü bir savunma mekanizması sunar. Bu mekanizma, bir isteğin gerçekten kullanıcının kendisi tarafından başlatıldığını ve kötü niyetli bir dış kaynak tarafından zorlanmadığını doğrulamak için tasarlanmıştır. Temel prensip, her form gönderimi için benzersiz, tahmin edilemez ve oturuma özgü iki gizli değer oluşturmaktır: biri HTTP yanıtındaki bir HTML form alanına gömülürken, diğeri kullanıcının tarayıcısına bir HTTP çerezi olarak gönderilir.

Bu tokenler, ASP.NET MVC Razor görünümlerinde @Html.AntiForgeryToken() yardımcı metodu kullanılarak oluşturulur. Bu metod çağrıldığında, iki temel şey meydana gelir:

  1. Gizli form alanı (hidden form field)

    Görünüme, adını ve değerini içeren gizli bir HTML <input> etiketi eklenir. Değer, kriptografik olarak güvenli bir şekilde üretilmiş, rastgele ve oturuma özgü bir dizedir. Bu alan genellikle aşağıdaki gibi görünür:

    <input name="__RequestVerificationToken" type="hidden" value="[rastgele_token_değeri]" />
  2. HTTP çerezi (HTTP cookie)

    Aynı anda, bu gizli form alanındaki token ile eşleşen bir değer (genellikle şifrelenmiş veya tokenin bir parçası) kullanıcının tarayıcısına bir HTTP çerezi olarak gönderilir. Bu çerez, tarayıcı tarafından, sadece orijinal alan adı için sonraki tüm isteklere otomatik olarak eklenir. Bu çerez genellikle __RequestVerificationToken adını taşır.

Bu iki token çifti, kullanıcının oturumuyla ilişkilendirilir ve her form gönderimi için benzersiz olmaları sağlanır. Saldırganın web sitesi, kurbanın tarayıcısından çerezleri okuyamaz veya gizli form alanının değerini tahmin edemez, bu da sahte bir istek oluşturmayı imkansız hale getirir.

[ValidateAntiForgeryToken] özniteliğinin rolü ve çalışma prensibi

Anti-forgery token mekanizmasının ikinci ve kritik parçası, Controller’daki [ValidateAntiForgeryToken] özniteliğidir. Bu öznitelik, özellikle HTTP POST isteklerini işleyen Controller eylemlerine (action methods) uygulanır. Bir HTTP POST isteği bu özniteliğe sahip bir eylem metoduna ulaştığında, ASP.NET MVC çalışma zamanı aşağıdaki kontrolleri gerçekleştirir:

  1. Formdaki token kontrolü

    Gelen istekteki POST verileri arasında __RequestVerificationToken adlı gizli form alanının varlığını ve değerini arar.

  2. Çerezdeki token kontrolü

    İstekle birlikte gelen HTTP çerezleri arasında __RequestVerificationToken adlı çerezin varlığını ve değerini arar.

  3. Tokenlerin karşılaştırılması

    Bulunan gizli form alanı tokeni ile çerezdeki token değerlerini karşılaştırır. Bu karşılaştırma sırasında, tokenlerin sadece varlığı değil, aynı zamanda eşleşip eşleşmedikleri ve geçerli olup olmadıkları da kontrol edilir. Tokenler genellikle kullanıcının oturum kimliği ile ilişkilendirilmiş ve kriptografik olarak imzalanmış veriler içerir.

Eğer her iki token de mevcutsa ve değerleri birbirini doğruluyorsa (yani eşleşiyorsa ve geçerli imzaları varsa), istek meşru kabul edilir ve eylem metodu güvenli bir şekilde yürütülür. Ancak, tokenlerden biri eksikse, değerler eşleşmiyorsa veya tokenler geçersizse (örneğin, süresi dolmuşsa veya kurcalanmışsa), ASP.NET MVC otomatik olarak bir HttpAntiForgeryException hatası fırlatır ve isteği “HTTP 400 Bad Request” hatasıyla reddeder.

Bu mekanizma, CSRF saldırılarını etkili bir şekilde engeller çünkü bir saldırgan, kendi kötü amaçlı sitesinden bir istek gönderdiğinde:

  • Kurbanın oturum çerezini (cookie) doğrudan okuyamaz veya kendi isteğine ekleyemez (same-origin policy nedeniyle).
  • Hedef sitenin ürettiği gizli form alanındaki rastgele ve tahmin edilemez token değerini bilemez veya tahmin edemez.

Dolayısıyla, saldırgan tarafından gönderilen sahte istekte, ya çerez tokeni eksik olacak, ya da form tokeni eksik/yanlış olacak, bu da [ValidateAntiForgeryToken] özniteliğinin devreye girerek isteği reddetmesine yol açacaktır. Bu sayede, yalnızca hedef site tarafından gerçek bir kullanıcı için oluşturulmuş ve doğru tokenlere sahip isteklerin işlenmesi sağlanır.

Sonuç

Siteler Arası İstek Sahteciliği (CSRF), kullanıcının güvenilir bir web sitesindeki aktif oturumunu istismar ederek, iradesi dışında zararlı eylemler gerçekleştirmeyi hedefleyen kritik bir güvenlik açığıdır. Tarayıcıların oturum çerezlerini her istekle otomatik göndermesi, saldırganların bu davranıştan faydalanarak, kullanıcılara farkında olmadan finansal işlemler yaptırması veya hesap ayarlarını değiştirmesi için zemin hazırlar. Bu nedenle, modern web uygulamalarında CSRF koruması sağlamak hayati önem taşır. ASP.NET MVC, bu tehdide karşı etkili bir çözüm sunar: @Html.AntiForgeryToken() ve [ValidateAntiForgeryToken] özniteliği. Bu mekanizma, her form gönderimi için gizli bir form alanı ve HTTP çerezi olarak eşleşen, benzersiz tokenler oluşturur. İstek sunucuya ulaştığında, [ValidateAntiForgeryToken] bu tokenlerin varlığını ve eşleşmesini doğrular. Başarısızlık durumunda istek reddedilir. Böylece, saldırganların doğru token kombinasyonunu elde etmesi engellenir, kullanıcı eylemlerinin orijinalliği ve güvenliği garanti altına alınır.

“`

Resim Sahibi: Mikhail Nilov
https://www.pexels.com/@mikhail-nilov

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir