# XS-Search/XS-Leaks {{#include ../../banners/hacktricks-training.md}} ## 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ının HTML dışı bir kaynağı talep etmesini zorunlu kılar. Bu amaçla potansiyel HTML elemanlarının bir derlemesi [https://github.com/cure53/HTTPLeaks](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. Sayfa **çerçeve koruması** eksikse, 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 ve 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 bir 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, istenen 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'e karşı tarayıcıları kontrol etmek için** otomatik bir araçtır ve makalesinde açıklanmıştır: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Araca **şu adresten erişebilirsiniz**: [**https://xsinator.com/**](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()](https://developer.mozilla.org/en-US/docs/Web/API/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](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS animasyonları ve diğerleri.\ Daha fazla bilgi için: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). ## Olay İşleyici Teknikleri ### Onload/Onerror - **Dahil Etme Yöntemleri**: Çerçeveler, HTML Elemanları - **Tespit Edilebilir Farklılık**: Durum Kodu - **Daha fazla bilgi**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **Özet**: Bir kaynağı yüklemeye çalışırken, onerror/onload olayları, kaynağın başarıyla/başarısız bir şekilde yüklenmesi durumunda tetiklenir; durum kodunu belirlemek mümkündür. - **Kod örneği**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} cookie-bomb-+-onerror-xs-leak.md {{#endref}} Kod örneği, **JS'den betik nesnelerini yüklemeye** çalışır, ancak **diğer etiketler** (örneğin, nesneler, stil sayfaları, resimler, sesler) 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 bir de betiksiz versiyonu vardır: ```html ``` Bu durumda `example.com/404` bulunamazsa `attacker.com/?error` yüklenecektir. ### Onload Zamanlaması - **Dahil Etme Yöntemleri**: HTML Elemanları - **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle) - **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) - **Özet:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API'si**, bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Ancak, 50ms'den fazla süren görevleri tanımlayabilen [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming) gibi diğer saatler de kullanılabilir. - **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) başka bir örnek: {{#ref}} performance.now-example.md {{#endref}} #### 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. {{#ref}} performance.now-+-force-heavy-task.md {{#endref}} ### unload/beforeunload Zamanlaması - **Dahil Etme Yöntemleri**: Çerçeveler - **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle) - **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Özet:** [SharedArrayBuffer saati](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers), bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Diğer saatler de kullanılabilir. - **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) Bir kaynağı almak için geçen süre, [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) ve [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) olaylarını kullanarak ölçülebilir. **`beforeunload`** olayı, tarayıcının yeni bir sayfaya geçmek üzere olduğu zaman 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 - **Dahil Etme Yöntemleri**: Çerçeveler - **Tespit Edilebilir Fark**: Zamanlama (genellikle Sayfa İçeriği, Durum Kodu nedeniyle) - **Daha fazla bilgi**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Özet:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API'si, bir isteği gerçekleştirmek için ne kadar zaman gerektiğini ölçmek için kullanılabilir. Diğer saatler de kullanılabilir. - **Kod Örneği**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) 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 ` ``` ### #ID + error + onload - **Dahil Etme Yöntemleri**: Frames - **Tespit Edilebilir Fark**: Sayfa İçeriği - **Daha fazla bilgi**: - **Özet**: Sayfa doğru içerik erişildiğinde hata veriyorsa 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. - **Kod Örneği**: Sayfanın **gizli** içeriği **bir Iframe içinde** **eklenebileceğini** varsayalım. Kurbanın **Iframe** kullanarak "_**flag**_" içeren dosyayı **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**. O zaman, erişildiğinde **doğru** yüklenmiş bir sayfa ile **hata** olan bir sayfa arasında **ayrım** yapabilirsiniz. ### Javascript İcra - **Dahil Etme Yöntemleri**: Frames - **Tespit Edilebilir Fark**: Sayfa İçeriği - **Daha fazla bilgi**: - **Özet:** 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 **`