Cross-Site Request Forgery (CSRF) Zafiyeti

Yayınlayan
Editör
Yayınlanma tarihi
26/2/2022
Okuma süresi
10
Dakika
go back icon
Geri Dön

Cross-Site Request Forgery (CSRF) Zafiyeti

CSRF (Cross Site Request Forgery) yani Türkçe karşılığı ile Siteler Arası İstek Sahtekarlığı,  herhangi bir web uygulamasında oturum açmış bir kullanıcının oturumunu kullanarak kullanıcının istekleri dışında işlemler yapılmasıdır.

Uygulamaya giden isteklerin hangi kaynaktan ve nasıl gönderildiğinin kontrol edilmeyen sistemlerde bu zafiyet meydana gelir. Saldırganların kullanıcının oturumuna erişebilmeleri için sadece phising saldırılarına gerek yoktur kullanıcının zararlı bağlantıya tıklaması yeterlidir.

Yani günün sonunda saldırgan, son kullanıcının haberi olmadan onun kullandığı uygulamaya farklı işlemler ile müdahale edebilir.

Aşağıdaki örnek, web sitesi sahiplerine yorum yapmak için kullanılan basit bir HTML formu içermektedir.

Cross-Site-Request-Forgery-Zafiyeti-3

Daha sonra blogları görüntüle dediğimde “deneme2” olarak açtığım bloğun eklenmiş olduğunu gördüm

Cross-Site-Request-Forgery-Zafiyeti-4

Şimdi en basit yöntem ile HTML enjeksiyon kullanarak sistemdeki CSRF zafiyetini exploit edebilirim.

Bizden blog mesajı istediği girdi alanına yukarıdaki html form kodlarını ekledim ve en aşağı satıra javascript ile bir event yerleştirdim eventin görevi fare her konu üzerine geldiğinde kendi kendine başlık3 adında bir blog daha açacak.

Cross-Site-Request-Forgery-Zafiyeti-5

Yukarıda görüldüğü üzere italik metin parametresi arasına javascript kodumuzu ekledik bu kısımdaki gerçekleştirilen işlem ise fare her “Zafiyet yaratacak başlığımız burada”  başlığına geldiğinde tıklanmasına gerek kalmadan sistemde form ID değeri f olan formu post isteği ile yollayacak böylelikle sürekli başlık3 adında yeni blog oluşacak.

Cross-Site-Request-Forgery-Zafiyeti-5

Blog başlığı üzerine gelindiğinde aşağıda görüldüğü gibi sisteme post metodu ile isteği yolluyor.

Cross-Site-Request-Forgery-Zafiyetİ-6

Blogları görüntülediğimizde yine üzerine geldiğimizde aynı şekilde post metodu ile istek yapıyor.

Cross-Site-Request-Forgery-Zafiyeti-7

Burada token güvenliğinin sağlanmamasından, girdi alanının kontrol edilmemesinden kaynaklı CSRF zafiyetini istismar edebilir hale geliyoruz.  Mağdurlar bloğu ziyaret etmek istediğinde blog eklemek yerine oturumlarını çalabilecek daha tehlikeli kodlar çalıştırılabilir.

CSRF Zafiyetinin Önlenmesi

CSRF zafiyetinin hem kullanıcı hem sistem tarafında alınabileceği önlemleri vardır.

Kullanıcı Tarafındaki Önlemler
  • En önemli ve sürekli ifade edilen önlemlerden bir tanesi olan kaynağın güvenliği doğrulanmamış bağlantılara tıklamamak gerekmektedir. Kimden geldiğinden emin olamadığınız maillerdeki bağlantılara tıklamayınız.
  • Bağlantıları zararlı analiz platformlarında taratarak ve domaini kontrol ederek giriş sağlayınız.
  • Ön belleğe verileri düzenli olarak temizleyiniz. (çerez, site verileri)
Sistem Tarafındaki Önlemler
  • Kullanıcıların gerçekleştirdiği talepler POST metodu ile alınmalıdır.
  • Kullanıcıya özel olarak üretilmiş tokenler ile CSRF in önüne geçilmiş olur. Bu token her işlemde tekrar üretilir ve formda saklanır böylelikle saldırganın bu tokeni tahmin etmesi imkansız hale gelir. Bu kısımda önemli olan şey ise token üretirken doğru bir patern ve güvenilir kriptografi yöntemleri kullanılmasıdır. Birden fazla token yöntemi oluşturma yöntemi vardır.
CSRF Token Nedir?

İlk olarak ifade etmek gerekirse CSRF zafiyetinin önlenmesi açısından en önemli ve popüler yöntemdir.  CSRF Token yöntemi temelde benzersiz ve gizli bir değer alarak formlara gömülen ve bu sayede kullanıcının başarıyla oturum açma işleminden sonra oluşturulan değerdir. Bu değer patern yöntemlerine göre farklı şekillerde saklanabilir. Aşağıda bununla ilgili örnek eklenmiştir.

Cross-Site-Request-Forgery-Zafiyeti-8
Token Patern Yöntemleri
1.CSRF Synchronizer Token Pattern Yöntemi

