CSRF ya da Cross-Site Request Forgery Türkçe olarak Siteler Arası İstek Sahteciliği olarak da bilinir. Kullanıcıları gerçekleştirmek istemedikleri eylemleri gerçekleştirmeye teşvik etmesine olanak tanıyan bir web güvenlik açığıdır. Yani tam olarak ne demek bu?
Örneğin Facebook’da geziniyor olalım. Yan sekmede de başka bir site açtık ve bir anda fark ettik ki facebook hesabımızın e-mail adresi değişmiş. Halbu ki biz bişe yapmadık sadece yan sekmede bir başka sitede gezindik. Peki nasıl oldu bu olay? Birazdan örneklerle daha net anlayacaksınız.
Peki CSRF saldırısı kullanılarak neler yapılabilir?
Başarılı bir CSRF saldırısında, saldırgan mağdur kullanıcının istemeden bir eylem gerçekleştirmesine neden olur. Örneğin bu, hesabındaki e-posta adresini değiştirmek, şifrelerini değiştirmek veya para transferi yapmak olabilir. Eylemin niteliğine bağlı olarak, saldırgan, kullanıcının hesabı üzerinde tam kontrole sahip olabilir. Güvenliği ihlal edilen kullanıcının uygulama içinde ayrıcalıklı bir rolü varsa, saldırgan uygulamanın tüm verilerinin ve işlevselliğinin tam kontrolünü ele geçirebilir.
CSRF nasıl çalışır?
Öncelikle şunu bilelim normalde A sitesine bir istekte bulunalım
GET a.com/profil/ayarlar/ HTTP 1.1
A sitesine istek de bulunduğumuzda sitenin bize daha önceden tanımlamış olduğu cookie’ler ile birlikte bu istek karşı tarafa ulaşır. Bu cookie’ler bizi tanımlayan rastgele alfa-numerik karakterlerden oluşmuş bir dizi ifadedir. Ve isteğin bizim tarafımızdan geldiğini siteye bildirir.
Cookie: session=FZXHSrge2tlLXswxR9ok0VyO5q1reOyX
Örneğin adı session olan cookie bizim oturum açtığımızı ve halen aktif olduğu tanımlıyor ve her istekte sunucuya gönderiliyor. Böylece sunucu kim olduğumuzu tanımlıyor ve istek gerçekleşiyor. Peki biraz önce siteye yapılan bir istek de o siteye ait tanımlanmış cookie’ler bizim tarayıcımız tarafından otomatik olarak isteğe ekleniyor demiştim. Eğer kötü niyetli bir kişi sizi bir link tıklamaya ikna ederse ve ya siz kendiniz kötü amaçlı bir siteyi ziyaret ederseniz. Ve saldırgan bu kötü niyetli siteyi sizin adına iş yapacak şekilde programlamışsa? İşte burada sizin isteğiniz dışında bir eylem gerçekleşmiş olur. Tıpkı en başta bahsettiğim facebook e-mail adresinizin değişmiş olması gibi. Halbu ki siz sadece bir linke tıkladığınız ve haber okumak istediniz. Peki bu olay nasıl çalışıyor. Örneklerle daha da açalım.
Örneğin bir kullanıcı e-mail adresini değiştirmek istiyor ve aşağıdaki şekilde bir istekde bulunuyor.
Burada website kullanıcıyı tanımlamak için sadece session token kullanmış.
Artık ilgili sitede kullanılan e-mail değiştirme olayının nasıl gerçekleştiğini biliyoruz. Bizde bir web sitesi hazırlıyoruz ve içine aşağıdaki gibi bir kod ekliyoruz.
Bu kod kısaca şunu yapıyor; POST isteği göndermek için bir form tagı oluşturuyor ve bu form kendi istediğimiz email adresini e-mail adresini değiştirecek şekilde istekde bulunuyor.
Normalde bu istek bu siteye giderken tarayıcımız hemen siteyle ilgili kendisi depoladığı cookie’leri bu isteğin içine yerleştirecek. Server tarafında ise istek kendisine ulaştığında bakacak istek kimden gelmiş ne yapmaya çalışıyor ve bunu yapmaya yetkisi var mı (yani cookie geçerli mi) herşey tamam olunca server isteği gerçekleştirecek. Ve böylece saldırgan kurbanın haberi olmadan e-mail adresini değiştirmiş olacak ve hesabı kendi üzerine alacak.
Bir örnekle daha bu işlemi gerçekleştirelim.
Bir blog sayfamız olsun tıpkı aşağıdaki gibi
Change email diyerek ilgili sayfaya ulaşalım.
Değiştirmek için e-mail adresimizi yazalım ve Update email diyerek bakalım arkada nasıl bir istek gerçekleşiyor. Burada favori proxy tool’unuzu başlatın ve isteği yakalayın. Ben burp suite kullanıyorum.
İsteğimizi yakaldık ve artık nasıl e-mail adresini değiştireceğimizi biliyoruz. Hadi yola koyulalım ve saldırı yapacağımız siteyi hazırlıyalım.
Zaralı websitemizi hazırladık. Artık bu siteye tıklanıldığında aktif oturumumuz olan vulnerable-site.com adlı sitedeki e-mail adresimiz değişecek.
En temelde CSRF atağı bu şekilde gerçekleşir.
CSRF atağı nasıl önlenir?
Biliyoruz ki bu atağın temelde gerçekleşme sebebi bizi tanımlayan cookie’lerden kaynaklı. Bizim isteğimiz doğrultusunda çalınıyor ve ya kullanılıyor. En güzel yollardan birisi kullanıcıyı tanımlamak için sadece cookie’lere güvenmemek. Aynı zamanda Http isteğimizin header’ına bir bölüm eklemek.
X-CSRF-Token : FZXHSrge2tlLXswxR9ok0VyO5q1reOyXR9ok0VyO5q1reOyX
Gibi bir header ekleyerek ekstra bir katman oluşturabiliriz. Böylece başka bir site adımıza istekte bulunsa bile Header’daki bu değeri gönderemeyeceği için atak gerçekleşemiyecek. Çünkü bu header sadece ilgili sitenin çalışma mantığı gereği o sitede oluşturulup isteğe ekleniyor. Ve token çok karışık bir ifade olduğundan tahmin de edilemiyor.
Evet bugün de CSRF nedir, nasıl çalışır ve nasıl önleriz gibi temelden bir giriş yaptık. Umarım Türkçe kaynak oluşturma çabası içinde olanlar olarak bir faydam dokunmuştur. Bir sonraki yazımızda görüşmek üzere hoşçakalın :)