CSRF ya da XSRF olarak kısaltılabilen Cross Site Request Forgery (Siteler Arası İstek Sahtekârlığı), zafiyeti barındıran web uygulamasına yapılan bir isteğin, uygulama üzerinden yapıldığının anlaşılamamasından kaynaklanan bir açık türüdür. Yani Session Riding olarak da bilinen CSRF açıkları, web sitesine giden isteklerin, site üzerinden gidip gitmediğini kontrol eden bir mekanizmanın eksikliğinden dolayı meydana gelmektedir.
CSRF zafiyetiyle yapılabilecekler, web uygulamasının kullanıcıya verdiği yetkiyle doğru orantılıdır. Saldırgan, bazen bir form ile bazen de bir img etiketi vasıtasıyla kurbanın çeşitli istekler yapmasını sağlayabilir. Bu sırada kurban kendisine yaptırılan istekten habersizdir. Saldırının gerçekleşmesi için gönderilen JavaScript veya HTML kaynakların çalışması için kurbanın uygulama üzerinde çevrimiçi bir halde olması gerekir.
Örneğin, saldırgan CSRF açığı bulunan bir bankanın web sitesinde işlem yapan bir kullanıcıyı, para transferi yaptırmaya zorlayabilir. Ya da saldırgan, kurbanın sosyal medya hesabından başka bir kullanıcıya mesaj göndermesini sağlayabilir. CSRF zafiyetinin neden olabileceği pek çok senaryoyu akla getirmek mümkündür.
CSRF ve XSS Farkı
CSRF’nin oluşmasında web sitesinin kullanıcıya ait web tarayıcısına duyduğu güvenin suistimali söz konusuyken; XSS’nin oluşmasının temelinde kullanıcının, web sitesine sağladığı güvenin suistimali yatmaktadır. Bir CSRF saldırısının meydana gelmesi için session (oturum) kimliğinin doğrulanmış olması gerekmektedir. XSS’te ise buna gerek yoktur. Açık bulunan web sitesinde girdiler üzerinde herhangi bir doğrulama ya da escaping işlemi yapılmadığı için ortaya çıkar.
XSS’te, sunucu bir doğrulama işlemi gerektirmez ya da birincil kontrol mekanizması olarak girdiyi escaping işlemine tabi tutmazsa saldırgan; türlerine göre uzaktan kontrol edilebilen, veritabanında kalıcı olan ya da ekrana geri yansıtılabilen cookie, url parametresi, form alanları gibi girdi alanları ve istek parametrelerinin herhangi bir çeşidi vasıtasıyla uygun girdiyi gönderebilir. CSRF içinse şu örnek aydınlatıcı olabilir: Banka hesabınıza giriş yapmış olduğunuzu aynı anda başka bir sekmede bir sosyal medya hesabınızın açık olduğunu varsayalım. Saldırganın sosyal medya hesabınız üzerinden size gönderdiği bağlantıya tıkladığınızı düşünelim. Siz, bağlantıya farklı bir site üzerindeyken tıklamış dahi olsanız saldırganın gönderdiği zararlı URL arkaplanda saldırıyı gerçekleştirmiş olacak ve senaryoya göre para transferi yapmış olacaktır. Çünkü oturum bilginiz tarayıcıda hâlâ aktif ve tarayıcı session id’nize sahiptir. Halbuki para transferi formunda alınmış bir önlem bu saldırının gerçekleşmesini engelleyecektir. Ayrıca XSS’nin CSRF saldırılarına neden olabileceği ihtimali de unutulmamalıdır.
CSRF Açıklarını Tespit Etme
CSRF açığının tespiti için seçilebilir en kolay yol elbette Netsparker, Acunetix gibi otomatize edilmiş programların kullanılmasıdır. Bunun yanı sıra OWASP CSRFTester, Fiddler, Burp Suite gibi programlarla da bunu yapmak mümkündür.
Manuel olarak yapılan testlerde en bilinen yol, her kullanıcı için sabit olmayan ve tahmin edilemez token’lerin bulunup bulunmadığını araştırmaktır. Bu araştırmanın hedefi bir takım silme, ekleme, değiştirme gibi fonksiyonları çalıştıran linkler ve formlar olmalıdır.
CSRF Nasıl Exploit Edilir?
Örnek bir form üzerinden göstermek gerekirse; aşağıdaki e-posta değiştirme formu CSRF zafiyeti barındırmaktadır. Form üzerinden GET metodu ile değişiklik yapılabilmektedir. “degistir.php” dosyasının yaptığı değişiklik sonucunda e-posta adresi “email” parametresine atanır. Sonuç olarak güncel e-posta adresi “ornekeposta@adresi.com” olarak tanımlanır.
Bu formu kullanan kurbanın e-posta adresini değiştirmek için kurban tarafından çalıştırılması gereken örnek kodlardan biri aşağıdaki gibidir:
“Height” ve “width” değerinin 0 (sıfır) olarak belirlenmesiyle kurban tarafından -ayrıntılı bir inceleme dışında- fark edilemez hale getirilen zararlı URL’nin bulunduğu img tag’ının yerleştirildiği herhangi bir sayfa, kurban tarafından görüntülendiğinde mevzu bahis zararlı kod çalışmış olacaktır. Örnekte e-posta adresinin değiştirilmesi gibi bir senaryo izlense de CSRF açığının neden olabileceği pek çok durum meydana gelebilir.
Yukarıdaki örnekten bağımsız olarak img dışında da saldırıyı gerçekleştirme yolları mevcuttur:
script src
iframe src
‘Image’ nesnesi
‘XMLHTTP’ nesnesi / IE
Sayfa açıldığında POST metoduyla çalışan form
Sayfa açıldığında POST metoduyla çalışan form (alternatif)
Alınabilecek Önlemler ve Korunma Yöntemleri
Geliştiriciler İçin Genel Çözümler:
- Değiştirme, silme gibi önemli fonksiyonlar POST metoduyla yapılabilir.
- Her form için kullanılması zahmetli olsa da belirli formlarda Captcha uygulamalarına başvurulabilir.
- Yapılan her isteğin HTTP Referrer başlığı kontrol edilebilir. Bununla birlikte Referrer başlığının tam olarak güvenliği sağlaması beklenmemelidir. Çünkü manipülasyona açıktır.
- URL Rewriting yöntemi kullanılarak URL’lerin geçerli oturumda, karmaşık olarak belirlenmesi sağlanabilir. Yine de tam bir koruma sağlamayacaktır.
- CSRF token’leri kullanılabilir. Bu token’lerin her form için yeniden oluşturulması, sadece oturumu açan kullanıcıya ait olması gerekir.
- Bunlar haricinde, geliştirme ortamlarına göre çeşitli önlemler de bulunmaktadır. ASP.NET’te AntiForgeryToken ve ViewState gibi önlemler mevcut iken JAVA’da OWASP’ın geliştirdiği OWASP-CSRFGuard projesi mevcuttur. Diğer yandan PHP’de hem oluşturulacak class’lar ile hem de framework’lerde bulunan koruma özellikleriyle güvenlik sağlanabilir.
Kullanıcılar Açısından Önlemler:
- Uygulamadan mutlaka çıkış yapılmalıdır. Yani var olan oturum kapatılarak siteden ayrılmak gerekir.
- Çerezleri temizlemek önlemler arasında sayılabilir. Özellikle tarayıcıların, her kapanışta çerezleri silmesi ayarlanabilir.
- Mozilla Firefox için RequestPolicy ve Google Chrome-Mozilla Firefox için uMatrix eklentileri, yüzde yüz koruma sağlamasa da, kullanılabilir. Ayrıca NoScript eklentisi de CSRF tehditlerini azaltmaktadır.
- Bilinmeyen e-postalar açılmamalı, filtrelenen -imaj gibi- içerikler görüntülenmemelidir.
malcolm_extra