CSRF'yi derinlemesine anlamak
Cross-Site Request Forgery (CSRF) saldırılarına ilişkin derinlemesine bir araştırma sunar, mekaniklerini açıklar, örnekler gösterir ve web uygulaması güvenliğini artırmak için çeşitli önleme yöntemlerini detaylandırır.
Web geliştirme üzerinde çalışırken, özellikle çerezlerle, sık sık "bu ayar CSRF'yi önlemeye yardımcı olur" gibi ifadeler duyuyoruz. Ancak, birçok kişi "CSRF"nin gerçekten ne anlama geldiği konusunda sadece belirsiz bir fikre sahiptir.
Bugün, yaygın bir web güvenlik açığı olan CSRF (Cross-Site Request Forgery)'yi derinlemesine inceleyeceğiz. Bu, CSRF ile ilgili sorunları daha etkili bir şekilde ele almamıza yardımcı olacak.
CSRF nedir?
CSRF (Cross-Site Request Forgery), saldırganların kimliği doğrulanmış kullanıcıları, istenmeyen eylemleri gerçekleştirmeleri için kandırdığı bir tür web saldırısıdır. Basit terimlerle, bu, "hackerlerin, yetkisiz eylemler gerçekleştirmek için kullanıcı gibi davranmaları"dır.
CSRF nasıl çalışır?
CSRF'yi anlamak için birkaç temel kavramı kavramamız gerekiyor:
Tarayıcının Aynı Köken politikası
Aynı köken politikası, bir belgenin veya betiğin bir kökenden diğer kökene kaynaklarla nasıl etkileşime girebileceğini sınırlayan tarayıcıdaki bir güvenlik özelliğidir.
Bir köken, bir protokol (HTTP veya HTTPS gibi), alan adı ve bağlantı noktası numarasından oluşur. Örneğin, https://example.com:443
bir kökendir, https://demo.com:80
ise başka bir kökendir.
Aynı köken politikası, farklı kökenlerden sayfalar arasında veri erişimini kısıtlar, yani:
- Bir kökenin JavaScript'i başka bir kökenin DOM'unu okuyamaz
- Bir kökenin JavaScript'i başka bir kökenin Çerezini, IndexedDB'sini veya localStorage'unu okuyamaz
- Bir kökenin JavaScript'i başka bir kökene AJAX istekleri gönderemez (CORS kullanılmadıkça)
Ancak, Web'in açıklığı ve birlikte çalışabilirliğini korumak için (CDN'lerden kaynak yüklemek veya üçüncü taraf API'larına istek göndermek gibi), aynı köken politikası çapraz köken ağ isteklerini sınırlamaz:
- Sayfalar herhangi bir kökene GET veya POST istekleri gönderebilir (resim yüklemek veya formlar göndermek gibi)
- Herhangi bir kökenden kaynaklar içe aktarılabilir (
<script>
,<img>
,<link>
,<iframe>
etiketleri gibi)
Otomatik çerez gönderme mekanizması
Otomatik çerez gönderme mekanizması, tarayıcıların önemli bir özelliğidir. Bir tarayıcı bir etki alanına bir istek gönderdiğinde, otomatik olarak o etki alanının tüm çerezlerini ekler. Bu işlem otomatik olup, herhangi bir JavaScript kodu veya kullanıcı etkileşimi gerektirmez.
Bu mekanizma, web sitelerinin kullanıcıların oturum açma durumlarını kolayca hatırlamasına olanak tanır çünkü her istek otomatik olarak kullanıcının kimlik bilgilerini taşır.
Kalın
Örneğin, bir bankanın web sitesine (bank.com
) giriş yaptığınızda bir kimlik çerezi alırsınız ve ardından hesabınızı görüntülemek için tıkladığınızda, tarayıcı otomatik olarak bank.com
ile eşleşen tüm çerezleri bulur ve bu isteğe ekler. Bankanın sunucusu bu sayede backend'den sizi tanımlayabilir ve hesap bilgilerinizi döndürebilir.
CSRF saldırı adımları
-
Kullanıcı hedef web sitesine giriş yapar (bir bankanın sitesi gibi) ve bir kimlik doğrulama çerezi alır. Bu adım, otomatik çerez gönderme mekanizmasını kullanır. Banka sitesi bir kimlik doğrulama çerezi ayarladıktan sonra, tarayıcı bu çerezi o siteye gönderilen her isteğe otomatik olarak ekleyecektir.
-
Kullanıcı çıkış yapmaksızın zararlı bir web sitesini ziyaret eder. Bu noktada, aynı köken politikası nedeniyle, zararlı site doğrudan banka sitesinin çerezini okuyamaz veya değiştiremez. Bu, kullanıcı kimlik bilgilerini doğrudan çalınmaktan korur.
-
Zararlı site hedef siteye bir istek ekler (bir transfer işlemi gibi). Aynı köken politikası çapraz köken erişimini kısıtlasa da,
<img>
,<form>
etiketleri aracılığıyla başlatılan istekler gibi çapraz köken ağ isteklerine izin verir. Saldırganlar bu "açığı" kullanırlar. -
Kullanıcının tarayıcısı bu isteği otomatik olarak hedef sitenin çerezi ile birlikte gönderir. Bu, CSRF saldırısının özüdür. Hem çapraz köken isteklerine izin veren aynı köken politikasından hem de otomatik çerez gönderme mekanizmasından faydalanır (zararlı siteler tarafından tetiklenen istekler bile alanla eşleşen çerezleri taşır).
-
Hedef site isteği alır, çerezin geçerli olduğunu doğrular ve işlemi gerçekleştirir. Sunucu bu isteğin meşru bir kullanıcı eyleminden gelip gelmediğini söyleyemez çünkü eklenen çerez geçerlidir.
CSRF saldırı örneği
CSRF saldırısının nasıl meydana geldiğini belirli bir örnekle açıklayalım. Kurgusal bir banka web sitesi bank.com
u örnek olarak kullanacağız.
Öncelikle kullanıcı https://bank.com
u ziyaret eder ve hesabına giriş yapar.
Başarılı girişten sonra sunucu bir kimlik doğrulama çerezi ayarlar, örneğin:
Kullanıcı banka web sitesinde bir transfer işlemi gerçekleştirir, örneğin Ali'ye 1000 $ transfer eder. Bu işlem şu şekilde bir istek gönderebilir:
Şimdi, bir saldırgan https://evil.com
adlı zararlı bir web sitesi oluşturursa ve aşağıdaki HTML'i içerirse:
Kullanıcı https://evil.com
bağlantısına tıkladığında banka hesabından çıkış yapmadan, çünkü zaten bank.com
a giriş yapmış durumdadır, tarayıcıda geçerli bir session_id
çerezi bulunmaktadır.
Kötü niyetli sayfa yüklendikten sonra, gizli formu otomatik olarak gönderir ve https://bank.com/transfer
e bir transfer isteği gönderir.
Kullanıcının tarayıcısı bu isteğe otomatik olarak bank.com
çerezi ekler. bank.com
sunucusu isteği alır, çerezin geçerli olduğunu doğrular ve bu izinsiz transfer işlemini gerçekleştirir.
CSRF saldırılarını önlemenin yaygın yöntemleri
İşte birkaç yaygın kullanılan CSRF savunma yöntemi. Her bir metodun prensibini ve CSRF saldırılarını nasıl etkili bir şekilde önlediğini ayrıntılı bir şekilde açıklayacağız:
CSRF tokenleri kullanmak
CSRF tokenleri, CSRF saldırılarına karşı savunmanın en yaygın ve etkili yöntemlerinden biridir. İşte nasıl çalıştıkları:
- Sunucu her oturum için benzersiz, tahmin edilemeyen bir token oluşturur.
- Bu token, hassas işlemler için tüm formlara gömülür.
- Kullanıcı bir form gönderdiğinde, sunucu tokenin geçerliliğini doğrular.
CSRF tokeni, kullanıcının oturumuna bağlı benzersiz bir değer olduğundan ve saldırgan bu değeri bilemez veya tahmin edemez (her oturum için farklı olduğundan), kullanıcıyı bir isteği göndermeye kandırsa bile istek, geçerli CSRF tokeni olmadığı için sunucu tarafından reddedilecektir.
Uygulama örneği:
Sunucu tarafında (Node.js ve Express kullanarak):
Ön uç JavaScript kodunda:
Referer
başlığını kontrol etme
Referer
başlığı, isteği başlatan sayfanın URL'sini içerir. Referer
başlığını kontrol ederek, sunucu isteğin meşru bir kaynaktan gelip gelmediğini belirleyebilir.
CSRF saldırıları genellikle farklı alanlardan geldiğinden, Referer
başlığı saldırganın alan adını gösterecektir. Referer
'ın beklenen değer olup olmadığını doğrulamaya çalışarak, bilinmeyen kaynaklardan gelen istekler engellenebilir.
Ancak, bu yöntemin tamamen güvenilir olmadığını belirtmek gerekir, çünkü bazı tarayıcılar Referer
başlığını göndermeyebilir ve kullanıcılar tarayıcı ayarları veya eklentiler aracılığıyla Referer
başlığını devre dışı bırakabilir.
Uygulama örneği:
SameSite
çerez niteliğini kullanma
SameSite
, çerezlerin çapraz site istekleriyle birlikte gönderilip gönderilmeyeceğini kontrol etmek için kullanılan bir çerez niteliğidir. Üç olası değeri vardır:
Strict
: Çerezler yalnızca aynı site isteklerinde gönderilir.Lax
: Çerezler aynı site isteklerinde ve üst düzey gezinmelerde gönderilir.None
: Çerezler tüm çapraz site isteklerinde gönderilir (bu,Secure
niteliğiyle birlikte kullanılmalıdır).
SameSite
özelliği Strict
olarak ayarlandığında, üçüncü taraf sitelerin çerez göndermesini tamamen engelleyebilir, böylece CSRF saldırılarını etkili bir şekilde önler.
SameSite
Lax
olarak ayarlandığında, hassas işlemleri korurken, dış bağlantılardan bir web sitesine girmek gibi bazı yaygın çapraz site kullanım durumlarına izin verir.
Uygulama örneği:
Özel istek başlıkları kullanma
AJAX istekleri için özel istek başlıkları eklenebilir. Aynı köken politikası kısıtlamaları nedeniyle, saldırganlar çapraz köken isteklerinde özel başlıklar ayarlayamaz. Sunucu, bu özel başlığın varlığını kontrol ederek isteğin meşruiyetini doğrulayabilir.
Uygulama örneği:
Ön uçta:
Sunucu tarafında:
Çift çerez doğrulaması
Çift çerez doğrulaması etkili bir CSRF savunma tekniğidir. Temel prensibi, sunucunun rastgele bir token oluşturması, bunu hem çerez olarak ayarlaması hem de sayfaya (genellikle gizli bir form alanı olarak) gömmesidir. Tarayıcı bir istek gönderdiğinde, otomatik olarak çerezi eklerken, sayfanın JavaScript'i isteğe bir parametre olarak token gönderir. Sunucu daha sonra çerezdeki tokenin istekteki parametrelerdeki token ile eşleşip eşleşmediğini doğrular.
Saldırganlar hedef web sitesinin çerezini çapraz site isteklerine dahil edebilseler de, çerezin değerini okuyamaz veya değiştiremezler, sayfadaki token değerine erişemez veya bunu değiştiremezler. Hem çerezden hem de parametrelerden gelen tokenleri içermesi gereken bir istek yaparak, isteğin çerezi okumak için izne sahip bir kaynaktan geldiğini garanti eder, böylece CSRF saldırılarına karşı etkili bir şekilde savunma sağlar.
Hassas işlemler için yeniden kimlik doğrulama kullanma
Özellikle hassas işlemler için (şifre değiştirme veya büyük transferler gibi) kullanıcıların yeniden kimlik doğrulamaları istenebilir. Bu, kullanıcılara ek bir güvenlik kontrol noktası sağlar. Kullanıcı, başarılı bir şekilde bir CSRF saldırısını başlatsa bile, yeniden kimlik doğrulama adımını geçemez.
Uygulama önerileri:
- Hassas işlemleri gerçekleştirmeden önce, ayrı bir kimlik doğrulama sayfasına yönlendirin.
- Bu sayfada, kullanıcıdan şifrelerini veya diğer kimlik doğrulama bilgilerini girmeleri istenebilir.
- Doğrulama geçtikten sonra, bir kerelik bir token oluşturun ve bu tokeni sonraki hassas işlemlerde kullanın.
Özet
Bu derinlemesine tartışma sayesinde, CSRF saldırılarına daha kapsamlı bir bakış açısına sahip olmanızı umuyoruz. CSRF'nin nasıl çalıştığını öğrenmenin yanı sıra, çeşitli etkili savunma yöntemlerini de araştırdık. Tüm bu yöntemler, web uygulamalarının güvenliğini etkili bir şekilde artırabilir.
Umarız bu bilgiler, günlük gelişim çalışmalarınızda CSRF ile ilgili sorunları daha iyi ele almanıza ve daha güvenli web uygulamaları geliştirmenize yardımcı olur.