Her istek için gizli ve benzersiz değer yani token tüm formlara gömülür ve sunucu tarafında işlem yapılır. Genel olarak kullanılan token yöntemidir. Bir giriş formunda post isteği ile kimlik bilgileri gönderilir, kullanıcı başarıyla oturum açarsa benzersiz bir oturum kimliği ve token oluşturulur. Oluşturulan token istemci tarafında çerezlerde saklanır, aynı zamanda sunucu tarafında da tutulur.

Özellikleri
  • Her oturum için özel ve benzersizdir.
  • Yüksek karakter sayısı ile rastgele değer alarak tahmin edilerek bypass edilmesinin önüne geçilir.
  • Doğrulama işleminde başarısız olunduğunda işlem reddedilir.
2.Double Submit Cookie Pattern Yöntemi

Çift çerez gönderme yöntemi hem çerezde hemde istek parametresinde rastgele bir değer gönderme olarak tanımlanabilir. Kullanıcıların oturum açma talebi sistemde doğrulandığında sistem istemci tarafında oturum ID si oluşturur ve çerezlere kaydeder. Bunun yanında token oluşturur ve kullanıcının makinesinde ayrı bir çerez olarak saklar. Sunucunun bu çerezi kaydetmesi gerekmez. Çerezler httponly olarak etiketlenemez.

Bu çerez, istemcilerin buna erişmesi gerektiği için HttpOnly olarak ayarlanamaz, sunucu bu oturum için oluşturulan belirteç kaydına sahip değildir.

Ardından kullanıcı güvenli bir form gönderdiğinde bu token girdi alanlarına gömülür.

Sunucu, form parametresi olarak gönderilen tokeni, çerez değerine bakarak doğrular ve tamamlanacak işlemi yetkilendirir. Çapraz kökenli bir saldırgan, aynı kökenden gelen ilkeye göre sunucudan gönderilen verileri okuyamaz veya çerez değerlerini değiştiremez.

Aşağıda Double Submit Cookie Pattern Yönteminin çalışma mantığı ile ilgili şema eklenmiştir.

Cross-Site-Request-Forgery-Zafiyeti-10

Daha önce iki farklı cookie’nin tutulduğunu söylemiştim bu 2 farklı cookie aşağıdaki gibi saklanmaktadır.

Cross-Site-Request-Forgery-Zafiyeti-11
İki Pattern Yönteminin Karşılaştırılması

İki yöntemde de tasarım ve güvenlik sorunları mevcuttur. Two Cookie pattern yöntemi  Synchronizer Token Pattern  yönteminden daha hafif ve kullanışlıdır.

Double Submit Cookie Pattern Yönteminin Bypass Edilmesi

Bu yöntemin ne olduğunu yukarda anlatmıştım. Şimdi ise bu yöntemin nasıl bypass edilebileceğine değinelim.

Çerez Tespiti

Eğer saldırgan CSRF çerezlerini ayarlayabilirse bypass işlemini gerçekleştirebilir. Çerez tespitinin birden fazla yolu vardır bunlar;

  • Subdomainleri exploit etme.
  • Ortadaki adam saldırısı ile HTTP bağlantıların takibi
Subdomainleri Exploit Etme

İlk atak vektörümüz kötü amaçlarla subdomainlerin kullanılmasıdır. Örneğin example.com domaininin bir subdomainini saldırganların ele geçirdiğini varsayalım. Bu durumda saldırganlar aslında ana domain için çerezleri ayarlayabilir ve bu durumda sunucu tarafında “set cookie” değerini yanıtlayabilir ve kabul edebilirler.

Bu çerezlerin yanıtlanması için belli bir sayfa kullanılır aşağıda görüldüğü üzere submit sayfası ile işlem yapıyor.

Cross-Site-Request-Forgery-Zafiyeti-12

Saldırganlar aşağıda görüldüğü üzere submit adresine gönderilen çerezleri kontrol edebilir ve izleyebilir bir hale geldi.

Cross-Site-Request-Forgery-Zafiyeti-13

Tüm subdomainleri kontrol etmek güvenliği tam olarak sağlamaz çünkü ;

  1. Herhangi bir subdomainde bulunan XSS zafiyetinden yararlanılabilir. Örnek vermek gerekirse aşağıdaki payload yardımıyla CSRF zafiyeti tetiklenebilir.
  1. Çerezler meta tagleri kullanarak oluşturulup kullanılabildiği için meta taglari yardımıyla zafiyet yine tetiklenebilir.

   

Man İn The Middle Saldırısı İle Çerez Tespiti

Saldırganlar çerezlerin üzerine kendi tokenlerini yazabilirler. HTTP ile HTTPS için çerezler oluşturabilir yani güvenli çerezlerin üzerine yazma işlemi gerçekleştirebilirler.

Saldırı Nasıl İşler?

Aşağıya çalışma mantığı şeması eklenmiştir.

Cross-Site-Request-Forgery-Zafiyeti-14

Bugün Cross Site Request Forgery yani CSRF zafiyetinin ortaya çıkma nedenlerinden başlayarak, alınabilecek önlemler, önlem paternleri ve zafiyetin istismarı gibi önemli konu başlıklarını işledik.

Editör

Detaylı Bilgi İçin

info@gaissecurity.com