CSRF Saldırılarını Anlama ve CSRF Güvenlik Açıklarını Kilitleme
Yayınlanan: 2022-11-21Web güvenlik açıkları çok yaygın ve sürekli artıyor. Kullanıcılarınızın güvenliğini ve gizliliğini korumak her zamankinden daha önemli. Web güvenlik açıklarını ele almamak, itibarınızın zedelenmesine ve düzenleyiciler tarafından ağır para cezalarına yol açabilir ve ayrıca kullanıcılarınızın güvenini kaybedersiniz.
Web siteleri ve web uygulamaları kötü amaçlı yazılımlara, istenmeyen e-postalara ve diğer saldırılara karşı savunmasızdır — bu makale böyle bir saldırı vektörüne, Siteler Arası İstek Sahteciliği (CSRF) saldırılarına odaklanmaktadır. CSRF saldırıları, kullanıcının bilgisi dışında meydana gelebildikleri için özellikle rahatsız edicidir. Kötü amaçlı istekler gerçek isteklere oldukça benzer göründüğünden, bir geliştiricinin veya web sitesi sahibinin bunları tespit etmesi de zordur.
Bu makale bir CSRF saldırısını, nasıl çalıştığını ve buna hazırlanmak için atabileceğiniz adımları incelemektedir.
CSRF Saldırısı Nedir?
CSRF saldırısı olarak da bilinen Siteler Arası İstek Sahteciliği saldırısı, kimliği doğrulanmış bir kullanıcıyı, farkında olmadan kötü niyetli istekler göndererek istenmeyen eylemler gerçekleştirmesi için kandırır.
Tipik olarak, bir CSRF saldırısı, saldırgan bir yanıt almadığından durum değiştiren istekleri içerir. Bu tür taleplere örnek olarak bir kaydın silinmesi, bir şifrenin değiştirilmesi, bir ürünün satın alınması veya bir mesaj gönderilmesi verilebilir. Bunların hepsi kullanıcının bilgisi olmadan gerçekleşebilir.
Kötü niyetli saldırgan, şüphelenmeyen bir kullanıcıya sohbet veya e-posta yoluyla bir bağlantı göndermek için genellikle sosyal mühendisliği kullanır.
Kullanıcı bağlantıyı tıkladığında, saldırganın belirlediği komutları yürütür.
Örneğin, bir bağlantıya tıklamak bir kullanıcının hesabından para transferi yapabilir. Veya bir kullanıcının e-posta adresini değiştirerek hesap erişimini geri kazanmasını engelleyebilir.
Bir CSRF Saldırısı Nasıl Çalışır?
Kullanıcının oturum açmış durumdayken durum değiştirme isteği başlatmasını sağlamak, bir CSRF saldırısındaki ilk ve en önemli adımdır. CSRF saldırıları ile saldırgan, kimliği doğrulanmış bir kullanıcının bilmeden bir web sitesine veya web uygulamasına kötü amaçlı bir web isteği göndermesini sağlamayı amaçlar. Bu istekler, çerezlerden, URL parametrelerinden ve kullanıcıya normal görünen diğer veri türlerinden oluşabilir.
Bir CSRF saldırısının başarılı olabilmesi için aşağıdaki koşulların gerçekleşmesi gerekir:
- Kimliği doğrulanmış bir kullanıcının, oturum yönetimi için tanımlama bilgileri kullanan bir web uygulamasında oturum açmış olması gerekir.
- Saldırganın durum değiştiren sahte bir istek oluşturması gerekir.
- Hedef sunucu tarafından işlenen orijinal istekler, öngörülemeyen parametreler içermemelidir. Örneğin, istek, durum değiştirme isteğini başlatmadan önce doğrulama amacıyla parametre olarak bir parola beklememelidir.
CSRF saldırılarını tamamlamanın en yaygın yöntemi, çerezleri SameSite çerez politikası zayıf olan uygulamalarda kullanmaktır. Web tarayıcıları, çerezleri otomatik olarak ve genellikle anonim olarak içerir ve bir alan tarafından kullanılan çerezleri, bir kullanıcının o etki alanına gönderdiği herhangi bir web isteğinde kaydeder.
SameSite tanımlama bilgisi ilkesi, tarayıcının siteler arası göz atma bağlamlarında tanımlama bilgisine nasıl davranacağını tanımlar. Sıkı olarak ayarlanırsa çerez, siteler arası göz atma bağlamlarında paylaşılmaz ve CSRF saldırılarını önler. Hiçbiri olarak ayarlanmamışsa, tarayıcı tanımlama bilgisini tüm siteler arası bağlamlara ekler. Bu, uygulamayı CSRF saldırılarına karşı savunmasız bırakır.
Bir kullanıcı bilmeden bir web tarayıcısı aracılığıyla kötü amaçlı bir istek gönderdiğinde, kaydedilen tanımlama bilgileri, isteğin sunucuya meşru görünmesine neden olur. Sunucu daha sonra kullanıcının hesabını değiştirerek, oturum durumunu değiştirerek veya istenen verileri döndürerek isteğe yanıt verir.
Biri GET isteği, diğeri POST isteği olan iki CSRF saldırı yolu örneğine daha yakından bakalım.
GET İsteği için CSRF
İlk olarak, bir finansal bankacılık web uygulaması tarafından kullanılan ve saldırının bir GET isteğinden ve hiper bağlantı tesliminden yararlandığı bir GET isteğini ele alalım.
Para transferi için GET talebinin şöyle göründüğünü varsayalım:
GET https://xymbank.com/online/transfer?amount=1000&accountNumber=547895 HTTP/1.1
Yukarıdaki orijinal talepte, kullanıcı, satın alınan ürünler için ödeme olarak 547895
bir hesaba 1.000 ABD doları aktarmayı talep etmektedir.
Bu istek açık, basit ve pratik olsa da hesap sahibini bir CSRF saldırısına maruz bırakır. Bunun nedeni, isteğin bir saldırganın bilmeyebileceği ayrıntıları gerektirmemesidir. Bu nedenle, bir saldırı başlatmak için, bir saldırganın yürütülebilir bir sahte istek oluşturmak için yalnızca bu isteğin parametrelerini (miktar ve hesap numarası) değiştirmesi gerekir.
Kötü niyetli istek, devam eden tanımlama bilgileriyle yönetilen oturumları olduğu sürece bankanın herhangi bir kullanıcısı üzerinde etkili olacaktır.
Bir bilgisayar korsanının hesabına (burada, numara 654585
) 500 ABD doları transfer etmeye yönelik sahte istek şu şekilde görünür. Açıklama için aşağıdaki örneğin bir CSRF saldırısında yer alan adımların oldukça basitleştirilmiş bir versiyonu olduğunu unutmayın.
GET https://xymbank.com/online/transfer?amount=500&accountNumber=654585 HTTP/1.1
Bu işlem tamamlandıktan sonra saldırgan, kullanıcıyı çevrimiçi bankacılık uygulamasında oturum açmış durumdayken bu talebi göndermesi için kandırmanın bir yolunu bulmalıdır. Bunu yapmanın yollarından biri, kullanıcının dikkatini çeken zararsız bir köprü oluşturmaktır. Bağlantı şöyle görünebilir:
<a href="https://xymbank.com/online/transfer?amount=500&accountNumber=654585">Click here to get more information</a>.
Saldırgan, hedeflerinin doğru e-posta adreslerini bulduğuna göre, bunu e-posta yoluyla birçok banka müşterisine gönderebilir. Oturum açmışken bağlantıya tıklayanlar, oturum açmış hesaptan saldırgana 500$ gönderme isteğini tetikler.
POST İsteği için CSRF
Aynı finans kuruluşunun yalnızca POST isteklerini kabul etmesi durumunda nasıl bir CSRF deneyimi yaşayacağını görelim. Bu durumda, GET isteği örneğinde kullanılan köprü teslimi çalışmaz. Bu nedenle, başarılı bir CSRF saldırısı, saldırganın bir HTML formu oluşturmasını gerektirir. Satın alınan bir ürün için 1.000 ABD doları göndermeye yönelik gerçek istek şu şekilde görünür:
POST /online/transfer HTTP/1.1 Host: xymbank.com Content-Type: application/x-www-form-urlencoded Cookie: session=FRyhityeQkAPzeQ5gHgTvlyxHJYhg amount=1000 account=547895
Bu POST isteği, kullanıcının kimliğini, göndermek istediği miktarı ve göndermek istediği hesabı belirlemek için bir çerez gerektirir. Saldırganlar, bir CSRF saldırısı gerçekleştirmek için bu talebi değiştirebilir.
Saldırganın, sunucunun aktarımı işlemesi için sahte bir isteğe yalnızca gerçek bir tanımlama bilgisi eklemesi gerekir. Bunu, kullanıcıyı şuna benzeyen tetikleyici bir web sayfasına götüren zararsız görünen bir köprü oluşturarak yapabilirler:
<html> <body> <form action="https://xymbank.com/online/transfer" method="POST"> <input type="hidden" name="amount" value="500"/> <input type="hidden" name="account" value="654585" /> </form> <script> document.forms[0].submit(); </script> </body> </html>
Miktar ve hesap parametrelerini yukarıdaki formda zaten ayarladık. Kimliği doğrulanmış bir kullanıcı sayfayı ziyaret ettiğinde, tarayıcı isteği sunucuya iletmeden önce oturum çerezini ekler. Sunucu daha sonra bilgisayar korsanının hesabına 500 $ iletir.
CSRF Saldırılarını Azaltmanın 3 Yolu
Web sitenizdeki veya web uygulamanızdaki olası CSRF saldırılarını önlemenin ve büyük ölçüde azaltmanın birkaç yöntemi vardır:
- CSRF belirteçlerini kullanma
- Yönlendiren başlığını kullanma
- Kinsta gibi güvenlik odaklı bir barındırma çözümü seçme
CSRF Jetonlarını Kullanarak CSRF Saldırılarını Önleme
CSRF güvenli bir web sitesi, her oturuma benzersiz bir belirteç atar ve bunu sunucu tarafı ve istemci tarayıcısı ile paylaşır. Bir tarayıcı hassas bir istek gönderdiğinde, sunucu bunun atanan CSRF belirtecini içermesini bekler. Yanlış jetona sahipse, sunucu onu düşürür. CSRF belirteci, güvenlik amacıyla müşterinin tarayıcısındaki oturum çerezlerinde saklanmaz.
CSRF Jetonlarının Potansiyel Güvenlik Açıkları
CSRF belirteçleri mükemmel bir güvenlik önlemi olsa da, bu yöntem saldırılara dayanıklı değildir. CSRF belirteçlerine eşlik eden bazı güvenlik açıkları şunları içerir:
- Doğrulama atlaması — Bazı uygulamalar, bir belirteç bulamazlarsa doğrulama adımını atlar. Saldırgan belirteç içeren koda erişim kazanırsa, bu belirteci kaldırabilir ve bir CSRF saldırısını başarıyla gerçekleştirebilir. Dolayısıyla, bir sunucuya yönelik geçerli bir istek şuna benziyorsa:
POST /change_password POST body: password=pass123&csrf_token=93j9d8eckke20d433
Saldırganın saldırıyı gerçekleştirmek için yalnızca belirteci kaldırması ve şu şekilde göndermesi gerekir:
POST /change_password POST body: password=pass123
- Havuzlanmış belirteçler — Bazı uygulamalar, bir oturuma belirli bir belirteç atamak yerine kullanıcı oturumlarını doğrulamak için bir belirteç havuzu tutar. Saldırganın, site kullanıcılarının kimliğine bürünmek için yalnızca havuzda bulunan belirteçlerden birini alması gerekir.
Saldırgan, aşağıdakiler gibi bir belirteç elde etmek için hesabını kullanarak bir uygulamada oturum açabilir:
[application_url].com?csrf_token=93j9d8eckke20d433
Belirteçler havuzda toplandığından, saldırgan aynı belirteci kopyalayıp farklı bir kullanıcı hesabında oturum açmak için kullanabilir, çünkü siz onu tekrar kullanacaksınız:
- CSRF'ler, tanımlama bilgisine belirteç kopyalanabilir — Bazı uygulamalar, bir belirteçle ilgili parametreleri bir kullanıcının tanımlama bilgisine kopyalar. Bir saldırgan böyle bir tanımlama bilgisine erişim kazanırsa, kolayca başka bir tanımlama bilgisi oluşturabilir, bunu bir tarayıcıya yerleştirebilir ve bir CSRF saldırısı gerçekleştirebilir.
Böylece bir saldırgan, hesabını kullanarak bir uygulamada oturum açabilir ve aşağıdakileri görmek için tanımlama bilgisi dosyasını açabilir:
Csrf_token:93j9d8eckke20d433
Daha sonra saldırıyı tamamlamak için başka bir tanımlama bilgisi oluşturmak için bu bilgileri kullanabilirler.
- Geçersiz belirteçler — Bazı uygulamalar, CSRF belirteçlerini bir kullanıcı oturumuyla eşleştirmez. Bu gibi durumlarda, bir saldırgan bir oturuma gerçekten giriş yapabilir, yukarıdakilere benzer bir CSRF belirteci alabilir ve bunu bir kurbanın oturumunda bir CSRF saldırısı düzenlemek için kullanabilir.
Yönlendiren Başlığıyla CSRF Saldırılarını Nasıl Önlersiniz?
CSRF saldırılarını önlemek için başka bir strateji, yönlendiren başlığını kullanmaktır. HTTP'de yönlendiren başlıkları isteklerin kaynağını gösterir. Genellikle analitik, optimizasyon ve günlük kaydı gerçekleştirmek için kullanılırlar.
CSRF saldırılarını önlemek için sunucu tarafında yönlendiren başlıklarının kontrol edilmesini de etkinleştirebilirsiniz. Sunucu tarafı, isteğin kaynak kaynağını kontrol eder ve isteğin hedef kaynağını belirler. Eşleşirlerse, isteğe izin verilir. Bir uyumsuzluk varsa, sunucu isteği bırakır.
Yönlendirme başlıklarını kullanmak, bireysel kullanıcı kimliği gerektirmediği için belirteçleri kullanmaktan çok daha kolaydır.
Yönlendiren Başlığının Potansiyel Güvenlik Açıkları
CSRF belirteçleri gibi, yönlendiren başlıklarının da bazı önemli güvenlik açıkları vardır.
İlk olarak, yönlendiren başlıkları zorunlu değildir ve bazı siteler istekleri onlarsız gönderir. CSRF'nin başlıkları olmayan istekleri işleme politikası yoksa, saldırganlar durum değiştiren saldırıları yürütmek için başlıksız istekleri kullanabilir.
Ek olarak, bu yöntem, yönlendirme politikasının yakın zamanda tanıtılmasıyla daha az etkili hale geldi. Bu belirtim, diğer alanlara URL sızıntısını önleyerek kullanıcılara, yönlendiren başlığındaki bilgiler üzerinde daha fazla kontrol sağlar. Aşağıda gösterildiği gibi, yönlendiren başlık bilgilerinin bir kısmını göstermeyi veya HTML sayfasına bir meta veri etiketi ekleyerek devre dışı bırakmayı seçebilirler:
<meta name="referrer" content="no-referrer">
Yukarıdaki kod, bu sayfadaki tüm istekler için yönlendiren başlığını kaldırır. Bunu yapmak, yönlendiren başlıklarına dayanan uygulamaların böyle bir sayfadan CSRF saldırılarını önlemesini zorlaştırır.
Kinsta, CSRF Saldırılarına Karşı Nasıl Korur?
Yönlendiren başlığını ve CSRF belirteçlerini kullanmaya ek olarak, üçüncü ve çok daha kolay bir seçenek daha var: web siteleriniz ve web uygulamalarınız için Kinsta gibi güvenli bir barındırma hizmeti seçmek, saldırganlar ve kullanıcılarınız arasında çok daha güçlü ve daha güvenli bir bariyer sağlar.
Kinsta'nın Cloudflare entegrasyonu, otomatik yedeklemeler, iki faktörlü kimlik doğrulama ve SSH protokolleri üzerinden SFTP gibi kritik güvenlik özelliklerinin yanı sıra IP tabanlı ve güvenlik duvarı korumasıyla kurumsal düzeyde koruma sağlar.
Spesifik olarak, Kinsta şu anda kötü amaçlı saldırıları önlemeye ve CSRF güvenlik açıklarını arayan belirli olanlar da dahil olmak üzere eklentiler ve temalardaki kimliği doğrulanmamış ciddi güvenlik açıklarıyla başa çıkmaya yardımcı olmak için yaklaşık 60 özel güvenlik duvarı kuralına sahiptir.
Özet
Siteler arası istek sahteciliği (CSRF), kimliği doğrulanmış kullanıcıları istemeden durum değiştiren istekleri başlatmaları için kandıran bir saldırıdır. Geçerli ve sahte durum değiştiren istekler arasında ayrım yapamayan uygulamaları hedeflerler.
CSRF, yalnızca oturum açmış kullanıcıları belirlemek için oturum tanımlama bilgilerine dayanan ve zayıf bir SameSite tanımlama bilgisi politikasına sahip olan uygulamalarda başarılı olabilir. Ayrıca, parolalar gibi bilinmeyen parametreler içermeyen istekleri kabul eden bir sunucuya ihtiyaçları vardır. Bilgisayar korsanları, GET veya POST kullanarak kötü amaçlı saldırılar gönderebilir.
CSRF belirteçlerini kullanmak veya yönlendirme başlığı doğrulamasını zorunlu kılmak bazı CSRF saldırılarını önleyebilse de, her iki önlem de dikkatli olmazsanız önleyici önlemlerinizi işe yaramaz hale getirebilecek potansiyel güvenlik açıklarına sahiptir.
Kinsta gibi güvenli bir barındırma platformuna geçmek, web sitelerinizi veya web uygulamalarınızı CSRF saldırılarına karşı korur. Ayrıca Kinsta'nın Cloudflare ile entegrasyonu, belirli CSRF saldırılarını önler.