Sunucu Güvenliği: CSRF – Cross Site Request Forgery

Türkçesi siteler arasında talep sahteciliğidir. XSRF olarak da kısaltılır. Çok basit anlamıyla sitenize istek gerçekten sitenizden mi geliyor sorusuna net cevap veremiyorsanız CSRF açığınız olabilir. İlk örnek olarak bir kullanıcı giriş formunun gerçekten acemi bir yazılımcının elinde GET sorgusu ile yapıldığını düşünelim. Form yaklaşık şöyle olsun.

Bu form gonderildiginde

gibi bir ürl oluşturacaktır. Peki bu ÜRL gerçekten bizim sitemizdeki giriş formu ile mi oluşturuluyor ? Yoksa başka bir websitesinden ya da client ile sitemizde çeşitli kullanıcı adı ve şifre kombinasyonlarını denemek üzere sorgu üretmek için mi gönderildi ? Haliyle beklentimiz, olması gereken formun bizim siteden gönderilmiş olması. buna emin olabilmemiz. Bunun ile ilgili alınabilecek ilk tedbir madem GET metodu ile gönderilen formlarda böyle bir risk oluşuyor, biz de POST methödü ile formu göndeririz olabilir. Bu oldukça basit, basit olduğu kadar da geçersiz bir tedbir maalesef. Zira linux terminalden curl ile bir POST yapmak şu kadar basittir:

Demek ki POST yeterli değil. Fakat gereksiz de değil tabi ki. Zira aynı browser programını kullanan iki farklı kullanıcının birbirinin parolasını görmesini de istemeyiz. Peki başka ne yapabiliriz? Giriş formları için her formda benzersiz olacak şekilde biletler oluşturabiliriz. Formdan veri geldiği zaman da bu biletleri bizim o oturum için kaydettiğimiz bilet mi değil mi kontrol ederek giriş işlemlerine devam edebiliriz. Örneğin;

Bu gizli form elemanı ile oluşturduğumuz bilet kodumuzu giriş taleplerinde değerlendirmek üzere session değişkeni olarak kaydediyoruz. Giriş talebi geldiği zaman bakalım bu kod ile bizim kaydettiğimiz aynı anlamayı deniyoruz.

Peki bu şekilde token oluşturmamız ve session ile kullanmamız güvenli mi? Hayır ama GET değerini POST yapmaktan daha ciddi bir adım attığımız kesin. Peki neden güvenli değil ? Çünkü session anahtarınız bir şekilde XSS açıkları ile veya başka bir şekilde çalınırsa sizin formunuz için üretilmiş bir bilet kodu da saldırganın eline geçmiş olur ve sistemde geçerli olur. Peki bu durumda daha fazla güvenlik için ne yapılıyor ?

İşte artık pek çok sitede gördüğünüz insan miyiz ? sorusuna geldik yani captcha ! Bu aşamaya kadar yaptığımız her şeyi koruyoruz ve artık kullanıcıların sitemizden POST methödü ile giriş yaptığını biliyor, form gönderilerinde bilet kodumuzu kontrol ediyor ve aynı zamanda sitemizde bilet kodu ile birlikte giriş denemesi ile eşleştirilen bir bilgi daha kullanıyoruz. Resim içerisinde insanların okuyabileceği şekilde yazılmış rasgele 3-6 karakter gibi. Örnek verelim;

Bu kisimda giris formu;

Artık kullanıcı oluşturduğumuz bu resmi okuyarak onayını bir form elemanına yazıyor. Bu sayede artık sitemizde her yeni istek yapmak isteyen saldırganın bilet kodumuzu çalsa da captcha yazması gerekiyor. Saldırganı biraz daha yavaşlattık. Artık bilet koduna gerçekten ihtiyacımız yok çünkü kullanıcı çaptcha ile kodu zaten yazmış oluyor. Ama method olarak POST kullanmaya devam ediyoruz.

Fakat yeterli mi ? Maalesef yine hayır. Çünkü Hindistan’da belirli meblağlar karşılığında bu çaptchaları sizin için okuyan bir takım çeteler var. Evet şaka değil insanlar size tam anlık olmasa da bu verileri okuyup para karşılığı gönderiyor. Bu yüzden kendiniz çaptcha üretmek yerine pek çok sitede gördüğünüz çaptcha servislerini kullanmanızı tavsiye ederim. Zira bu servisler sizin fazladan kod yazmanızı gerektirmeden çaptchayı deneme sayısını arttıran kullanıcı için zorlaştırıyorlar. Örneğin ilk denemesinde sadece çaptcha kutusunu işaretleten servis zamanla resim hatta ses dinleterek çaptcha onay aşamasını uzatıyor. Tabi siz de her denemede çaptcha karakterini uzatabilirdiniz ama bu sefer de başka yerlerde bolca deneme yapmış şüpheli bir kullanıcıya işin başında zor bir çaptcha sunmak için nedeniniz olmayacaktı. İşte bu servisler vpn kullanan, cookie kabul eden, virtual browser kullanan kullanıcıları genel olarak mimleyerek tüm internetin güvenliğine katkıda bulunuyorlar. Servis alternatiflerine bu adresden ulaşabilirsiniz.

Peki işimiz kullanıcı giriş formu ile bitti mi? Maalesef yine hayır. Özellikle XSS açığı bulanan bir websiteniz var ve sitenizde frame kullanımı apaçhe ayarlarınızda açıksa şöyle bir sorununuz daha var demektir. Kullanıcı şifresi değiştirme sorguları. Şöyle ki bir kullanıcınız sitenize giriş yaptı. Bir şekilde saldırgan giriş yapmış bu kullanıcıya kendi sitesini de ziyaret ettirtti. Kendi sitesinden ise daha önce üye olarak sitenizden aldığı parola değiştirme kısmının kodlarını aldı ve JS ile bu kodları masum kullanıcınıza çaktırmadan tetikleyip parolasını kendi belirlediği bir parola ile değiştirdi. Kullanıcımız yazdığınız koda göre logout olabilir ya da oturumu bittiği zaman bir daha siteye giremeyebilir. Çünkü saldırgan çoktan değiştirmiştir şifreyi.

Bu durumda ne yapmalısınız ? Benim önerim ve her zaman yaptığım şey, kullanıcınız yönetici türünde bile olsa profil bilgilerini güncellerken mutlaka şifre sormanız. Bu şekilde parolasını bilmeyen saldırgan parola güncelleme sayfasında işlem yapamayacaktır.

Artık canınız sıkıldı belki ama yine soralım peki bu yeterli mi ? Hayır. Çünkü saldırgan kullanıcı hesabını geçirmekten öte kullanıcı adına çaptcha ya da şifresini oturum sırasında tekrar girmediği yerlerde POST işlemleri yapabilir. Örneğin kullanıcılar arası mesajlaşma imkanı olan bir sitede bir kullanıcıdan diğerine mesaj göndererek spam sayfasına link gönderebilir. Bu durumda en önemli güvenlik tedbiri XSS açıklarını kapattığınıza emin olmaktır. XSS ile ilgili yazım için buraya tıklayabilirsiniz. 

CSRF saldırıları ile ilgili yeni bilgiler edinirsem bu blog kapsamında paylaşmaya devam edeceğim. Herkese iyi çalışmalar…