# XS-Search/XS-Leaks
Użyj [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), aby łatwo tworzyć i **automatyzować przepływy pracy** z wykorzystaniem 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" %}
Zacznij od zera i zostań mistrzem hakowania AWS 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ź [**PLANY SUBSKRYPCYJNE**](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) 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: * **Strona internetowa podatna**: Strona docelowa, 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 Strony internetowej podatnej do Strony internetowej atakującego (np. window.open, iframe, fetch, tag HTML z href, itp.). * **Technika wycieku**: Techniki używane do rozróżniania różnic w stanie Strony internetowej podatnej na podstawie informacji zebranej za pomocą metody włączenia. * **Stany**: Dwa potencjalne warunki Strony internetowej podatnej, które atakujący ma na celu odróżnić. * **Różnice do wykrycia**: Obserwowalne różnice, na których atakujący polega, aby wywnioskować stan Strony internetowej podatnej. ### Różnice do wykrycia Kilka aspektów można przeanalizować, aby odróżnić stany Strony internetowej podatnej: * **Kod stanu**: Odróżnianie między **różnymi kodami stanu odpowiedzi HTTP** międzydomenowych, takimi jak błędy serwera, błędy klienta lub błędy uwierzytelniania. * **Użycie interfejsu API**: Identyfikacja **użycia interfejsów API sieci Web** na stronach, ujawniająca, czy strona międzydomenowa wykorzystuje określone interfejsy 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 **zmian w treści odpowiedzi HTTP** lub w zasobach podrzędnych strony, takich jak **liczba osadzonych ramek** lub rozbieżności w rozmiarach 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 stałych rozbieżności 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 do tego 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 na 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. * **Okienka pop-up**: Metoda **`window.open`** otwiera zasób w nowej karcie lub oknie, zapewniając **uchwyt okna** dla JavaScriptu do interakcji z metodami i właściwościami zgodnie z SOP. Okienka pop-up, często używane w jednokrotnym logowaniu, omijają ograniczenia osadzania i ciasteczek docelowego zasobu. Jednak nowoczesne przeglądarki ograniczają tworzenie okienek pop-up do określonych działań użytkownika. * **Żądania JavaScript**: JavaScript pozwala na bezpośrednie żądania zasobów docelowych za pomocą **XMLHttpRequests** lub **Fetch API**. Te metody 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ługi zdarzeń takie jak **onload** i **onerror** dostarczają 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 bezpośrednio z komunikatu błędu lub poprzez różnicowanie między jego obecnością a brakiem. * **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 dostarczyć wskazówek dotyczących stron międzydomenowych. * **API wydajności**: To API dostarcza **szczegóły wydajności bieżącej strony**, w tym czas sieciowy dla dokumentu i załadowanych zasobów, umożliwiając wnioskowanie o żądanych zasobach. * **Atrybuty do odczytu**: 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 zliczyć ramki osadzone na stronie międzydomenowej. ## Narzędzie XSinator & Artykuł XSinator to automatyczne narzędzie do **sprawdzania przeglądarek pod kątem kilku znanych XS-Leaks** wyjaśnionych w swoim artykule: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) Możesz **uzyskać dostęp do narzędzia na** [**https://xsinator.com/**](https://xsinator.com/) {% hint style="warning" %} **Wyłączone XS-Leaks**: Musieliśmy wykluczyć XS-Leaks, które polegają na **robotach usługowych**, ponieważ ingerowałyby w inne wycieki w XSinatorze. Ponadto zdecydowaliśmy się **wykluczyć XS-Leaks, które polegają na błędach konfiguracji i błędach w określonej aplikacji internetowej**. Na przykład błędy konfiguracji Cross-Origin Resource Sharing (CORS), wycieki postMessage lub Cross-Site Scripting. Dodatkowo wykluczyliśmy XS-Leaks oparte na czasie, ponieważ często cierpią na wolność, hałaśliwość i niedokładność. {% endhint %}
\ Użyj [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), aby łatwo tworzyć i **automatyzować przepływy pracy** z wykorzystaniem 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" %} ## **Techniki oparte na czasie** Niektóre z następujących technik będą wykorzystywać czas jako część procesu wykrywania różnic w możliwych stanach stron internetowych. Istnieją różne sposoby mierzenia czasu w przeglądarce internetowej. **Zegary**: API [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) umożliwia programistom uzyskanie pomiarów czasu o wysokiej rozdzielczości.\ Istnieje znaczna liczba interfejsów API, których atakujący mogą nadużywać, aby stworzyć niejawne zegary: [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łączenia**: 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**: próbując załadować zasób, gdy zdarzenia onerror/onload są wyzwalane po pomyślnym/niepomyślnym załadowaniu zasobu, 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 **załadować obiekty skryptów z JS**, ale **inne tagi** takie jak obiekty, arkusze stylów, obrazy, dźwięki mogą być również używane. Ponadto możliwe jest również bezpośrednie wstrzyknięcie **tagu** i zadeklarowanie zdarzeń `onload` i `onerror` wewnątrz tagu (zamiast wstrzykiwania go z JS). Istnieje również wersja tego 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 ze względu na zawartość strony, kod statusu) * **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:** [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** może być użyte do zmierzenia czasu potrzebnego na wykonanie żądania. Jednak można użyć innych zegarów, takich jak [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming), który może zidentyfikować 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 w: {% content-ref url="xs-search/performance.now-example.md" %} [performance.now-example.md](xs-search/performance.now-example.md) {% endcontent-ref %} #### Czas ładowania + Wymuszone ciężkie zadanie Ta technika jest podobna do poprzedniej, ale **atakujący** będzie również **wymuszał** pewne działania, aby zajęły **istotny czas**, gdy **odpowiedź jest pozytywna lub negatywna**, a następnie mierzył 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 rozładowania/przed rozładowaniem * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Czas (zazwyczaj ze względu na zawartość strony, kod statusu) * **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żyty do zmierzenia czasu potrzebnego na wykonanie żądania. Można 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 nawigować do nowej strony, podczas gdy zdarzenie **`unload`** występuje, gdy nawigacja faktycznie się odbywa. Różnicę czasu między tymi dwoma zdarzeniami można obliczyć, aby określić **czas, jaki przeglądarka spędziła na pobieraniu zasobu**. ### Czas ramki z ograniczeniami + onload * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Czas (zazwyczaj ze względu na zawartość strony, kod statusu) * **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:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API może być użyte do zmierzenia czasu potrzebnego na wykonanie żądania. Można 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/), atakujący może zmierzyć czas potrzebny na załadowanie strony i jej podzasobów przez sieć. Pomiar ten jest zazwyczaj możliwy, ponieważ obsługa `onload` ramki jest wyzwalana dopiero po zakończeniu ładowania zasobów i wykonania JavaScript. Aby ominąć zmienność wprowadzoną przez wykonanie skryptu, atakujący może użyć atrybutu [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) wewnątrz ` ``` ### #ID + błąd + onload * **Metody włączenia**: Ramki * **Wykrywalna różnica**: Zawartość strony * **Więcej informacji**: * **Podsumowanie**: Jeśli można spowodować błąd strony podczas dostępu do poprawnej zawartości i sprawić, że załaduje się poprawnie, gdy dostępna jest dowolna zawartość, można utworzyć pętlę do wydobycia wszystkich informacji bez mierzenia czasu. * **Przykład kodu**: Załóżmy, że można **wstawić** **stronę**, która zawiera **tajną** zawartość **wewnątrz ramki**. Możesz sprawić, że ofiara będzie szukać pliku zawierającego "_**flagę**_" używając **ramki** (wykorzystując np. CSRF). Wewnątrz ramki wiesz, że zdarzenie _**onload**_ zostanie **zawsze wykonane co najmniej raz**. Następnie możesz **zmienić** **URL** ramki, 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, gdy **zmienisz** **część hasła** w URL, zdarzenie **onload** **nie zostanie ponownie wywołane**. Ale **jeśli** strona miała **jakikolwiek błąd** podczas **ładowania**, wtedy zdarzenie **onload** zostanie **ponownie wywołane**. W ten sposób można **rozróżnić** między stroną **poprawnie** załadowaną a stroną, która ma **błąd** podczas dostępu. ### Wykonywanie 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ą można **kontrolować** przez użytkownika. Użytkownik może ustawić **poprawny kod JS w przypadku negatywnym**, a **każdą próbę załadować** wewnątrz tagów **`