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


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

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


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


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


İ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


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


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

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


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


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

1715953698893


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


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


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


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


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