# XS-Search/XS-Leaks
Użyj [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), aby łatwo tworzyć i **automatyzować zadania** za pomocą najbardziej zaawansowanych narzędzi społecznościowych na świecie.\ Otrzymaj dostęp już dziś: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! Inne sposoby wsparcia HackTricks: * Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com) * Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family) * **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na GitHubie.
## Podstawowe informacje XS-Search to metoda wykorzystywana do **wydobywania informacji międzydomenowych** poprzez wykorzystanie podatności kanałów bocznych. Kluczowe składniki zaangażowane w ten atak to: * **Podatna strona internetowa**: Docelowa strona internetowa, z której ma być wydobywana informacja. * **Strona internetowa atakującego**: Złośliwa strona internetowa stworzona przez atakującego, którą odwiedza ofiara, hostująca exploit. * **Metoda włączenia**: Technika stosowana do włączenia Podatnej strony internetowej do Strony internetowej atakującego (np. window.open, iframe, fetch, znacznik HTML z href itp.). * **Technika wycieku**: Techniki używane do rozróżniania różnic w stanie Podatnej strony internetowej na podstawie informacji zebranych za pomocą metody włączenia. * **Stany**: Dwa potencjalne stany Podatnej strony internetowej, które atakujący ma na celu rozróżnienie. * **Rozpoznawalne różnice**: Obserwowalne różnice, na których atakujący polega, aby wnioskować o stanie Podatnej strony internetowej. ### Rozpoznawalne różnice Kilka aspektów można zbadać, aby rozróżnić stany Podatnej strony internetowej: * **Kod stanu**: Rozróżnianie między **różnymi kodami stanu odpowiedzi HTTP** międzydomenowymi, takimi jak błędy serwera, błędy klienta lub błędy uwierzytelniania. * **Użycie interfejsu API**: Identyfikowanie **użycia interfejsów API sieci Web** na stronach, ujawniające, czy strona międzydomenowa korzysta z określonego interfejsu API JavaScript. * **Przekierowania**: Wykrywanie nawigacji do innych stron, nie tylko przekierowań HTTP, ale także tych wywołanych przez JavaScript lub HTML. * **Zawartość strony**: Obserwowanie **różnic w treści odpowiedzi HTTP** lub w podzasobach strony, takich jak **liczba osadzonych ramek** lub różnice w rozmiarze obrazów. * **Nagłówek HTTP**: Zauważanie obecności lub możliwej wartości **konkretnego nagłówka odpowiedzi HTTP**, w tym nagłówków takich jak X-Frame-Options, Content-Disposition i Cross-Origin-Resource-Policy. * **Czas**: Zauważanie spójnych różnic czasowych między dwoma stanami. ### Metody włączenia * **Elementy HTML**: HTML oferuje różne elementy do **włączania zasobów międzydomenowych**, takie jak arkusze stylów, obrazy lub skrypty, zmuszając przeglądarkę do żądania zasobu nie-HTML. Kompilację potencjalnych elementów HTML w tym celu można znaleźć pod adresem [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). * **Ramki**: Elementy takie jak **iframe**, **object** i **embed** mogą bezpośrednio osadzać zasoby HTML w stronie atakującego. Jeśli strona **nie ma ochrony przed osadzaniem**, JavaScript może uzyskać dostęp do obiektu okna osadzonego zasobu za pomocą właściwości contentWindow. * **Wyskakujące okna**: Metoda **`window.open`** otwiera zasób w nowej karcie lub oknie, dostarczając uchwytu okna, z którym JavaScript może współdziałać za pomocą metod i właściwości zgodnie z SOP. Wyskakujące okna, często używane w jednokrotnym logowaniu, omijają ograniczenia osadzania i ciasteczek docelowego zasobu. Jednak nowoczesne przeglądarki ograniczają tworzenie wyskakujących okien do określonych działań użytkownika. * **Żądania JavaScript**: JavaScript umożliwia bezpośrednie żądania zasobów docelowych za pomocą **XMLHttpRequests** lub **Fetch API**. Metody te oferują precyzyjną kontrolę nad żądaniem, na przykład możliwość śledzenia przekierowań HTTP. ### Techniki wycieku * **Obsługa zdarzeń**: Klasyczna technika wycieku w XS-Leaks, gdzie obsługa zdarzeń takich jak **onload** i **onerror** dostarcza informacji o sukcesie lub niepowodzeniu ładowania zasobu. * **Komunikaty o błędach**: Wyjątki JavaScript lub specjalne strony błędów mogą dostarczać informacji o wycieku zarówno bezpośrednio z komunikatu o błędzie, jak i przez różnicowanie między jego obecnością a nieobecnością. * **Globalne limity**: Fizyczne ograniczenia przeglądarki, takie jak pojemność pamięci lub inne narzucone limity przeglądarki, mogą sygnalizować osiągnięcie progu, służąc jako technika wycieku. * **Globalny stan**: Wykrywalne interakcje z **globalnymi stanami przeglądarek** (np. interfejsem Historii) mogą być wykorzystane. Na przykład **liczba wpisów** w historii przeglądarki może dawać wskazówki dotyczące stron międzydomenowych. * **API wydajności**: To API dostarcza **szczegółowe informacje o wydajności bieżącej strony**, w tym czas sieciowy dla dokumentu i załadowanych zasobów, umożliwiając wnioskowanie o żądanych zasobach. * **Odczytywalne atrybuty**: Niektóre atrybuty HTML są **odczytywalne międzydomenowo** i mogą być wykorzystane jako technika wycieku. Na przykład właściwość `window.frame.length` pozwala JavaScriptowi zliczać osadzone ramki na stronie międzydomenowej. ## Narzędzie XSinator i artykuł XSinator to automatyczne narzędzie do **sprawdzania przeglądarek pod kątem kilku znanych XS-Leaks** opisanych w artykule: **[https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)** Możesz **uzyskać dostęp do narzędzia pod adresem [https://xsinator.com/](https://xsinator ## **Techniki oparte na czasie** Niektóre z poniższych technik wykorzystują czas jako część procesu wykrywania różnic w możliwych stanach stron internetowych. Istnieje wiele sposobów mierzenia czasu w przeglądarce internetowej. **Zegary**: Interfejs API [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) umożliwia programistom uzyskiwanie pomiarów czasu o wysokiej rozdzielczości.\ Atakujący może wykorzystać znaczną liczbę interfejsów API do tworzenia niejawnych zegarów: [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), animacje CSS i inne.\ Więcej informacji: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). ## Techniki obsługi zdarzeń ### Onload/Onerror * **Metody włączania**: Ramki, elementy HTML * **Wykrywalna różnica**: Kod stanu * **Więcej informacji**: [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/) * **Podsumowanie**: Jeśli podczas próby ładowania zasobu zostaną wywołane zdarzenia onerror/onload, można ustalić kod stanu. * **Przykład kodu**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](https://xsinator.com/testing.html#Event%20Handler%20Leak%20\(Script\)) {% content-ref url="xs-search/cookie-bomb-+-onerror-xs-leak.md" %} [cookie-bomb-+-onerror-xs-leak.md](xs-search/cookie-bomb-+-onerror-xs-leak.md) {% endcontent-ref %} Przykład kodu próbuje **ładować obiekty skryptów z JS**, ale można również używać **innych tagów**, takich jak obiekty, arkusze stylów, obrazy, dźwięki. Ponadto, możliwe jest również wstrzyknięcie **bezpośrednio tagu** i zadeklarowanie zdarzeń `onload` i `onerror` wewnątrz tagu (zamiast wstrzykiwania go z JS). Istnieje również wersja ataku bez użycia skryptu: ```html ``` W tym przypadku, jeśli `example.com/404` nie zostanie znalezione, zostanie załadowane `attacker.com/?error`. ### Czas ładowania * **Metody włączenia**: Elementy HTML * **Wykrywalna różnica**: Czas (zazwyczaj spowodowany zawartością strony, kodem stanu) * **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) * **Podsumowanie**: [**API performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) może być używane do mierzenia czasu wykonania żądania. Jednak można również użyć innych zegarów, takich jak [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming), które mogą identyfikować zadania trwające dłużej niż 50 ms. * **Przykład kodu**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) inny przykład: {% content-ref url="xs-search/performance.now-example.md" %} [performance.now-example.md](xs-search/performance.now-example.md) {% endcontent-ref %} #### Czas ładowania + Wymuszone zadanie o dużej intensywności Ta technika jest podobna do poprzedniej, ale **atakujący** będzie również **wymuszał** pewne działanie, aby zajęło to **znaczącą ilość czasu**, gdy **odpowiedź jest pozytywna lub negatywna**, a następnie zmierzy ten czas. {% content-ref url="xs-search/performance.now-+-force-heavy-task.md" %} [performance.now-+-force-heavy-task.md](xs-search/performance.now-+-force-heavy-task.md) {% endcontent-ref %} ### Czas wyładowania/przed wyładowaniem * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Czas (zazwyczaj spowodowany zawartością strony, kodem stanu) * **Więcej informacji**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) * **Podsumowanie**: [Zegar SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) może być używany do mierzenia czasu wykonania żądania. Można również użyć innych zegarów. * **Przykład kodu**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) Czas potrzebny na pobranie zasobu można zmierzyć, wykorzystując zdarzenia [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) i [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). Zdarzenie **`beforeunload`** jest wywoływane, gdy przeglądarka ma przejść do nowej strony, podczas gdy zdarzenie **`unload`** występuje, gdy nawigacja faktycznie się odbywa. Różnica czasu między tymi dwoma zdarzeniami może być obliczona, aby określić **czas, jaki przeglądarka spędziła na pobieraniu zasobu**. ### Czas ładowania ramki z ograniczeniami + onload * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Czas (zazwyczaj spowodowany zawartością strony, kodem stanu) * **Więcej informacji**: [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) * **Podsumowanie**: [API performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) może być używane do mierzenia czasu wykonania żądania. Można również użyć innych zegarów. * **Przykład kodu**: [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) Zauważono, że w przypadku braku [Ochrony ramkowej](https://xsleaks.dev/docs/defenses/opt-in/xfo/), czas potrzebny na załadowanie strony i jej podzasobów przez sieć może być mierzony przez atakującego. Pomiar ten jest zazwyczaj możliwy, ponieważ obsługa zdarzenia `onload` ramki jest wywoływana dopiero po zakończeniu ładowania zasobów i wykonania kodu JavaScript. Aby ominąć zmienność wprowadzaną przez wykonanie skryptu, atakujący może użyć atrybutu [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) wewnątrz znacznika ` ``` ### #ID + błąd + onload * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Zawartość strony * **Więcej informacji**: * **Podsumowanie**: Jeśli możesz spowodować błąd strony, gdy dostępna jest poprawna zawartość, i załadować ją poprawnie, gdy dostępna jest dowolna zawartość, możesz utworzyć pętlę, aby wydobyć wszystkie informacje bez mierzenia czasu. * **Przykład kodu**: Załóżmy, że możesz **wstawić** **stronę**, która zawiera **tajną** zawartość **wewnątrz Iframe**. Możesz sprawić, że ofiara będzie **szukać** pliku zawierającego "_**flagę**_" za pomocą **Iframe** (wykorzystując na przykład CSRF). Wewnątrz Iframe wiesz, że zdarzenie _**onload**_ zostanie **zawsze wykonane co najmniej raz**. Następnie możesz **zmienić** **URL** Iframe, zmieniając tylko **zawartość** **hasła** wewnątrz URL. Na przykład: 1. **URL1**: www.atakujący.com/xssearch#try1 2. **URL2**: www.atakujący.com/xssearch#try2 Jeśli pierwszy URL został **pomyślnie załadowany**, to po **zmianie** części **hasła** w URL zdarzenie **onload** **nie zostanie ponownie wywołane**. Ale **jeśli** strona miała jakiegoś rodzaju **błąd** podczas **ładowania**, to zdarzenie **onload** zostanie **ponownie wywołane**. W ten sposób możesz **rozróżnić** między stroną **poprawnie** załadowaną a stroną, która ma **błąd** podczas dostępu. ### Wykonanie JavaScriptu * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Zawartość strony * **Więcej informacji**: * **Podsumowanie**: Jeśli **strona** zwraca **wrażliwą** zawartość **lub** zawartość, którą użytkownik może **kontrolować**. Użytkownik może ustawić **poprawny kod JS w przypadku negatywnym**, a następnie załadować każdą próbę wewnątrz znaczników **`