Güncelleme: Güvenlik araştırmacıları Sirdarckcat ve Gareth, burada saf bir CSS tabanlı CSRF belirteç bulucu kodunu paylaşacak kadar naziktiler. Bu, hem JS hem de CSS'nin bir kombinasyonunu kullanan aşağıdaki PoC'mdan daha gizlidir. Bu nedenle, javascript'i devre dışı bıraksanız ve artık güvende olmasanız bile çalışmaya devam eder . Bu PoC'yi istemciye daha duyarlı hale getirmek için, import komutunu kullanarak birden çok CSS stil sayfası kullanmanız gerekir. Bu saf CSS tabanlı yaklaşımla gördüğüm tek sorun, büyük anahtar alanlarla ilgili ağ gecikmesi olacak çünkü büyük CSS stil sayfanızın tarayıcınız tarafından indirilmesi gerekecek.
Siteler Arası Talep Sahteciliği problemini ve Endüstride kullanılan mevcut azaltma stratejilerini düşünüyordum. Şimdiye kadar test ettiğim gerçek dünya uygulamalarının çoğunda, url'nin bir parçası olarak eklenen rastgele belirteçlerin kullanımını görüyorum. İstek herhangi bir belirteç sağlayamazsa veya yanlış değere sahip bir belirteç sağlayamazsa, istek reddedilir. Bu, CSRF'yi veya herhangi bir etki alanları arası yetkisiz işlev yürütmesini engeller.
Şimdiye kadar, bir saldırganın CSRF jetonunuzu sunucudaki Brute Force Saldırılarını kullanarak bulması olanaksız olarak kabul edildi.
Sebepleri:
- Üretir ağda çok fazla gürültü var ve yavaş. Bu yüzden büyük olasılıkla bir IDS veya Web App Güvenlik Duvarı kötü niyetli davranışı alacak ve ip'inizi engelleyecektir. Örneğin, 5 karakter uzunluğunda (karakterle başlayan) bir Base16 CSRF jetonu yaklaşık 393,216 istek oluşturur.
- Birçok uygulama şu şekilde programlanmıştır: oturumunu geçersiz kıl geçersiz belirteç değerleri olan belirli bir sayıdan fazla istek algıladıktan sonra. Örneğin. 30.
Uyarı oluşturmadan csrf jetonlarını hızlı bir şekilde bulmak için bir teknik göstererek bu inancı değiştireceğim. Bu teknik bir istemci tarafı saldırı, bu yüzden neredeyse hiç ağ trafiği oluşmaz ve bu nedenle sunucunuz ve IDS / Web App Güvenlik Duvarları kazanılır’hiç farketmez. Bu saldırı 3 yıl önce Jeremiah Grossman tarafından bulunan popüler CSS Tarih Hack dayanmaktadır.
Bu istismarda, tarayıcı geçmişinde çeşitli URL'leri zorlayarak kaba csrf jetonunu keşfediyoruz. URL'nin bir parçası olarak farklı csrf jeton değerlerini gömmeye çalışacağız ve kullanıcının bu URL'yi ziyaret edip etmediğini kontrol edeceğiz. Evetse, kullanıcının geçerli etkin oturumda aynı CSRF jetonunu kullanması veya bu jetonu önceki bir oturumda kullanmış olması ihtimali yüksektir. Bu tür tüm jetonların bir listesine sahip olduktan sonra, bu küçük listeyi kullanarak sunucudaki csrf saldırımızı deneyebiliriz. Şu anda bu saldırı 5 karakter veya daha kısa jetonlar için mümkündür. Uzunluğu 5 olan bir base16 dizesinde denedim ve tüm anahtar alanı 2 dakikadan daha az bir sürede zorlayabildim.
Bu saldırının çalışması için önkoşullardan bazıları
- CSRF jetonu belirli bir kullanıcı oturumu için aynı kalır. Örneğin. csrf belirteci = karma (oturum_kimliği) VEYA
- Aynı oturum için eski formlarda gönderilen CSRF jetonu kabul edilir. Çoğu zaman, kullanıcı deneyimini geliştirdiği ve ileri ve geri tarayıcı düğmelerinin kullanılmasına izin verdiği için durum böyledir.
Kavramın ispatı burada mevcut.
PoC'yi çalıştırmadan önce, url ve csrftoken paramater değerlerini değiştirmeniz gerekir.
Varsayılanları kullanarak test etmek için önce aşağıdaki URL'lerden birini ziyaret etmeniz gerekir; ör..
- https://securethoughts.com/?param1=val1&csrftoken = b59fe [b59fe'yi bir karakterle başlayan herhangi bir 5 basamaklı temel 16 dizeyle değiştirin, yani a0000'den daha büyük]
- http://tinyurl.com/l2lwgd [önceki URL'ye 301 yönlendirmesi olan].
Not: http://www.securethoughts.com ve https://securethoughts.com tarayıcı geçmişinde saklanırken farklı şekilde ele alınır.
Örnek bir çalışma şöyle görünecektir -
Bu saldırıyı mümkün kılmak için,
Sunucu Tarafı Çözümü (geliştiriciler için):
- CSRF jetonlarınızı MÜŞTERİ TARAFI saldırısı için mümkün olmayacak kadar uzun (8 veya daha fazla karakter) yapın. Sürekli artan işlem gücü, bu saldırıyı daha uzun jetonlar için de mümkün kılacak.
- CSRF simgenizi URL koymak yerine gizli form alanının bir parçası olarak saklayın.
- Her form gönderimi için farklı bir rastgele belirteç kullanın ve aynı oturum için bile kullanılmayan belirteçleri kabul etmeyin.
İstemci Tarafı Çözümü (müşterileriniz / kullanıcılarınız için):
- Ziyaret edilen bağlantı tabanlı izleme tekniklerine karşı savunma yapan SafeHistory gibi bir tarayıcı eklentisi kullanın.
- Tarayıcınızda özel tarama modunu kullanın.
Ve son olarak, ama en önemlisi, XSS mümkün olan tüm CSRF korumalarını yok eder. Yani, önce XSS'den kurtulun.
Yeremya'ya bu yazı hakkındaki görüşlerini bildirdiği için teşekkür etmek istiyorum.