CSRF yani siteler arası istek sahtekarlığı, herhangi bir web uygulamasında oturum açmış bir kullanıcının oturumunu o web sitesinin açığından faydalanarak kullanıcının isteği dışında , saldırganın sanki o kullanıcıymış gibi erişim sağlayıp işlemler yapmasıdır. Web sitelerindeki bu açıklar, çoğunlukla GET requestleri ve SESSION işlemlerinin doğru kontrol edilememesi gibi durumlarda ortaya çıkan açıklardır. Uygulamaya giden isteklerin hangi kaynaktan ve nasıl gönderildiği kontrol edilmeyen sistemlerde ortaya çıkan bu zafiyet, “Session Riding” olarak da bilinir.
Saldırganların kullanıcının oturumuna erişebilmeleri için sadece zararlı bağlantıya tıklaması yeterlidir. Örneğin bu saldırılar, hesaplardaki e-posta adresini değiştirmek, şifreleri değiştirmek veya para transferi yapmak olabilir. Güvenliği ihlal edilmiş kullanıcının ekstra yetkinlikleri varsa saldırgan, uygulamanın tüm verilerinin ve işlevlerinin tam denetimini ele geçirebilir.
CSRF saldırısı nasıl oluşturulur?
CSRF saldırısı oturum açmış bir kullanıcının saldırganın kontrol ettiği web sitesine erişmesi sağlanır ve sonra JavaScript kodu çalıştırılarak veya formlar göndererek süreci ilerletir. Bir CSRF zafiyeti için gereken HTML’yi manuel bir şekilde yazmak özellikle request çok fazla parametre içeriyorsa zor olur. Bir CSRF istismarı oluşturmak için en kolay yöntem Burp Suite programında bulunan CSRF PoC oluşturucuyu kullanmaktır.
Saldırı yapmak için gerekenler
Bir CSRF güvenlik açığını kötüye kullanabilmek için ilk yapacağınız şey kötüye kullanabileceğiniz bir davranış bulun örneğin; şifreyi veya e-postayı değiştirin, mağdurun sizi bir sosyal ağda takip etmesini sağlayın. Oturum yalnızca tanımlama bilgilerine veya HTTP Temel Kimlik Doğrulama başlığına dayanmalıdır, oturuma erişim için başka bir başlık kullanılamaz. Son olarak, istekte beklenmedik parametreler olmamalıdır.
Bu güvenlik açığına yakalanmamak için yapabileceğiniz birkaç yöntem bulunmaktadır. Bunlar;
- Oturum çerezi SameSite çerezleri kullanıyorsa, çerezi rastgele web sitelerinden gönderemeyebilirsiniz.
- Kaynaklar arası kaynak paylaşımı: ne tür bir HTTP isteği gerçekleştirmeniz gerektiğine bağlı olarak, mağdur sitenin CORS policysini es geçmeyin.
- Parola kullanıcısından eyleme yetkilendirme vermesini isteyin .
- Bir captcha’yı çözün.
- Referrer veya Origin başlıklarını okuyun.
- Post veya Get isteklerinin parametrelerinin adını değiştirin
- Her oturumda bir CSRF token kullanın. Token, eylemi onaylamak için isteğin içinde gönderilmelidir ve CORS ile korunabilir.
NOT: Saldırı yaparken kötüye kullanmak istediğiniz form CSRF token ile bir POST isteği göndermek için hazırlanmış olabilir. Bunun bir GET’in de geçerli olup olmadığını ve bir GET isteği gönderdiğinizde CSRF tokenın onaylanıp onaylanmadığını kontrol etmelisiniz .
NOT: Bazı uygulamalar token olduğunda başarılı bir doğrulama yapar ama token atlanırsa doğrulama işlemi de atlanmış olur. Böyle bir durumda saldırgan , doğrulamayı atlayarak CSRF saldırısı gerçekleştirmek için sadece değerini değil token içeren tüm parametreyi kaldırabilir.
CSRF Nasıl Tespit Edilir?
Kullanıcı tarafından gönderilen bir HTTP isteğinin gerçek kullanıcı mı yoksa bir saldırgan tarafından mı gönderildiğini tespit etmek kolay değildir. Sistemde Token yöntemi kullanılması, kimliğin arka planda otomatik olarak doğrulanmasını sağlar bu sayede kullanıcı sürekli kimlik doğrulama istekleriyle uğraşmaz. Genelde CSRF açığını engellemek için sisteme giriş yapan kullanıcıya, her işlemde farklı ve tahmin edilmesi güç token bilgisi verilir. Verilen bu token bilgisi oturum boyunca aynı kalmaz ve kullanıcı oturumu kapatınca geçersiz hale getirilmelidir. Eğer token veya benzeri 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 ve güvenlik zafiyeti ortaya çıkar.
NOT: CSRF token oturum tanımlama bilgisi ile ilgiliyse, hedefi oturuma ayarlamanız gerekeceği için saldırı çalışmaz ve kendinize saldırmış olursunuz.
CSRF Zafiyetine Karşı Alınabilecek Yöntemler
CSRF zafiyetine karşı hem sistem tarafından hem de kullanıcı tarafından alınabilecek birkaç önlem bulunur. Bu önlemler sistem ve kullanıcı tarafında olmak üzere ikiye ayrılır.
- Sistem tarafında alınması gereken önlemler:
- Token kullanın: En popüler olan bu yöntem kullanıcıya her oturum için random ve benzersiz “token” bilgisi verilir. Bu yöntem CSRF Token veya Synchronizer Token olarak adlandırılır. Web uygulaması, sistem tarafından oluşturulmuş tokeni, istek 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. Veriler eşleşmezse istek reddedilir ve böylece kötü niyetli istekler engellenmiş olur.
- Get metodu yerine Post metodu kullanın: Kullanıcının sisteme gönderdiği önemli veriler POST metodu ile alınmalıdır.
- CAPTCHA kullanın: Bir web formunda captcha doğru olmadığı için işlem gerçekleşmeyeceği için “CSRF” saldırısına karşı bir önlemdir.
- Kesin çözüm değildir ancak kullanıcılardan gönderilen isteklerin `HTTP Referer` başlıklarını kontrol edin.
- Double Submit Cookie Pattern Yöntemi kullanın: Çerez ve istek parametresinde rastgele bir değer göndermedir. Kullanıcıların oturum açma talebi sistemde doğrulandığında sistem istemci tarafında oturum ID si oluşturur ve çerezlere kaydeder. Bunun yanında token oluşturur ve kullanıcının makinesinde ayrı bir çerez olarak saklar. Server, form parametresi olarak gönderilen tokeni, çerez değerine bakarak doğrular ve tamamlanacak işlemi yetkilendirir. Çapraz kökenli bir saldırgan, aynı kökenden gelen ilkeye göre sunucudan gönderilen verileri okuyamaz veya çerez değerlerini değiştiremez.
- Kullanıcı tarafında alınması gereken önlemler:
- Çerezleri ve web site verilerini düzenli periyotlarla temizleyin.
- Bilmediğiniz kaynaklardan gelen bağlantılara tıklamayın ya da kimden geldiğini anlamadığınız mailleri kontrol etmeden açmayın.
- Kişisel bilgilerin bulunduğu web uygulamalarının oturum bilgilerini bilgisayarda kayıtlı tutmayın.