XS-Search/XS-Leaks
Last updated
Last updated
Użyj ****, aby łatwo budować i automatyzować przepływy pracy zasilane przez najbardziej zaawansowane narzędzia społecznościowe na świecie. Uzyskaj dostęp już dziś:
XS-Search to metoda używana do ekstrakcji informacji z różnych źródeł poprzez wykorzystanie wrażliwości kanałów bocznych.
Kluczowe komponenty zaangażowane w ten atak obejmują:
Wrażliwa strona internetowa: Strona docelowa, z której zamierzane jest wydobycie informacji.
Strona internetowa atakującego: Złośliwa strona stworzona przez atakującego, którą odwiedza ofiara, hostująca exploit.
Metoda włączenia: Technika stosowana do włączenia Wrażliwej Strony Internetowej 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 Wrażliwej Strony Internetowej na podstawie informacji zebranych za pomocą metody włączenia.
Stany: Dwa potencjalne warunki Wrażliwej Strony Internetowej, które atakujący stara się rozróżnić.
Wykrywalne różnice: Obserwowalne różnice, na których atakujący polega, aby wywnioskować stan Wrażliwej Strony Internetowej.
Kilka aspektów można analizować, aby odróżnić stany Wrażliwej Strony Internetowej:
Kod statusu: Rozróżnianie między różnymi kodami statusu odpowiedzi HTTP z różnych źródeł, takimi jak błędy serwera, błędy klienta lub błędy uwierzytelniania.
Użycie API: Identyfikacja użycia Web API na stronach, ujawniająca, czy strona z innego źródła korzysta z konkretnego JavaScript Web API.
Przekierowania: Wykrywanie nawigacji do różnych 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żenie obecności lub ewentualnie 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żenie stałych różnic czasowych między dwoma stanami.
Elementy HTML: HTML oferuje różne elementy do włączenia zasobów z różnych źródeł, takie jak arkusze stylów, obrazy lub skrypty, zmuszając przeglądarkę do żądania zasobu nie-HTML. Zbiór potencjalnych elementów HTML do tego celu można znaleźć pod adresem https://github.com/cure53/HTTPLeaks.
Ramki: Elementy takie jak iframe, object i embed mogą osadzać zasoby HTML bezpośrednio na stronie atakującego. Jeśli strona nie ma ochrony przed ramkami, 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, zapewniając uchwyt okna dla JavaScript do interakcji z metodami i właściwościami zgodnie z SOP. Wyskakujące okna, często używane w jednolitym logowaniu, omijają ograniczenia ramkowe i ciasteczkowe zasobu docelowego. Jednak nowoczesne przeglądarki ograniczają tworzenie wyskakujących okien do określonych działań użytkownika.
Żądania JavaScript: JavaScript pozwala na bezpośrednie żądania do zasobów docelowych za pomocą XMLHttpRequests lub Fetch API. Te metody oferują precyzyjną kontrolę nad żądaniem, na przykład wybierając, czy podążać za przekierowaniami HTTP.
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 zasobów.
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 poprzez rozróżnienie między jego obecnością a brakiem.
Globalne ograniczenia: Fizyczne ograniczenia przeglądarki, takie jak pojemność pamięci lub inne narzucone ograniczenia przeglądarki, mogą sygnalizować, kiedy osiągnięto próg, służąc jako technika wycieku.
Globalny stan: Wykrywalne interakcje z globalnymi stanami przeglądarek (np. interfejs historii) mogą być wykorzystywane. Na przykład, liczba wpisów w historii przeglądarki może dostarczać wskazówek dotyczących stron z różnych źródeł.
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 wnioski na temat żądanych zasobów.
Czytelne atrybuty: Niektóre atrybuty HTML są czytelne z różnych źródeł i mogą być używane jako technika wycieku. Na przykład, właściwość window.frame.length
pozwala JavaScript na zliczanie ramek osadzonych w stronie internetowej z różnych źródeł.
XSinator to automatyczne narzędzie do sprawdzania przeglądarek pod kątem kilku znanych XS-Leaks opisanych w jego dokumencie: https://xsinator.com/paper.pdf
Możesz uzyskać dostęp do narzędzia pod https://xsinator.com/
Wykluczone XS-Leaks: Musieliśmy wykluczyć XS-Leaks, które polegają na workerach serwisowych, ponieważ mogłyby zakłócać inne wycieki w XSinator. Ponadto zdecydowaliśmy się wykluczyć XS-Leaks, które polegają na błędnej konfiguracji i błędach w konkretnej aplikacji internetowej. Na przykład, błędne konfiguracje CrossOrigin Resource Sharing (CORS), wycieki postMessage lub Cross-Site Scripting. Dodatkowo wykluczyliśmy XS-Leaks oparte na czasie, ponieważ często są wolne, hałaśliwe i niedokładne.
Użyj Trickest, aby łatwo budować i automatyzować przepływy pracy zasilane przez najbardziej zaawansowane narzędzia społecznościowe na świecie. Uzyskaj dostęp już dziś:
Niektóre z poniższych 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() pozwala programistom uzyskać pomiary czasu o wysokiej rozdzielczości. Istnieje znaczna liczba API, które atakujący mogą nadużywać do tworzenia niejawnych zegarów: Broadcast Channel API, Message Channel API, requestAnimationFrame, setTimeout, animacje CSS i inne. Więcej informacji: https://xsleaks.dev/docs/attacks/timing-attacks/clocks.
Metody włączenia: Ramki, elementy HTML
Wykrywalna różnica: Kod statusu
Podsumowanie: Jeśli próbuje się załadować zasób, zdarzenia onerror/onload są wywoływane, gdy zasób jest ładowany pomyślnie/niepomyślnie, możliwe jest ustalenie kodu statusu.
Przykład kodu próbuje załadować obiekty skryptów z JS, ale inne tagi takie jak obiekty, arkusze stylów, obrazy, audio mogą być również używane. Ponadto możliwe jest również wstrzyknięcie tagu bezpośrednio i zadeklarowanie zdarzeń onload
i onerror
wewnątrz tagu (zamiast wstrzykiwać je z JS).
Istnieje również wersja tego ataku bez skryptów:
W tym przypadku, jeśli example.com/404
nie zostanie znaleziony, załadowana zostanie attacker.com/?error
.
Metody włączenia: Elementy HTML
Wykrywalna różnica: Czas (zazwyczaj z powodu zawartości strony, kodu statusu)
Podsumowanie: API performance.now() może być używane do mierzenia, ile czasu zajmuje wykonanie żądania. Jednak inne zegary mogą być używane, takie jak PerformanceLongTaskTiming API, 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 inny przykład w:
Ta technika jest podobna do poprzedniej, ale atakujący również wymusi pewną akcję, aby zajęła odpowiednią ilość czasu, gdy odpowiedź jest pozytywna lub negatywna i zmierzy ten czas.
performance.now + Force heavy taskMetody włączenia: Ramki
Wykrywalna różnica: Czas (zazwyczaj z powodu zawartości strony, kodu statusu)
Podsumowanie: Zegar SharedArrayBuffer może być używany do mierzenia, ile czasu zajmuje wykonanie żądania. Inne zegary mogą być używane.
Czas potrzebny na pobranie zasobu można zmierzyć, wykorzystując zdarzenia unload
i beforeunload
. Zdarzenie beforeunload
jest wywoływane, gdy przeglądarka ma zamiar przejść do nowej strony, podczas gdy zdarzenie unload
występuje, gdy nawigacja faktycznie ma miejsce. Różnicę czasu między tymi dwoma zdarzeniami można obliczyć, aby określić czas, jaki przeglądarka spędziła na pobieraniu zasobu.
Metody włączenia: Ramki
Wykrywalna różnica: Czas (zazwyczaj z powodu zawartości strony, kodu statusu)
Podsumowanie: API performance.now() może być używane do mierzenia, ile czasu zajmuje wykonanie żądania. Inne zegary mogą być używane.
Zaobserwowano, że w przypadku braku Ochrony Ramkowej, czas potrzebny na załadowanie strony i jej zasobów podrzędnych przez sieć może być mierzony przez atakującego. To pomiar jest zazwyczaj możliwy, ponieważ handler onload
iframe jest wywoływany dopiero po zakończeniu ładowania zasobów i wykonania JavaScriptu. Aby obejść zmienność wprowadzoną przez wykonanie skryptu, atakujący może zastosować atrybut sandbox
w <iframe>
. Włączenie tego atrybutu ogranicza wiele funkcji, w szczególności wykonanie JavaScriptu, co ułatwia pomiar, który jest głównie wpływany przez wydajność sieci.
Inclusion Methods: Frames
Detectable Difference: Treść strony
More info:
Summary: Jeśli możesz spowodować błąd na stronie, gdy dostępna jest poprawna treść, i sprawić, że załaduje się poprawnie, gdy dostępna jest jakakolwiek treść, możesz stworzyć pętlę do wyodrębnienia wszystkich informacji bez mierzenia czasu.
Code Example:
Załóżmy, że możesz wstawić stronę, która ma tajną treść w Iframe.
Możesz sprawić, aby ofiara wyszukiwała plik, który zawiera "flag" używając Iframe (na przykład wykorzystując CSRF). Wewnątrz Iframe wiesz, że zdarzenie onload będzie wykonywane zawsze przynajmniej raz. Następnie możesz zmienić URL iframe, zmieniając tylko zawartość hash w URL.
Na przykład:
URL1: www.attacker.com/xssearch#try1
URL2: www.attacker.com/xssearch#try2
Jeśli pierwszy URL został pomyślnie załadowany, to, gdy zmienisz część hash URL, zdarzenie onload nie zostanie wywołane ponownie. Ale jeśli strona miała jakiś rodzaj błędu podczas ładowania, to zdarzenie onload zostanie wywołane ponownie.
Wtedy możesz rozróżnić między poprawnie załadowaną stroną a stroną, która ma błąd podczas dostępu.
Inclusion Methods: Frames
Detectable Difference: Treść strony
More info:
Summary: Jeśli strona zwraca wrażliwą treść, lub treść, która może być kontrolowana przez użytkownika. Użytkownik mógłby ustawić ważny kod JS w negatywnym przypadku, a ładować każdą próbę wewnątrz <script>
tagów, więc w negatywnych przypadkach kod atakującego jest wykonywany, a w pozytywnych przypadkach nic nie zostanie wykonane.
Code Example:
Inclusion Methods: HTML Elements
Detectable Difference: Kod statusu i nagłówki
Summary: Cross-Origin Read Blocking (CORB) to środek bezpieczeństwa, który zapobiega ładowaniu przez strony internetowe niektórych wrażliwych zasobów z innych źródeł, aby chronić przed atakami takimi jak Spectre. Jednak atakujący mogą wykorzystać jego ochronne zachowanie. Gdy odpowiedź podlegająca CORB zwraca chroniony przez CORB Content-Type
z nosniff
i kodem statusu 2xx
, CORB usuwa treść i nagłówki odpowiedzi. Atakujący obserwujący to mogą wywnioskować kombinację kodu statusu (wskazującego na sukces lub błąd) i Content-Type
(oznaczającego, czy jest chroniony przez CORB), co prowadzi do potencjalnego wycieku informacji.
Code Example:
Sprawdź link z dodatkowymi informacjami, aby uzyskać więcej informacji na temat ataku.
Inclusion Methods: Frames
Detectable Difference: Treść strony
Summary: Wycieki wrażliwych danych z atrybutu id lub name.
Możliwe jest załadowanie strony wewnątrz iframe i użycie #id_value
, aby strona skupiła się na elemencie iframe z wskazanym id, a następnie, jeśli zostanie wywołany sygnał onblur
, element ID istnieje.
Możesz przeprowadzić ten sam atak z tagami portal
.
Inclusion Methods: Frames, Pop-ups
Detectable Difference: Użycie API
Summary: Zbieranie wrażliwych informacji z postMessage lub użycie obecności postMessages jako orakula do poznania statusu użytkownika na stronie
Code Example: Jakikolwiek kod nasłuchujący wszystkie postMessages.
Aplikacje często wykorzystują postMessage
broadcasts do komunikacji między różnymi źródłami. Jednak ta metoda może nieumyślnie ujawniać wrażliwe informacje, jeśli parametr targetOrigin
nie jest odpowiednio określony, co pozwala każdemu oknu na odbieranie wiadomości. Ponadto sam akt odbierania wiadomości może działać jako orakulum; na przykład, niektóre wiadomości mogą być wysyłane tylko do użytkowników, którzy są zalogowani. Dlatego obecność lub brak tych wiadomości może ujawniać informacje o stanie lub tożsamości użytkownika, takie jak to, czy są uwierzytelnieni, czy nie.
Użyj Trickest, aby łatwo budować i automatyzować przepływy pracy zasilane przez najbardziej zaawansowane narzędzia społecznościowe na świecie. Uzyskaj dostęp już dziś:
Inclusion Methods: Frames, Pop-ups
Detectable Difference: Użycie API
More info: https://xsinator.com/paper.pdf (5.1)
Summary: Wyczerpanie limitu połączeń WebSocket ujawnia liczbę połączeń WebSocket strony z innego źródła.
Możliwe jest zidentyfikowanie, czy i ile połączeń WebSocket używa strona docelowa. Pozwala to atakującemu na wykrycie stanów aplikacji i wyciek informacji związanych z liczbą połączeń WebSocket.
Jeśli jedno źródło używa maksymalnej liczby obiektów połączeń WebSocket, niezależnie od stanu ich połączeń, utworzenie nowych obiektów spowoduje wyjątki JavaScript. Aby przeprowadzić ten atak, strona atakująca otwiera stronę docelową w oknie pop-up lub iframe, a następnie, po załadowaniu strony docelowej, próbuje utworzyć maksymalną liczbę możliwych połączeń WebSocket. Liczba zgłoszonych wyjątków to liczba połączeń WebSocket używanych przez okno strony docelowej.
Inclusion Methods: Frames, Pop-ups
Detectable Difference: Użycie API
More info: https://xsinator.com/paper.pdf (5.1)
Summary: Wykrywanie żądania płatności, ponieważ tylko jedno może być aktywne w danym czasie.
Code Example: https://xsinator.com/testing.html#Payment%20API%20Leak
Ten XS-Leak umożliwia atakującemu wykrycie, kiedy strona z innego źródła inicjuje żądanie płatności.
Ponieważ tylko jedno żądanie płatności może być aktywne w danym czasie, jeśli strona docelowa korzysta z API żądania płatności, wszelkie dalsze próby użycia tego API zakończą się niepowodzeniem i spowodują wyjątek JavaScript. Atakujący może to wykorzystać, okresowo próbując wyświetlić interfejs API płatności. Jeśli jedna próba spowoduje wyjątek, strona docelowa aktualnie z niego korzysta. Atakujący może ukryć te okresowe próby, natychmiast zamykając interfejs po jego utworzeniu.
Inclusion Methods:
Detectable Difference: Czas (zwykle z powodu treści strony, kodu statusu)
Summary: Mierzenie czasu wykonania strony, wykorzystując jednowątkową pętlę zdarzeń JS.
Code Example:
JavaScript działa na modelu współbieżności jednowątkowej pętli zdarzeń, co oznacza, że może wykonywać tylko jedno zadanie w danym czasie. Ta cecha może być wykorzystana do oszacowania jak długo kod z innego źródła zajmuje wykonanie. Atakujący może mierzyć czas wykonania swojego kodu w pętli zdarzeń, ciągle wysyłając zdarzenia o stałych właściwościach. Te zdarzenia będą przetwarzane, gdy pula zdarzeń będzie pusta. Jeśli inne źródła również wysyłają zdarzenia do tej samej puli, atakujący może wywnioskować czas, jaki zajmuje wykonanie tych zewnętrznych zdarzeń, obserwując opóźnienia w wykonaniu swoich własnych zadań. Ta metoda monitorowania pętli zdarzeń pod kątem opóźnień może ujawniać czas wykonania kodu z różnych źródeł, potencjalnie ujawniając wrażliwe informacje.
W pomiarze czasu wykonania możliwe jest eliminowanie czynników sieciowych, aby uzyskać dokładniejsze pomiary. Na przykład, ładując zasoby używane przez stronę przed jej załadowaniem.
Inclusion Methods:
Detectable Difference: Czas (zwykle z powodu treści strony, kodu statusu)
Summary: Jedna z metod mierzenia czasu wykonania operacji webowej polega na celowym zablokowaniu pętli zdarzeń w wątku, a następnie zmierzeniu jak długo zajmuje ponowne udostępnienie pętli zdarzeń. Wstawiając operację blokującą (taką jak długie obliczenie lub synchroniczne wywołanie API) do pętli zdarzeń i monitorując czas, jaki zajmuje rozpoczęcie wykonania kolejnego kodu, można wywnioskować czas trwania zadań, które były wykonywane w pętli zdarzeń w czasie blokady. Ta technika wykorzystuje jednowątkowy charakter pętli zdarzeń JavaScript, w której zadania są wykonywane sekwencyjnie, i może dostarczyć informacji o wydajności lub zachowaniu innych operacji dzielących ten sam wątek.
Code Example:
Znaczną zaletą techniki mierzenia czasu wykonania poprzez blokowanie pętli zdarzeń jest jej potencjał do obejścia Izolacji Strony. Izolacja Strony to funkcja zabezpieczeń, która oddziela różne strony internetowe w osobnych procesach, mająca na celu zapobieganie bezpośredniemu dostępowi złośliwych stron do wrażliwych danych z innych stron. Jednak wpływając na czas wykonania innego źródła poprzez wspólną pętlę zdarzeń, atakujący może pośrednio wydobyć informacje o działaniach tego źródła. Ta metoda nie polega na bezpośrednim dostępie do danych innego źródła, lecz raczej na obserwacji wpływu działań tego źródła na wspólną pętlę zdarzeń, omijając w ten sposób bariery ochronne ustanowione przez Izolację Strony.
W pomiarze czasu wykonania możliwe jest eliminowanie czynników sieciowych, aby uzyskać dokładniejsze pomiary. Na przykład, ładując zasoby używane przez stronę przed jej załadowaniem.
Inclusion Methods: Żądania JavaScript
Detectable Difference: Czas (zwykle z powodu treści strony, kodu statusu)
Summary: Atakujący mógłby zablokować wszystkie gniazda oprócz 1, załadować stronę docelową i jednocześnie załadować inną stronę, czas do momentu, gdy ostatnia strona zaczyna się ładować, to czas, jaki zajęła strona docelowa.
Code Example:
Przeglądarki wykorzystują gniazda do komunikacji z serwerem, ale z powodu ograniczonych zasobów systemu operacyjnego i sprzętu, przeglądarki są zmuszone narzucać limit na liczbę równoczesnych gniazd. Atakujący mogą wykorzystać to ograniczenie poprzez następujące kroki:
Ustalić limit gniazd przeglądarki, na przykład 256 globalnych gniazd.
Zajmować 255 gniazd przez dłuższy czas, inicjując 255 żądań do różnych hostów, zaprojektowanych tak, aby utrzymać połączenia otwarte bez zakończenia.
Wykorzystać 256. gniazdo do wysłania żądania do strony docelowej.
Spróbować 257. żądania do innego hosta. Ponieważ wszystkie gniazda są zajęte (zgodnie z krokami 2 i 3), to żądanie będzie oczekiwać, aż gniazdo stanie się dostępne. Opóźnienie przed tym żądaniem dostarcza atakującemu informacji o czasie aktywności sieciowej związanej z 256. gniazdem (gniazdo strony docelowej). To wnioskowanie jest możliwe, ponieważ 255 gniazd z kroku 2 są nadal zajęte, co sugeruje, że jakiekolwiek nowo dostępne gniazdo musi być tym zwolnionym z kroku 3. Czas, jaki zajmuje 256. gniazdu, aby stać się dostępnym, jest zatem bezpośrednio związany z czasem potrzebnym na zakończenie żądania do strony docelowej.
Więcej informacji: https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/
Inclusion Methods: Żądania JavaScript
Detectable Difference: Czas (zwykle z powodu treści strony, kodu statusu)
More info:
Summary: To jak poprzednia technika, ale zamiast używać wszystkich gniazd, Google Chrome nakłada limit 6 równoczesnych żądań do tego samego źródła. Jeśli zablokujemy 5 i następnie uruchomimy 6. żądanie, możemy zmierzyć czas, a jeśli uda nam się sprawić, aby strona ofiary wysłała więcej żądań do tego samego punktu końcowego, aby wykryć status strony, 6. żądanie zajmie więcej czasu i możemy to wykryć.
Performance API
oferuje wgląd w metryki wydajności aplikacji webowych, dodatkowo wzbogacony przez Resource Timing API
. Resource Timing API umożliwia monitorowanie szczegółowych czasów żądań sieciowych, takich jak czas trwania żądań. W szczególności, gdy serwery dołączają nagłówek Timing-Allow-Origin: *
do swoich odpowiedzi, dodatkowe dane, takie jak rozmiar transferu i czas wyszukiwania domeny, stają się dostępne.
Ta bogata baza danych może być pobierana za pomocą metod takich jak performance.getEntries
lub performance.getEntriesByName
, zapewniając kompleksowy widok informacji związanych z wydajnością. Dodatkowo, API ułatwia pomiar czasów wykonania, obliczając różnicę między znacznikami czasowymi uzyskanymi z performance.now()
. Warto jednak zauważyć, że dla niektórych operacji w przeglądarkach takich jak Chrome, precyzja performance.now()
może być ograniczona do milisekund, co może wpłynąć na dokładność pomiarów czasowych.
Poza pomiarami czasowymi, API Wydajności może być wykorzystywane do uzyskiwania informacji związanych z bezpieczeństwem. Na przykład, obecność lub brak stron w obiekcie performance
w Chrome może wskazywać na zastosowanie X-Frame-Options
. W szczególności, jeśli strona jest zablokowana przed renderowaniem w ramce z powodu X-Frame-Options
, nie zostanie zarejestrowana w obiekcie performance
, co stanowi subtelny wskazówkę na temat polityki ramkowania strony.
Inclusion Methods: Frames, HTML Elements
Detectable Difference: Kod statusu
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Żądanie, które kończy się błędami, nie utworzy wpisu czasowego zasobów.
Możliwe jest rozróżnienie między kodami statusu odpowiedzi HTTP, ponieważ żądania, które prowadzą do błędu, nie tworzą wpisu wydajności.
Inclusion Methods: HTML Elements
Detectable Difference: Kod statusu
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Z powodu błędu przeglądarki, żądania, które kończą się błędami, są ładowane dwukrotnie.
W poprzedniej technice zidentyfikowano również dwa przypadki, w których błędy przeglądarki w GC prowadzą do ładowania zasobów dwukrotnie, gdy nie udaje się ich załadować. To spowoduje wiele wpisów w API Wydajności i może być zatem wykryte.
Inclusion Methods: HTML Elements
Detectable Difference: Kod statusu
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Żądania, które kończą się błędem, nie mogą być scalane.
Technika ta została znaleziona w tabeli w wspomnianym dokumencie, ale nie znaleziono opisu techniki. Możesz jednak znaleźć kod źródłowy sprawdzający to w https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak
Inclusion Methods: Frames
Detectable Difference: Treść strony
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Puste odpowiedzi nie tworzą wpisów czasowych zasobów.
Atakujący może wykryć, czy żądanie zakończyło się pustym ciałem odpowiedzi HTTP, ponieważ puste strony nie tworzą wpisu wydajności w niektórych przeglądarkach.
Inclusion Methods: Frames
Detectable Difference: Treść strony
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Używając XSS Audytora w Asercjach Bezpieczeństwa, atakujący mogą wykrywać konkretne elementy stron internetowych, obserwując zmiany w odpowiedziach, gdy skonstruowane ładunki wyzwalają mechanizm filtrujący audytora.
W Asercjach Bezpieczeństwa (SA) XSS Auditor, pierwotnie zaprojektowany w celu zapobiegania atakom Cross-Site Scripting (XSS), może paradoksalnie być wykorzystywany do wycieku wrażliwych informacji. Chociaż ta wbudowana funkcja została usunięta z Google Chrome (GC), nadal jest obecna w SA. W 2013 roku Braun i Heiderich wykazali, że XSS Auditor mógł nieumyślnie blokować legalne skrypty, prowadząc do fałszywych pozytywów. Na tym tle badacze opracowali techniki wydobywania informacji i wykrywania konkretnych treści na stronach z innego źródła, koncepcji znanej jako XS-Leaks, pierwotnie zgłoszonej przez Teradę i rozwiniętej przez Heyesa w poście na blogu. Chociaż te techniki były specyficzne dla XSS Audytora w GC, odkryto, że w SA strony zablokowane przez XSS Audytora nie generują wpisów w API Wydajności, ujawniając metodę, dzięki której wrażliwe informacje mogą być nadal wyciekane.
Inclusion Methods: Frames
Detectable Difference: Nagłówek
Summary: Zasób z nagłówkiem X-Frame-Options nie tworzy wpisu czasowego zasobów.
Jeśli strona nie jest dozwolona do renderowania w iframe, to nie tworzy wpisu wydajności. W rezultacie atakujący może wykryć nagłówek odpowiedzi X-Frame-Options
.
To samo dotyczy użycia tagu embed.
Inclusion Methods: Frames
Detectable Difference: Nagłówek
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Pobierania nie tworzą wpisów czasowych zasobów w API Wydajności.
Podobnie jak w opisanym XS-Leak, zasób, który jest pobierany z powodu nagłówka ContentDisposition, również nie tworzy wpisu wydajności. Ta technika działa we wszystkich głównych przeglądarkach.
Inclusion Methods: Frames
Detectable Difference: Przekierowanie
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Wpis czasowy zasobów ujawnia czas rozpoczęcia przekierowania.
Znaleźliśmy jeden przypadek XS-Leak, który wykorzystuje zachowanie niektórych przeglądarek, które rejestrują zbyt wiele informacji dla żądań z innego źródła. Standard definiuje podzbiór atrybutów, które powinny być ustawione na zero dla zasobów z innego źródła. Jednak w SA możliwe jest wykrycie, czy użytkownik jest przekierowywany przez stronę docelową, zapytując API Wydajności i sprawdzając dane czasowe redirectStart.
Inclusion Methods: Fetch API
Detectable Difference: Przekierowanie
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Czas trwania wpisów czasowych jest ujemny, gdy występuje przekierowanie.
W GC, czas trwania dla żądań, które kończą się przekierowaniem, jest ujemny i można go rozróżnić od żądań, które nie kończą się przekierowaniem.
Inclusion Methods: Frames
Detectable Difference: Nagłówek
More info: https://xsinator.com/paper.pdf (5.2)
Summary: Zasób chroniony przez CORP nie tworzy wpisów czasowych zasobów.
W niektórych przypadkach, wpis nextHopProtocol może być użyty jako technika wycieku. W GC, gdy nagłówek CORP jest ustawiony, nextHopProtocol będzie pusty. Należy zauważyć, że SA w ogóle nie utworzy wpisu wydajności dla zasobów z włączonym CORP.
Inclusion Methods: Frames
Detectable Difference: Użycie API
Summary: Wykrywanie, czy serwis pracownik jest zarejestrowany dla konkretnego źródła.
Code Example:
Serwisy pracownicze to konteksty skryptowe oparte na zdarzeniach, które działają w danym źródle. Działają w tle strony internetowej i mogą przechwytywać, modyfikować i buforować zasoby, aby stworzyć offline'ową aplikację webową. Jeśli zasób buforowany przez serwis pracownik jest dostępny przez iframe, zasób zostanie załadowany z pamięci podręcznej serwisu pracownik. Aby wykryć, czy zasób został załadowany z pamięci podręcznej serwisu pracownik, można użyć API Wydajności. Można to również zrobić za pomocą ataku czasowego (sprawdź dokument, aby uzyskać więcej informacji).
Inclusion Methods: Fetch API
Detectable Difference: Czas
Summary: Możliwe jest sprawdzenie, czy zasób został zapisany w pamięci podręcznej.
Korzystając z API Wydajności, możliwe jest sprawdzenie, czy zasób jest buforowany.
Inclusion Methods: Fetch API
Detectable Difference: Treść strony
Summary: Możliwe jest uzyskanie czasu trwania żądania z API performance
.
Inclusion Methods: HTML Elements (Wideo, Audio)
Detectable Difference: Kod statusu
Summary: W Firefoxie możliwe jest dokładne wycieknięcie kodu statusu żądania z innego źródła.
Code Example: https://jsbin.com/nejatopusi/1/edit?html,css,js,output
Interfejs MediaError
ma właściwość message, która unikalnie identyfikuje zasoby, które ładują się pomyślnie za pomocą odrębnego ciągu. Atakujący może wykorzystać tę funkcję, obserwując zawartość wiadomości, a tym samym dedukując status odpowiedzi zasobu z innego źródła.
Metody włączenia: Fetch API
Wykrywalna różnica: Nagłówek
Więcej informacji: https://xsinator.com/paper.pdf (5.3)
Podsumowanie: W Security Assertions (SA) komunikaty o błędach CORS niezamierzenie ujawniają pełny adres URL przekierowanych żądań.
Przykład kodu: https://xsinator.com/testing.html#CORS%20Error%20Leak
Ta technika umożliwia atakującemu wyodrębnienie celu przekierowania z witryny z innego źródła poprzez wykorzystanie sposobu, w jaki przeglądarki oparte na Webkit obsługują żądania CORS. Konkretnie, gdy żądanie z włączonym CORS jest wysyłane do docelowej witryny, która wydaje przekierowanie w oparciu o stan użytkownika, a przeglądarka następnie odrzuca żądanie, pełny adres URL celu przekierowania jest ujawniany w komunikacie o błędzie. Ta luka nie tylko ujawnia fakt przekierowania, ale także ujawnia punkt końcowy przekierowania oraz wszelkie wrażliwe parametry zapytania, które mogą zawierać.
Metody włączenia: Fetch API
Wykrywalna różnica: Nagłówek
Więcej informacji: https://xsinator.com/paper.pdf (5.3)
Podsumowanie: W Security Assertions (SA) komunikaty o błędach CORS niezamierzenie ujawniają pełny adres URL przekierowanych żądań.
Przykład kodu: https://xsinator.com/testing.html#SRI%20Error%20Leak
Atakujący może wykorzystać szczegółowe komunikaty o błędach, aby dedukować rozmiar odpowiedzi z innego źródła. Jest to możliwe dzięki mechanizmowi Subresource Integrity (SRI), który używa atrybutu integralności do weryfikacji, że pobrane zasoby, często z CDN, nie zostały zmienione. Aby SRI działało na zasobach z innego źródła, muszą być włączone CORS; w przeciwnym razie nie podlegają one kontrolom integralności. W Security Assertions (SA), podobnie jak w przypadku błędu CORS XS-Leak, komunikat o błędzie może być przechwycony po niepowodzeniu żądania fetch z atrybutem integralności. Atakujący mogą celowo wywołać ten błąd, przypisując fałszywą wartość hasha do atrybutu integralności dowolnego żądania. W SA wynikowy komunikat o błędzie niezamierzenie ujawnia długość zawartości żądanego zasobu. Ta utrata informacji pozwala atakującemu dostrzec różnice w rozmiarze odpowiedzi, torując drogę dla zaawansowanych ataków XS-Leak.
Metody włączenia: Pop-upy
Wykrywalna różnica: Kod statusu
Podsumowanie: Zezwalając tylko na witrynę ofiary w CSP, jeśli próbuje przekierować na inna domenę, CSP wywoła wykrywalny błąd.
XS-Leak może wykorzystać CSP do wykrycia, czy witryna z innego źródła została przekierowana do innego źródła. Ta luka może wykryć przekierowanie, ale dodatkowo ujawnia domenę celu przekierowania. Podstawowa idea tego ataku polega na zezwoleniu na domenę docelową na stronie atakującego. Gdy żądanie jest wysyłane do domeny docelowej, przekierowuje do domeny z innego źródła. CSP blokuje dostęp do niej i tworzy raport naruszenia używany jako technika wycieku. W zależności od przeglądarki, ten raport może ujawniać lokalizację celu przekierowania. Nowoczesne przeglądarki nie wskażą adresu URL, na który zostało przekierowane, ale nadal można wykryć, że przekierowanie z innego źródła zostało wywołane.
Metody włączenia: Ramki, Pop-upy
Wykrywalna różnica: Zawartość strony
Podsumowanie: Wyczyść plik z pamięci podręcznej. Otwiera stronę docelową, sprawdza, czy plik jest obecny w pamięci podręcznej.
Przykład kodu:
Przeglądarki mogą używać jednej wspólnej pamięci podręcznej dla wszystkich witryn. Niezależnie od ich pochodzenia, możliwe jest wydedukowanie, czy strona docelowa zażądała konkretnego pliku.
Jeśli strona ładuje obraz tylko wtedy, gdy użytkownik jest zalogowany, można unieważnić zasób (aby nie był już pamiętany, jeśli był, zobacz więcej informacji), wykonać żądanie, które mogłoby załadować ten zasób i spróbować załadować zasób z błędnym żądaniem (np. używając zbyt długiego nagłówka referera). Jeśli załadunek zasobu nie wywołał żadnego błędu, to dlatego, że był pamiętany.
Metody włączenia: Ramki
Wykrywalna różnica: Nagłówek
Więcej informacji: https://bugs.chromium.org/p/chromium/issues/detail?id=1105875
Podsumowanie: Dyrektywy nagłówka CSP mogą być badane za pomocą atrybutu iframe CSP, ujawniając szczegóły polityki.
Przykład kodu: https://xsinator.com/testing.html#CSP%20Directive%20Leak
Nowa funkcja w Google Chrome (GC) pozwala stronom internetowym na proponowanie Polityki Bezpieczeństwa Treści (CSP) poprzez ustawienie atrybutu na elemencie iframe, z dyrektywami polityki przesyłanymi wraz z żądaniem HTTP. Zwykle osadzone treści muszą autoryzować to za pomocą nagłówka HTTP, w przeciwnym razie wyświetlana jest strona błędu. Jednak jeśli iframe jest już regulowany przez CSP, a nowo zaproponowana polityka nie jest bardziej restrykcyjna, strona załadowana zostanie normalnie. Ten mechanizm otwiera drogę dla atakującego do wykrycia konkretnych dyrektyw CSP strony z innego źródła, identyfikując stronę błędu. Chociaż ta luka została oznaczona jako naprawiona, nasze ustalenia ujawniają nową technikę wycieku zdolną do wykrywania strony błędu, sugerując, że podstawowy problem nigdy nie został w pełni rozwiązany.
Metody włączenia: Fetch API
Wykrywalna różnica: Nagłówek
Więcej informacji: https://xsleaks.dev/docs/attacks/browser-features/corp/
Podsumowanie: Zasoby zabezpieczone Polityką Zasobów Z Innego Źródła (CORP) zgłoszą błąd, gdy będą pobierane z niedozwolonego źródła.
Przykład kodu: https://xsinator.com/testing.html#CORP%20Leak
Nagłówek CORP to stosunkowo nowa funkcja zabezpieczeń platformy internetowej, która, gdy jest ustawiona, blokuje żądania cross-origin bez CORS do danego zasobu. Obecność nagłówka można wykryć, ponieważ zasób chroniony przez CORP zgłosi błąd podczas pobierania.
Metody włączenia: Elementy HTML
Wykrywalna różnica: Nagłówki
Podsumowanie: CORB może pozwolić atakującym na wykrycie, kiedy nagłówek nosniff
jest obecny w żądaniu.
Przykład kodu: https://xsinator.com/testing.html#CORB%20Leak
Sprawdź link, aby uzyskać więcej informacji na temat ataku.
Metody włączenia: Fetch API
Wykrywalna różnica: Nagłówki
Podsumowanie: Jeśli nagłówek Origin jest odbity w nagłówku Access-Control-Allow-Origin
, możliwe jest sprawdzenie, czy zasób jest już w pamięci podręcznej.
W przypadku, gdy nagłówek Origin jest odbity w nagłówku Access-Control-Allow-Origin
, atakujący może wykorzystać to zachowanie, aby spróbować pobierać zasób w trybie CORS. Jeśli błąd nie jest wywoływany, oznacza to, że został prawidłowo pobrany z sieci, jeśli błąd jest wywoływany, to dlatego, że był dostępny z pamięci podręcznej (błąd pojawia się, ponieważ pamięć podręczna zapisuje odpowiedź z nagłówkiem CORS zezwalającym na oryginalną domenę, a nie domenę atakującego).
Zauważ, że jeśli pochodzenie nie jest odbite, ale użyto znaku wieloznacznego (Access-Control-Allow-Origin: *
), to nie zadziała.
Metody włączenia: Fetch API
Wykrywalna różnica: Kod statusu
Podsumowanie: GC i SA pozwalają sprawdzić typ odpowiedzi (opaque-redirect) po zakończeniu przekierowania.
Przykład kodu: https://xsinator.com/testing.html#Fetch%20Redirect%20Leak
Składając żądanie za pomocą Fetch API z redirect: "manual"
i innymi parametrami, możliwe jest odczytanie atrybutu response.type
, a jeśli jest równy opaqueredirect
, to odpowiedź była przekierowaniem.
Metody włączenia: Pop-upy
Wykrywalna różnica: Nagłówek
Więcej informacji: https://xsinator.com/paper.pdf (5.4), https://xsleaks.dev/docs/attacks/window-references/
Podsumowanie: Strony chronione Polityką Otwieracza Z Innego Źródła (COOP) zapobiegają dostępowi z interakcji z innego źródła.
Przykład kodu: https://xsinator.com/testing.html#COOP%20Leak
Atakujący może wydedukować obecność nagłówka Polityki Otwieracza Z Innego Źródła (COOP) w odpowiedzi HTTP z innego źródła. COOP jest wykorzystywane przez aplikacje internetowe do uniemożliwienia zewnętrznym stronom uzyskiwania dowolnych odniesień do okien. Widoczność tego nagłówka można dostrzec, próbując uzyskać dostęp do odniesienia contentWindow
. W scenariuszach, w których COOP jest stosowane warunkowo, właściwość opener
staje się wyraźnym wskaźnikiem: jest niezdefiniowana, gdy COOP jest aktywne, i zdefiniowana w jego nieobecności.
Metody włączenia: Fetch API, Elementy HTML
Wykrywalna różnica: Kod statusu / Zawartość
Więcej informacji: https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects
Podsumowanie: Wykryj różnice w odpowiedziach, ponieważ długość odpowiedzi przekierowania może być zbyt duża, co powoduje, że serwer odpowiada błędem i generowany jest alert.
Przykład kodu: https://xsinator.com/testing.html#URL%20Max%20Length%20Leak
Jeśli przekierowanie po stronie serwera używa danych użytkownika wewnątrz przekierowania i dodatkowych danych. Możliwe jest wykrycie tego zachowania, ponieważ zazwyczaj serwery mają limit długości żądania. Jeśli dane użytkownika mają długość - 1, ponieważ przekierowanie używa tych danych i dodaje coś dodatkowego, spowoduje to wywołanie błędu wykrywalnego za pomocą zdarzeń błędów.
Jeśli w jakiś sposób możesz ustawić pliki cookie dla użytkownika, możesz również przeprowadzić ten atak, ustawiając wystarczającą liczbę plików cookie (cookie bomb), aby z zwiększoną długością odpowiedzi prawidłowej odpowiedzi wywołać błąd. W tym przypadku pamiętaj, że jeśli wywołasz to żądanie z tej samej witryny, <script>
automatycznie wyśle pliki cookie (więc możesz sprawdzić błędy).
Przykład cookie bomb + XS-Search można znaleźć w zamierzonym rozwiązaniu tego opisu: https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended
SameSite=None
lub bycie w tym samym kontekście jest zazwyczaj wymagane do tego typu ataku.
Metody włączenia: Pop-upy
Wykrywalna różnica: Kod statusu / Zawartość
Podsumowanie: Wykryj różnice w odpowiedziach, ponieważ długość odpowiedzi przekierowania może być zbyt duża, aby można było zauważyć różnicę.
Zgodnie z dokumentacją Chromium, maksymalna długość URL w Chrome wynosi 2MB.
Ogólnie rzecz biorąc, platforma internetowa nie ma ograniczeń co do długości adresów URL (chociaż 2^31 to powszechne ograniczenie). Chrome ogranicza adresy URL do maksymalnej długości 2MB z powodów praktycznych i aby uniknąć problemów z odmową usługi w komunikacji międzyprocesowej.
Dlatego jeśli adres URL przekierowania w jednym z przypadków jest większy, możliwe jest, aby przekierować z adresu URL większego niż 2MB, aby osiągnąć limit długości. Gdy to się zdarzy, Chrome wyświetla stronę about:blank#blocked
.
Widoczna różnica polega na tym, że jeśli przekierowanie zostało zakończone, window.origin
zgłasza błąd, ponieważ z innego źródła nie można uzyskać dostępu do tych informacji. Jednak jeśli limit został osiągnięty, a załadowana strona to about:blank#blocked
, origin
okna pozostaje tym z rodzica, co jest dostępną informacją.
Wszystkie dodatkowe informacje potrzebne do osiągnięcia 2MB można dodać za pomocą hasha w początkowym adresie URL, aby zostały użyte w przekierowaniu.
URL Max Length - Client SideMetody włączenia: Fetch API, Ramki
Wykrywalna różnica: Kod statusu
Podsumowanie: Użyj limitu przekierowań przeglądarki, aby ustalić wystąpienie przekierowań URL.
Przykład kodu: https://xsinator.com/testing.html#Max%20Redirect%20Leak
Jeśli maksymalna liczba przekierowań, które można śledzić w przeglądarce, wynosi 20, atakujący może spróbować załadować swoją stronę z 19 przekierowaniami i w końcu wysłać ofiarę na testowaną stronę. Jeśli błąd jest wywoływany, oznacza to, że strona próbowała przekierować ofiarę.
Metody włączenia: Ramki, Pop-upy
Wykrywalna różnica: Przekierowania
Więcej informacji: https://xsleaks.dev/docs/attacks/navigations/
Podsumowanie: Kod JavaScript manipuluje historią przeglądarki, która zapisuje odwiedzane przez użytkownika strony.
Przykład kodu: https://xsinator.com/testing.html#History%20Length%20Leak
API historii pozwala kodowi JavaScript na manipulację historią przeglądarki, która zapisuje strony odwiedzane przez użytkownika. Atakujący może użyć właściwości długości jako metody włączenia: do wykrywania nawigacji JavaScript i HTML.
Sprawdzając history.length
, zmuszając użytkownika do nawigacji na stronę, zmieniając ją z powrotem na tę samą domenę i sprawdzając nową wartość history.length
.
Metody włączenia: Ramki, Pop-upy
Wykrywalna różnica: Jeśli URL jest taki sam jak zgadywany
Podsumowanie: Możliwe jest zgadywanie, czy lokalizacja ramki/pop-upu znajduje się w określonym URL, nadużywając długości historii.
Przykład kodu: Poniżej
Atakujący może użyć kodu JavaScript do manipulacji lokalizacją ramki/pop-upu na zgadywaną i natychmiast zmienić ją na about:blank
. Jeśli długość historii wzrosła, oznacza to, że URL był poprawny i miał czas na wzrost, ponieważ URL nie jest ponownie ładowany, jeśli jest taki sam. Jeśli nie wzrosła, oznacza to, że próbował załadować zgadywany URL, ale ponieważ natychmiast po tym załadowano about:blank
, długość historii nigdy nie wzrosła podczas ładowania zgadywanego URL.
Metody włączenia: Ramki, Pop-upy
Wykrywalna różnica: Zawartość strony
Więcej informacji: https://xsleaks.dev/docs/attacks/frame-counting/
Podsumowanie: Oceń ilość elementów iframe, sprawdzając właściwość window.length
.
Przykład kodu: https://xsinator.com/testing.html#Frame%20Count%20Leak
Liczenie liczby ramek w sieci otwartych za pomocą iframe
lub window.open
może pomóc w identyfikacji statusu użytkownika na tej stronie.
Ponadto, jeśli strona ma zawsze tę samą liczbę ramek, ciągłe sprawdzanie liczby ramek może pomóc w identyfikacji wzoru, który może ujawniać informacje.
Przykładem tej techniki jest to, że w Chrome PDF może być wykrywany za pomocą liczenia ramek, ponieważ wewnętrznie używany jest embed
. Istnieją Parametry URL, które pozwalają na pewną kontrolę nad zawartością, taką jak zoom
, view
, page
, toolbar
, gdzie ta technika może być interesująca.
Metody włączenia: Elementy HTML
Wykrywalna różnica: Zawartość strony
Więcej informacji: https://xsleaks.dev/docs/attacks/element-leaks/
Podsumowanie: Odczytaj ujawnioną wartość, aby rozróżnić między 2 możliwymi stanami
Ujawnienie informacji przez elementy HTML jest problemem w bezpieczeństwie sieci, szczególnie gdy dynamiczne pliki multimedialne są generowane na podstawie informacji o użytkowniku lub gdy dodawane są znaki wodne, zmieniając rozmiar mediów. Może to być wykorzystywane przez atakujących do rozróżnienia między możliwymi stanami, analizując informacje ujawnione przez niektóre elementy HTML.
HTMLMediaElement: Ten element ujawnia duration
i buffered
czasy mediów, które można uzyskać za pomocą jego API. Przeczytaj więcej o HTMLMediaElement
HTMLVideoElement: Ujawnia videoHeight
i videoWidth
. W niektórych przeglądarkach dostępne są dodatkowe właściwości, takie jak webkitVideoDecodedByteCount
, webkitAudioDecodedByteCount
i webkitDecodedFrameCount
, oferujące bardziej szczegółowe informacje o zawartości multimedialnej. Przeczytaj więcej o HTMLVideoElement
getVideoPlaybackQuality(): Ta funkcja dostarcza szczegóły dotyczące jakości odtwarzania wideo, w tym totalVideoFrames
, co może wskazywać na ilość przetworzonych danych wideo. Przeczytaj więcej o getVideoPlaybackQuality()
HTMLImageElement: Ten element ujawnia height
i width
obrazu. Jednak jeśli obraz jest nieprawidłowy, te właściwości zwrócą 0, a funkcja image.decode()
zostanie odrzucona, co wskazuje na niepowodzenie w poprawnym załadowaniu obrazu. Przeczytaj więcej o HTMLImageElement
Metody włączenia: Elementy HTML
Wykrywalna różnica: Zawartość strony
Podsumowanie: Zidentyfikuj różnice w stylizacji strony internetowej, które korelują ze stanem lub statusem użytkownika.
Przykład kodu: https://xsinator.com/testing.html#CSS%20Property%20Leak
Aplikacje internetowe mogą zmieniać stylizację strony internetowej w zależności od statusu użytkownika. Pliki CSS z różnych źródeł mogą być osadzone na stronie atakującego za pomocą elementu link HTML, a reguły będą zastosowane do strony atakującego. Jeśli strona dynamicznie zmienia te reguły, atakujący może wykryć te różnice w zależności od stanu użytkownika.
Jako technikę wycieku, atakujący może użyć metody window.getComputedStyle
, aby odczytać właściwości CSS konkretnego elementu HTML. W rezultacie atakujący może odczytać dowolne właściwości CSS, jeśli znany jest dotknięty element i nazwa właściwości.
Metody włączenia: Elementy HTML
Wykrywalna różnica: Zawartość strony
Więcej informacji: https://xsleaks.dev/docs/attacks/css-tricks/#retrieving-users-history
Podsumowanie: Wykryj, czy styl :visited
jest zastosowany do URL, co wskazuje, że został już odwiedzony
Zgodnie z tym, to nie działa w headless Chrome.
Selektor CSS :visited
jest wykorzystywany do stylizacji URL w inny sposób, jeśli zostały wcześniej odwiedzone przez użytkownika. W przeszłości metoda getComputedStyle()
mogła być używana do identyfikacji tych różnic w stylu. Jednak nowoczesne przeglądarki wprowadziły środki bezpieczeństwa, aby zapobiec ujawnieniu stanu linku przez tę metodę. Środki te obejmują zawsze zwracanie stylu obliczonego, jakby link był odwiedzony, oraz ograniczenie stylów, które mogą być stosowane za pomocą selektora :visited
.
Pomimo tych ograniczeń, możliwe jest pośrednie rozróżnienie stanu odwiedzenia linku. Jedna z technik polega na oszukaniu użytkownika, aby interagował z obszarem dotkniętym przez CSS, wykorzystując właściwość mix-blend-mode
. Ta właściwość pozwala na mieszanie elementów z ich tłem, co może ujawniać stan odwiedzenia na podstawie interakcji użytkownika.
Ponadto, wykrycie można osiągnąć bez interakcji użytkownika, wykorzystując czasy renderowania linków. Ponieważ przeglądarki mogą renderować odwiedzone i nieodwiedzone linki w różny sposób, może to wprowadzać mierzalną różnicę czasową w renderowaniu. Dowód koncepcji (PoC) został wspomniany w raporcie błędu Chromium, demonstrując tę technikę przy użyciu wielu linków, aby wzmocnić różnicę czasową, co sprawia, że stan odwiedzenia jest wykrywalny poprzez analizę czasu.
Aby uzyskać więcej szczegółów na temat tych właściwości i metod, odwiedź ich strony dokumentacji:
:visited
: Dokumentacja MDN
getComputedStyle()
: Dokumentacja MDN
mix-blend-mode
: Dokumentacja MDN
Metody włączenia: Ramki
Wykrywalna różnica: Nagłówki
Więcej informacji: https://www.ndss-symposium.org/wp-content/uploads/2020/02/24278-paper.pdf
Podsumowanie: W Google Chrome wyświetlana jest dedykowana strona błędu, gdy strona jest zablokowana przed osadzeniem na stronie z innego źródła z powodu ograniczeń X-Frame-Options.
W Chrome, jeśli strona z nagłówkiem X-Frame-Options
ustawionym na "deny" lub "same-origin" jest osadzona jako obiekt, pojawia się strona błędu. Chrome unikalnie zwraca pusty obiekt dokumentu (zamiast null
) dla właściwości contentDocument
tego obiektu, w przeciwieństwie do iframe'ów lub innych przeglądarek. Atakujący mogą to wykorzystać, wykrywając pusty dokument, co może ujawniać informacje o stanie użytkownika, szczególnie jeśli deweloperzy niespójnie ustawiają nagłówek X-Frame-Options, często pomijając strony błędów. Świadomość i konsekwentne stosowanie nagłówków bezpieczeństwa są kluczowe dla zapobiegania takim wyciekom.
Metody włączenia: Ramki, Pop-upy
Wykrywalna różnica: Nagłówki
Więcej informacji: https://xsleaks.dev/docs/attacks/navigations/#download-trigger
Podsumowanie: Atakujący może rozpoznać pobieranie plików, wykorzystując iframe; ciągła dostępność iframe sugeruje pomyślne pobranie pliku.
Przykład kodu: https://xsleaks.dev/docs/attacks/navigations/#download-bar
Nagłówek Content-Disposition
, szczególnie Content-Disposition: attachment
, instruuje przeglądarkę, aby pobrała zawartość zamiast wyświetlać ją w linii. To zachowanie można wykorzystać do wykrywania, czy użytkownik ma dostęp do strony, która wyzwala pobieranie pliku. W przeglądarkach opartych na Chromium istnieje kilka technik wykrywania tego zachowania pobierania:
Monitorowanie paska pobierania:
Gdy plik jest pobierany w przeglądarkach opartych na Chromium, pasek pobierania pojawia się na dole okna przeglądarki.
Monitorując zmiany w wysokości okna, atakujący mogą wnioskować o pojawieniu się paska pobierania, co sugeruje, że pobieranie zostało zainicjowane.
Nawigacja pobierania za pomocą iframe:
Gdy strona wyzwala pobieranie pliku za pomocą nagłówka Content-Disposition: attachment
, nie powoduje to zdarzenia nawigacji.
Ładując zawartość w iframe i monitorując zdarzenia nawigacji, można sprawdzić, czy dyspozycja zawartości powoduje pobieranie pliku (brak nawigacji) czy nie.
Nawigacja pobierania bez iframe:
Podobnie jak w technice iframe, ta metoda polega na użyciu window.open
zamiast iframe.
Monitorowanie zdarzeń nawigacji w nowo otwartym oknie może ujawnić, czy pobieranie pliku zostało wyzwolone (brak nawigacji) czy zawartość jest wyświetlana w linii (nawigacja występuje).
W scenariuszach, w których tylko zalogowani użytkownicy mogą wyzwalać takie pobierania, te techniki mogą być używane do pośredniego wnioskowania o stanie uwierzytelnienia użytkownika na podstawie odpowiedzi przeglądarki na żądanie pobrania.
Metody włączenia: Pop-upy
Wykrywalna różnica: Czas
Więcej informacji: https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass
Podsumowanie: Atakujący może rozpoznać pobieranie plików, wykorzystując iframe; ciągła dostępność iframe sugeruje pomyślne pobranie pliku.
Dlatego ta technika jest interesująca: Chrome ma teraz podział pamięci podręcznej, a klucz pamięci podręcznej nowo otwartej strony to: (https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m=xxx)
, ale jeśli otworzę stronę ngrok i użyję fetch w niej, klucz pamięci podręcznej będzie: (https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)
, klucz pamięci podręcznej jest inny, więc pamięć podręczna nie może być dzielona. Możesz znaleźć więcej szczegółów tutaj: Zyskiwanie bezpieczeństwa i prywatności przez podział pamięci podręcznej
(Komentarz z tutaj)
Jeśli strona example.com
zawiera zasób z *.example.com/resource
, to ten zasób będzie miał ten sam klucz pamięci podręcznej, jakby zasób był bezpośrednio żądany przez nawigację na najwyższym poziomie. To dlatego, że klucz pamięci podręcznej składa się z najwyższego eTLD+1 i ramki eTLD+1.
Ponieważ dostęp do pamięci podręcznej jest szybszy niż ładowanie zasobu, możliwe jest próbowanie zmiany lokalizacji strony i anulowanie jej 20 ms (na przykład) później. Jeśli pochodzenie zostało zmienione po zatrzymaniu, oznacza to, że zasób został zbuforowany. Można również wysłać jakieś fetch do potencjalnie zbuforowanej strony i zmierzyć czas, jaki zajmuje.
Metody włączenia: Fetch API
Wykrywalna różnica: Przekierowania
Podsumowanie: Możliwe jest ustalenie, czy odpowiedź na żądanie fetch jest przekierowaniem
Przykład kodu:
Metody włączenia: Fetch API
Wykrywalna różnica: Czas
Więcej informacji: https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller
Podsumowanie: Możliwe jest próbowanie załadowania zasobu i przerwanie ładowania przed jego załadowaniem. W zależności od tego, czy wystąpił błąd, zasób był lub nie był zbuforowany.
Użyj fetch i setTimeout z AbortController, aby wykryć, czy zasób jest zbuforowany i aby usunąć konkretny zasób z pamięci podręcznej przeglądarki. Ponadto proces ten odbywa się bez buforowania nowej zawartości.
Metody włączenia: Elementy HTML (skrypt)
Wykrywalna różnica: Zawartość strony
Więcej informacji: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag
Podsumowanie: Możliwe jest nadpisanie wbudowanych funkcji i odczytanie ich argumentów, nawet z skryptu z innego źródła (którego nie można odczytać bezpośrednio), co może ujawniać cenne informacje.
Przykład kodu: https://xsleaks.dev/docs/attacks/element-leaks/#script-tag
Metody włączenia: Pop-upy
Wykrywalna różnica: Zawartość strony
Podsumowanie: Mierz czas wykonania strony internetowej za pomocą pracowników serwisowych.
Przykład kodu:
W danym scenariuszu atakujący podejmuje inicjatywę, aby zarejestrować pracownika serwisowego w jednej ze swoich domen, konkretnie "attacker.com". Następnie atakujący otwiera nowe okno na stronie docelowej z głównego dokumentu i instruuje pracownika serwisowego, aby rozpoczął timer. Gdy nowe okno zaczyna się ładować, atakujący nawigują odniesienie uzyskane w poprzednim kroku do strony zarządzanej przez pracownika serwisowego.
Po przybyciu żądania zainicjowanego w poprzednim kroku, pracownik serwisowy odpowiada kodem statusu 204 (Brak zawartości), skutecznie przerywając proces nawigacji. W tym momencie pracownik serwisowy rejestruje pomiar z timera uruchomionego wcześniej w kroku drugim. Ten pomiar jest wpływany przez czas trwania JavaScript, powodując opóźnienia w procesie nawigacji.
W pomiarze czasu wykonania możliwe jest eliminowanie czynników sieciowych, aby uzyskać dokładniejsze pomiary. Na przykład, ładując zasoby używane przez stronę przed jej załadowaniem.
Metody włączenia: Fetch API
Wykrywalna różnica: Czas (ogólnie z powodu zawartości strony, kodu statusu)
Podsumowanie: Użyj performance.now(), aby zmierzyć czas potrzebny na wykonanie żądania. Inne zegary mogą być używane.
Metody włączenia: Pop-upy
Wykrywalna różnica: Czas (ogólnie z powodu zawartości strony, kodu statusu)
Podsumowanie: Użyj performance.now(), aby zmierzyć czas potrzebny na wykonanie żądania za pomocą window.open
. Inne zegary mogą być używane.
Użyj Trickest, aby łatwo budować i automatyzować przepływy pracy zasilane przez najbardziej zaawansowane narzędzia społeczności. Uzyskaj dostęp już dziś:
Tutaj znajdziesz techniki wykradania informacji z HTML z innego źródła wstrzykując zawartość HTML. Te techniki są interesujące w przypadkach, gdy z jakiegoś powodu możesz wstrzyknąć HTML, ale nie możesz wstrzyknąć kodu JS.
Jeśli musisz wykradać zawartość i możesz dodać HTML przed sekretem, powinieneś sprawdzić powszechne techniki zawieszonych znaczników. Jednak jeśli z jakiegokolwiek powodu MUSISZ to zrobić znak po znaku (może komunikacja odbywa się przez trafienie w pamięci podręcznej), możesz użyć tego triku.
Obrazy w HTML mają atrybut "loading", którego wartość może być "lazy". W takim przypadku obraz zostanie załadowany, gdy będzie widoczny, a nie podczas ładowania strony:
Dlatego możesz dodać dużo śmieciowych znaków (na przykład tysiące "W") aby wypełnić stronę internetową przed sekretem lub dodać coś takiego jak <br><canvas height="1850px"></canvas><br>.
Jeśli na przykład nasza iniekcja pojawi się przed flagą, obraz zostanie załadowany, ale jeśli pojawi się po fladze, flaga + śmieci uniemożliwią jej załadowanie (będziesz musiał eksperymentować z ilością śmieci do umieszczenia). To się wydarzyło w tym opisie.
Inną opcją byłoby użycie scroll-to-text-fragment, jeśli jest to dozwolone:
Jednak sprawiasz, że bot uzyskuje dostęp do strony z czymś takim jak
Strona internetowa będzie wyglądać mniej więcej tak: https://victim.com/post.html#:~:text=SECR
Gdzie post.html zawiera śmieciowe znaki atakującego i obrazek ładowany leniwie, a następnie dodawany jest sekret bota.
To, co ten tekst zrobi, to sprawi, że bot uzyska dostęp do dowolnego tekstu na stronie, który zawiera tekst SECR
. Ponieważ ten tekst jest sekretem i jest tuż poniżej obrazu, obraz załaduje się tylko wtedy, gdy odgadnięty sekret jest poprawny. Tak więc masz swoje oracle do ekstrahowania sekretu znak po znaku.
Przykład kodu do wykorzystania tego: https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e
Jeśli nie ma możliwości załadowania zewnętrznego obrazu, co mogłoby wskazywać atakującemu, że obraz został załadowany, inną opcją byłoby spróbować odgadnąć znak kilka razy i to zmierzyć. Jeśli obraz jest załadowany, wszystkie żądania będą trwały dłużej niż w przypadku, gdy obraz nie jest załadowany. To zostało użyte w rozwiązaniu tego opisu podsumowanym tutaj:
Event Loop Blocking + Lazy imagesJeśli użyto jQuery(location.hash)
, możliwe jest ustalenie za pomocą czasu czy istnieje jakiś zawartość HTML, ponieważ jeśli selektor main[id='site-main']
nie pasuje, nie trzeba sprawdzać reszty selektorów:
Istnieją zalecane środki zaradcze w https://xsinator.com/paper.pdf oraz w każdej sekcji wiki https://xsleaks.dev/. Zobacz tam więcej informacji na temat ochrony przed tymi technikami.
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)