SameSite Kısıtlamalarını Atlatmak

breakpoint

Team Member
Katılım
12 Nis 2024
Mesajlar
6
Tepkime puanı
14
Puanları
3
Herkese merhaba! Bu yazımızda SameSite kısıtlamalarından bahsedeceğiz ve bu kısıtlamaları atlatabileceğimiz birtakım yöntemleri inceleyeceğiz. Öncelikle SameSite nedir?

SameSite, 2016 yılında siteler arası isteklerde çerez gönderiminin kontrolünü sağlamak için tanımlanmıştır(RFC 6265bis).
None, Lax ve Strict olarak üç farklı değer alabilir.

None: Siteler arası herhangi bir istekte bu kuralın set edildiği çerezlerin gönderimine izin verilir. Güvenlik önlemi olarak Secure kuralının de beraberinde olması gerekir, aksi halde tarayıcı bu çerezi kabul etmeyecektir. Önemli bir veri barındırmayan çerezler genellikle bu kategoridedir.

Örnek: Reklam için kullanılan izleme çerezleri.

Lax: Siteler arasında bu kuralın set edildiği çerezlerin gönderilebilmesi için iki koşul vardır.
  1. Güvenli istek metotları kullanılmalıdır. GET ve HEAD metotları fonksiyonları sebebiyle "güvenli" olarak kabul edilen metotlardır(RFC 2616).
  2. Top-level navigation sağlanmalıdır. Yani tarayıcıdaki mevcut URL'nin değişmesi gerekmektedir. Örneğin site1.com, site2.com'un içerisinde örneğin iframe'de bulunuyorsa bu çerez gönderilmeyecektir, çünkü top-level navigation sağlanmamıştır.
Örnek: Instagram, Youtube gibi platformlara üçüncü taraf sitelerden yönlendirildiğimizde oturum açmış sayılırız. Bu durumda Lax kuralı kullanılır. Chrome 80 sürümünden itibaren Lax özelliği varsayılan olarak set edilmiştir.

Strict: Siteler arası isteklerde bu kuralın set edildiği çerezlerin gönderilmesine izin verilmez.

Peki SameSite'daki Site kavramı nedir? İki sitenin aynı olduğunu belirleyen unsur URL şeması(scheme) ve Kök Alan Adıdır(Root Domain).

1715952533091.png


Gelin ilk örneğimizi inceleyelim.

1. Lax kısıtlamasını atlatmak
Bu örneğimizde metot kontrolünü geçersiz kılmaya çalışacağız. Lab'da kullanılan tarayıcının Chrome olduğunu belirtelim. Lab'a buradan erişebilirsiniz. Kullanıcı bilgilerimizle giriş yapalım ve Burp aracında takip edelim.
1715952833690.png

Giriş yaptığımızda herhangi bir SameSite çerezi tanımlanmadığını görüyoruz. Bu durumda varsayılan olarak Lax kuralı set edilmiş oluyor. Kullanıcının e-posta adresini değiştirelim.

1715952917943.png


Burp'te ilgili isteği takip ettiğimizde herhangi bir CSRF token tanımlanmadığını gözlemledik. Lax özelliğinin set edildiğini göz önünde bulundurarak e-posta adresini GET metoduyla değiştirmeyi deneyelim.

1715952954663.png


GET isteğine izin verilmiyor. Ancak bazı frameworklerde, örneğin Symfony'de istek metodunu "_method" parametresi ile güncelleyebiliyoruz.
Bu aşamada uygulama'da kullanılan frameworkleri tespit etmemiz büyük önem taşıyor. Framework'e bağlı olarak bu parametre değişiklik gösterebilir.
Metot kontrolünü atlatmak için bazı muhtemel parametreleri buradan inceleyebilirsiniz. Biz örneğimize devam edelim.

1715953172589.png


İlgili parametreyi eklediğimizde isteğin başarılı bir şekilde gerçekleştiğini görüyoruz. O halde exploit sunucumuzda da test edelim.
Aşağıdaki gibi bir script bu örneğimizde yeterli olacaktır. Kullanıcı bu sayfaya giriş yaptığında top-level navigation sağlanmış olacak,
çünkü tanımladığımız url'ye yönlendirilecek.

