Türkçe açılımı Siteler Arası İstek Sahtekârlığı şeklinde olan CSRF zafiyeti; web uygulamasını kullanmakta olan kullanıcıların istekleri dışında işlemler yürütülmesidir. Uygulamaya giden isteklerin hangi kaynaktan ve nasıl gönderildiği kontrol edilmeyen sistemlerde ortaya çıkan bu zafiyet, aslında uygulamayı kodlayan yazılımcıların gözünden kaçan bir ayrıntıdır diyebiliriz. Genelde CSRF veya XSRF şeklinde kısaltılan bu güvenlik açığı Session Riding olarak da bilinmektedir.
CSRF İLE NE GİBİ ZARARLAR VERİLEBİLİR?
Bu güvenlik açığı ile verilebilecek zararlar uygulamayı kullanmakta olan kullanıcının yetkilerine bağlıdır. Yani bir sistem yöneticisinin hesabı ile standart kullanıcının hesapları üzerinden uygulanacak bir CSRF açığının vereceği zararın boyutları farklıdır. Bunu bir örnek ile açıklamak gerekirse, bilgisayar kullanmakta olan birisinin yanına oturup bilgisayarını beraber kullandığınızı düşünün. Kurban olarak seçtiğiniz kişi sizin yanına oturduğunuzu ve bilgisayarı beraber kullandığınızı fark etmez. Bu durumda, kullanıcı uygulamayı kullanmaya devam ettiği sürece onun istekleri dışında kendi isteklerinizi sisteme gönderebilirsiniz.
CSRF ZAFİYETİ NASIL TESPİT EDİLİR?
Kullanıcı tarafından gönderilen bir HTTP talebinin gerçek kullanıcı tarafından mı yoksa bir saldırgan tarafından mı gönderildiğini tespit etmek zordur. Web sitesine erişmeye çalışan bir kullanıcının kimliğini doğrulamak için sıkı önlemler alınabilir, fakat kullanıcılar aynı oturumda tekrar tekrar kimlik doğrulamak ile uğraşmak istemezler. Sistemde token yönteminin kullanılması, kimliğin arka planda otomatik olarak doğrulanmasını sağlar. Böylece kullanıcı kimlik doğrulama istekleriyle sürekli olarak rahatsız edilmez. Genelde CSRF açığını engellemek için sisteme giriş yapan kullanıcıya, her defasında farklı ve tahmin edilmesi güç token bilgisi verilir. Fakat bu token verisi oturum boyunca aynı kalmaz. Örneğin kullanıcının yüklediği her bir form için ayrı token bilgisi üretilir. Arkaplanda gerçekleşen bu olayda, sisteme giriş yapan kullanıcı token aldığını her ne kadar fark etmese de, yaptığı tüm işlemlerde bu token sistem tarafından kontrol edilir ve işlemin gerçekten kullanıcı tarafından yapıldığı doğrulanır. Eğer token veya buna benzer bir anahtar kontrolü yapılmazsa, arka planda gönderilen sahte bir istek ile gerçek kullanıcının gönderdiği istek ayırt edilemez. Bu durumda sistemin gelen tüm istekleri ayırt etmeksizin kabul etmesi gerekir ki bu büyük bir güvenlik zafiyetine sebep olur.
ZAFİYETLİ SENARYO
Şu anda banka sisteminin POST methodunu kullandığını ve savunmasız talebin şuna benzediğini varsayalım:
Kod:
POST http://bankahalil.com/transfer.do hedef_bankahesabı=Halil ve miktarı = 1000
Kod:
<form action = <nowiki> http://bankahalil.com/transfer.do </nowiki> method = POST>
<input type = hidden name = acct value = Halil />
<input type = hidden name = amount value = 100000 />
<input type = submit value = İndirimleri görüntüle /></ Form>
Kod:
<body onload = ********.forms [0] .submit ()><Form
Bu senaryonun önüne geçmek için isteklere token bilgisi ekleyebiliriz. Aynı senaryoyu token bilgisi ile çalışan bir sistemde tekrarlayalım:
Kod:
<form action = <nowiki> http://bankahalili/transfer.do&token=314asdq62643383279!%5028841971 </nowiki> method = POST
Peki nasıl kendimizi sistemimizi korumamız gerek ?
CSRF zafiyetine karşı hem sistem tarafından hem de kullanıcı tarafından alınabilecek önlemler vardır.Mesela örnek verecek olursak;
Sistem tarafında alınması gereken önlemler:
- Kullanıcının sisteme gönderdiği önemli talepler POST metodu ile alınmalıdır.
- Siteler Arası Talep Sahteciliğini (CSRF) önlemek için en popüler yöntem, kullanıcıya rastgele üretilmiş eşsiz bir token bilgisi vermektir. CSRF Token veya Synchronizer Token olarak adlandırılan bu yöntem şu şekilde çalışır:
- Web sunucusu bir token 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ştirir.
- Token bilgisi POST verilerine dahil edilir.
- Web uygulaması, sistem tarafından oluşturulan tokeni, talepte gönderilen token ile karşılaştırır.
- Eğer token verileri 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.
Token yönteminin düzgün bir şekilde uygulanabilmesi için, kriptografik olarak güvenli olması gerekir. Böylece; saldırganlar tarafından kolay tahmin edilemeyen, güvenilir bir araç olacaktır.
Her ne kadar kesin çözüm olmasa da gönderilen isteklerin `HTTP Referer` başlıkları da kontrol edilmelidir.
Son düzenleme:

