Bu yazıda, CSRF zafiyetinin ne olduğu ve nelerden etkilendiği konusuna değineceğiz. Daha sonra ise bir örnek üzerinde CSRF zafiyetini inceleyeceğiz.

CSRF Nedir?

Cross-site Request Forgery, Siteler Arası İstek Sahteciliği olarak Türkçeleştirilmektedir. Kullanıcıların bulundukları oturum üzerinde başkaları tarafından değiştirilemez olmasını istediği önemli bilgilerin, saldırganlar tarafından ilgili zafiyetin istismarı sonucu hedef kullanıcıların manipüle edilmesiyle bu önemli bilgiler üzerinde değişiklik yapılmasını sağlamayı amaçlayan bir saldırı türüdür.

Özetle, bu zafiyet aslında saldırganın kullanıcıya kendi istemi dışında bir işlem yaptırması sonucu oluşmaktadır. Zafiyetin istismarı esnasında bir saldırganın izlediği adımlar aşağıda açıklanmıştır.

Kullanıcının oturum açmış olduğu uygulama üzerinde dışarıdan gelen veya dışarıya giden tüm istekler filtrelenmemiş ise, saldırgan basitçe kullanıcının oturumunda bulunan önemli bir bilginin değiştirildiği html form elemanlarını kendi oluşturmuş olduğu bir html sayfasına yazıp, kullanıcının oturumunun bulunduğu uygulamaya yönlendirme yapabilir. Daha sonra saldırgan yazmış olduğu html sayfasını, kullanıcı oturumu hali hazırda farklı sekme üzerinde devam ederken, bir şekilde kullanıcıya açtırmayı başarırsa ilgili kullanıcı oturumu üzerinde işlemler yapabilecektir.

Bu durumu daha iyi anlayabilmek için örnek bir senaryo üzerinde inceleyelim:

Kurban, tarayıcısının bir sekmesinde banka hesabında oturum açmış halde işlemlerini yaparken, bir diğer sekmesinde ise e-posta hesabında gelen kutusunu incelemektedir.

Bu esnada kullanmış olduğu banka uygulamasında dışarıdan gelen veya dışarıya giden istekler engellenmemiştir.

Saldırgan bu durumu fark ettikten sonra, banka uygulamasında bulunan para gönderme formundaki html form elemanlarını, parayı kendine gönderecek şekilde, kendi oluşturmuş olduğu html sayfasına yazıp bu banka uygulamasına gönderim yapmasını sağlar.

Saldırgan, hazırlamış olduğu html sayfasını kullanıcıya e-posta yoluyla gönderdikten sonra, kullanıcı yan sekmesinde bulunan gelen kutusunu incelemeye koyulur.

Kullanıcı ilgili e-postada bulunan html sayfasına gittiği takdirde, saldırgan ilgili havale işleminde gönderilmiş olan parayı kendine yönlendirmiş olacaktır.

CSRF Zafiyeti içeren örnek bir uygulama:

CSRF zafiyetini içeren bir örnek sayfamızda senaryomuzda anlattığımız gibi para transfer işlemi içeren bir form elemanı bulunmaktadır.



Bu form üzerinde rastgele değerler girip sunucuya giden istek incelendiğinde ise aşağıdaki görüntüde görüldüğü gibi, CSRF zafiyetine karşı herhangi bir token bulunmamaktadır.

 

Bunun üzerine, aynı bu formun sahip olduğu html elemanlarını içeren ve bu sayfaya yönlendirme yapan bir html sayfası düzenlenirse başarılı bir şekilde kullanıcıyı manipüle ederek istediğimiz hesaba para transfer işlemi yapabileceğiz demektir.

Görüldüğü gibi sayfadaki form elemanları alınarak bir html sayfası düzenlendi. Burada; action değerine bu form elemanının yönleneceği sayfa belirtilmiştir.

document.forms[0].submit();

Yukarıda belirtilen kod ile de otomatik olarak submit butonuna tıklatılmaktadır.

Şimdi yazılan kodu tarayıcı üzerinde açıp, tutar üzerinde herhangi bir değişiklik olup olmayacağını inceleyelim.

Görüldüğü gibi hesabımızdan 250 EUR’lık bir değer eksilmiş durumda. Böylelikle, başarılı bir şekilde CSRF zafiyetini istismar etmiş olduk.

CSRF ZAFİYETİNE KARŞI ALINABİLECEK ÖNLEMLER

CSRF zafiyetine karşı hem sistem tarafında hem de kullanıcı tarafında alınabilecek önlemler vardır.

Kullanıcı Tarafında Alınacak Önlemler:

  • Kullanıcılar kaynağı belli olmayan, güvenliği doğrulanmamış bağlantılara tıklanmaması gerektiğinin bilincinde olmalıdır.
  • Gerekmedikçe banka hesabı gibi önemli oturumlar tarayıcı sekmelerinde açık bir şekilde bırakılmamalıdır.
  • Çerezler ve site verileri düzenli olarak temizlenmelidir.

Sistem Tarafında Alınacak Önlemler:

  • CSRF zafiyetini önlemek için en bilinen yöntem, kullanıcıya rastgele üretilmiş eşsiz bir token değeri tanımlamaktır. CSRF Token olarak adlandırılan bu yöntem şu şekilde çalışır:
    • Web sunucusu bir token değeri oluşturur. (Bu token işlem yapıldıkça yeniden üretilir.)
    • Token, formda gizli bir bilgi olarak depolanır.
    • Kullanıcı POST işlemini gerçekleştirirken token değeri de POST verilerine dahil edilir.
    • Web uygulaması, sistem tarafından oluşturulan tokeni, istekte gönderilen token ile karşılaştırır.
    • Eğer token değerleri eşleşirse, isteğin gerçek kullanıcı tarafından gönderildiği anlaşılır ve istek onaylanır.
    • Eşleşme yoksa, istek reddedilir. Bu sayede kötü niyetli istekler engellenmiş olur.

Bizi takip ettiğiniz için teşekkür ederiz. Bir sonraki yazımızda görüşmek üzere!