Kod:
<script>
  document.location = 'https://{site}/my-account/change-email?email={email}%26_method=POST';
</script>

1715953333187.png


Exploit'i kurbana gönderdiğimizde e-posta adresi değişmiş olur ve lab da bu şekilde çözülmüş olur. Farklı bir örneğe geçelim.

2. Strict Kuralını Atlatmak
Strict kuralını hatırlayacak olursak bu özelliğe sahip çerezler yalnızca aynı sitedeyken gönderilir. Bu nedenle önceki örneğimizdeki gibi doğrudan e-posta adresini değiştirmek mümkün değildir. Öncelikle kullanıcı bilgilerimizi girelim ve Burp'te takip edelim.

1715953502325.png


Giriş yaptığımızda oturum çerezinde Strict kuralının set edildiğini görüyoruz. Bu nedenle biz önceki örnekteki gibi bir yönlendirme yaptığımızda oturum çerezi gönderilmeyecektir. E-posta adresimizi değiştirelim.

1715953556807.png

CSRF token tanımlanmadığını tespit ediyoruz. İstek metodunu değiştirmeyi deniyoruz. İsteği Repeater'a gönderiyoruz ve sağ tıklayıp Change request method ile metodu güncelleyip isteği tekrar gönderiyoruz.

1715953615988.png


GET metodunun da kabul edildiğini gözlemledik. İstek başarılı bir şekilde gerçekleşiyor. Peki biz oturum çerezi ile birlikte CSRF atağını nasıl hazırlayabiliriz? Bunun için siteyi daha ayrıntılı incelemekte fayda var.

1715953667666.png


Bir blog sitesiyle karşılaşıyoruz. Gönderileri daha ayrıntılı incelemek için View Post'a tıklıyorum.

1715953698893.png


Gönderilere yorum yapılabildiğini keşfediyoruz. İlgili alanları doldurup bir yorum yazalım ve sonrasında neler olduğunu inceleyelim. Bu istekleri Burp'te de takip etmemiz önemli.

1715953736905.png


Yorumu yaptıktan sonra bir yönlendirme yapıldığını görüyoruz. Bu yönlendirmeyi yaparken özel bir Javascript fonksiyonu kullanılmış. İlgili Javascript kodunu inceleyelim.

1715953776450.png


3 saniye bekledikten sonra ilgili fonksiyon çağırılıyor ve /post/postId adresine yönlendiriliyor. Burada postId, bir önceki isteğimizdeki parametre oluyor. O halde postId değerini manipüle ederek Path Traversal yapabilirsek site içerisinde istediğimiz sayfaya istek gönderebiliriz. Bir önceki isteğimizi Repeater'a gönderelim ve hesap sayfamıza erişmek için postId değerini "../my-account" olarak güncelleyelim. Burada bir üst dizine çıkıyoruz çünkü halihazırda /post dizini altındaydık.

1715953868700.png


postId değerimizi güncelledik ve hesap sayfamıza erişebildik. Bu aşamada Strict kuralının hiçbir anlamı kalmıyor, çünkü site içerisinde ikinci bir isteği de gerçekleştirebiliyoruz. İkinci istek aynı site içerisinde olduğundan oturum çerezi de set edilmiş oluyor. O halde exploit sunucumuza gidelim ve payload yazalım.

1715953931593.png


Kod:
<script>
  document.location = 'https://{site}/post/comment/confirmation?postId=../my-account/change-email?email={email}%26submit=1';
</script>

GET metoduyla e-posta adresimizi değiştirebiliyorduk ve bunu kullandık. Exploit'i kullanıcıya gönderiyoruz ve bu lab da çözülmüş oluyor. Burada "submit" parametresini de belirtebilmek için "&" sembolünü kullanıyoruz fakat url encoded olarak göndermekte fayda var. Bu şekilde sitedeki redirect özelliğini kullanarak ikinci isteği gerçekleştirebiliyoruz ve böylece Strict kuralını atlatabiliyoruz.

Okuduğunuz için teşekkürler, bir sonraki yazımızda görüşmek üzere!
 
bu tarz eğitim amaçlı bilgileri youtube serisi olarak da eklerseniz çok güzel olur. teşekkürler <3
 
Geri
Üst