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.
Daha sonra blogları görüntüle dediğimde “deneme2” olarak açtığım bloğun eklenmiş olduğunu gördüm Ş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. 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. Blog başlığı üzerine gelindiğinde aşağıda görüldüğü gibi sisteme post metodu ile isteği yolluyor. Blogları görüntülediğimizde yine üzerine geldiğimizde aynı şekilde post metodu ile istek yapıyor. 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 hem kullanıcı hem sistem tarafında alınabileceği önlemleri vardır. İ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. 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. Ç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. Daha önce iki farklı cookie’nin tutulduğunu söylemiştim bu 2 farklı cookie aşağıdaki gibi saklanmaktadır. İ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. Bu yöntemin ne olduğunu yukarda anlatmıştım. Şimdi ise bu yöntemin nasıl bypass edilebileceğine değinelim. Eğer saldırgan CSRF çerezlerini ayarlayabilirse bypass işlemini gerçekleştirebilir. Çerez tespitinin birden fazla yolu vardır bunlar; İ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. Saldırganlar aşağıda görüldüğü üzere submit adresine gönderilen çerezleri kontrol edebilir ve izleyebilir bir hale geldi. Tüm subdomainleri kontrol etmek güvenliği tam olarak sağlamaz çünkü ; 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. Aşağıya çalışma mantığı şeması eklenmiştir. 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.
CSRF Zafiyetinin Önlenmesi
Kullanıcı Tarafındaki Önlemler
Sistem Tarafındaki Önlemler
CSRF Token Nedir?
Token Patern Yöntemleri
1.CSRF Synchronizer Token Pattern Yöntemi
Özellikleri
2.Double Submit Cookie Pattern Yöntemi
İki Pattern Yönteminin Karşılaştırılması
Double Submit Cookie Pattern Yönteminin Bypass Edilmesi
Çerez Tespiti
Subdomainleri Exploit Etme
Man İn The Middle Saldırısı İle Çerez Tespiti
Saldırı Nasıl İşler?