PostMessage Vulnerabilities
Luki PostMessage
WhiteIntel to wyszukiwarka zasilana przez dark web, która oferuje darmowe funkcje do sprawdzania, czy firma lub jej klienci zostali skompromitowani przez złośliwe oprogramowanie kradnące informacje.
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
Możesz sprawdzić ich stronę internetową i wypróbować ich silnik za darmo pod adresem:
Wyślij PostMessage
PostMessage używa następującej funkcji do wysyłania wiadomości:
Zauważ, że targetOrigin może być '*' lub adresem URL, na przykład https://company.com. W drugim scenariuszu wiadomość może być wysłana tylko do tej domeny (nawet jeśli pochodzenie obiektu okna jest inne). Jeśli używany jest znak wieloznaczny, wiadomości mogą być wysyłane do dowolnej domeny, i zostaną wysłane do pochodzenia obiektu okna.
Atakowanie iframe i znaku wieloznacznego w targetOrigin
Jak wyjaśniono w tym raporcie, jeśli znajdziesz stronę, która może być osadzona w iframe (bez ochrony X-Frame-Header
) i która wysyła wrażliwą wiadomość za pomocą postMessage używając znaku wieloznacznego (*), możesz zmodyfikować pochodzenie iframe i ujawnić wrażliwą wiadomość do domeny kontrolowanej przez ciebie.
Zauważ, że jeśli strona może być osadzona w iframe, ale targetOrigin jest ustawiony na adres URL, a nie na znak wieloznaczny, ten sztuczka nie zadziała.
Wykorzystanie addEventListener
addEventListener
to funkcja używana przez JS do zadeklarowania funkcji, która oczekuje na postMessages
.
Zostanie użyty kod podobny do poniższego:
Zauważ w tym przypadku, jak pierwszą rzeczą, którą robi kod, jest sprawdzenie pochodzenia. Jest to niezwykle ważne, głównie jeśli strona ma wykonać jakiekolwiek czynności wrażliwe z otrzymanymi informacjami (np. zmiana hasła). Jeśli nie sprawdzi pochodzenia, atakujący mogą zmusić ofiary do wysłania dowolnych danych do tych punktów końcowych i zmienić hasła ofiar (w tym przykładzie).
Wyliczanie
Aby znaleźć nasłuchiwaczy zdarzeń na bieżącej stronie, można:
Przeszukać kod JS w poszukiwaniu
window.addEventListener
i$(window).on
(wersja JQuery)Wykonać w konsoli narzędzi deweloperskich:
getEventListeners(window)
Przejdź do Elementy --> Nasłuchiwacze zdarzeń w narzędziach deweloperskich przeglądarki
Użyj rozszerzenia przeglądarki takiego jak https://github.com/benso-io/posta lub https://github.com/fransr/postMessage-tracker. Te rozszerzenia przeglądarki przechwycą wszystkie wiadomości i pokażą je Tobie.
Ominięcia sprawdzania pochodzenia
Atrybut
event.isTrusted
jest uważany za bezpieczny, ponieważ zwracaTrue
tylko dla zdarzeń generowanych przez autentyczne działania użytkownika. Chociaż jego poprawne zaimplementowanie może być wyzwaniem do ominięcia, jego znaczenie w kontekście kontroli bezpieczeństwa jest znaczące.Użycie
indexOf()
do walidacji pochodzenia w zdarzeniach PostMessage może być podatne na ominięcie. Przykład ilustrujący tę podatność to:
Metoda
search()
zString.prototype.search()
jest przeznaczona do wyrażeń regularnych, a nie do ciągów znaków. Przekazanie czegokolwiek innego niż wyrażenie regularne prowadzi do konwersji domyślnej na wyrażenie regularne, co może sprawić, że metoda będzie potencjalnie nieskuteczna. Dzieje się tak, ponieważ w wyrażeniach regularnych kropka (.) działa jako symbol wieloznaczny, umożliwiając ominięcie walidacji przy specjalnie spreparowanych domenach. Na przykład:
Funkcja
match()
, podobnie jaksearch()
, przetwarza wyrażenia regularne. Jeśli wyrażenie regularne jest nieprawidłowo zbudowane, może być podatne na ominięcie.Funkcja
escapeHtml
ma na celu oczyszczenie wejść poprzez unikanie znaków. Jednakże nie tworzy nowego obiektu unikniętego, ale nadpisuje właściwości istniejącego obiektu. To zachowanie może być wykorzystane. W szczególności, jeśli obiekt można manipulować w taki sposób, że jego kontrolowana właściwość nie uznajehasOwnProperty
,escapeHtml
nie będzie działać zgodnie z oczekiwaniami. Przedstawia to poniższe przykłady:Oczekiwane niepowodzenie:
Ominięcie unikania:
W kontekście tej podatności obiekt File
jest szczególnie podatny ze względu na swoją tylko do odczytu właściwość name
. Ta właściwość, gdy używana w szablonach, nie jest oczyszczana przez funkcję escapeHtml
, co prowadzi do potencjalnych zagrożeń dla bezpieczeństwa.
Właściwość
document.domain
w JavaScript może być ustawiona przez skrypt w celu skrócenia domeny, co pozwala na bardziej elastyczną egzekucję polityki tego samego pochodzenia w obrębie tej samej domeny nadrzędnej.
Ominięcie e.origin == window.origin
Podczas osadzania strony internetowej w zabezpieczonym iframe za pomocą %%%%%%, istotne jest zrozumienie, że pochodzenie ramki iframe zostanie ustawione na null. Jest to szczególnie istotne przy korzystaniu z atrybutów sandbox i ich wpływu na bezpieczeństwo i funkcjonalność.
Poprzez określenie allow-popups
w atrybucie sandbox, każde okno popup otwarte z ramki iframe dziedziczy ograniczenia sandboxa swojego rodzica. Oznacza to, że chyba że atrybut allow-popups-to-escape-sandbox
jest również uwzględniony, pochodzenie okna popup jest również ustawione na null
, zgodnie z pochodzeniem ramki iframe.
W rezultacie, gdy otwarte są okna popup w tych warunkach i wiadomość jest wysyłana z ramki iframe do okna popup za pomocą postMessage
, zarówno nadawca, jak i odbiorca mają swoje pochodzenia ustawione na null
. Ta sytuacja prowadzi do scenariusza, w którym e.origin == window.origin
jest prawdziwe (null == null
), ponieważ zarówno ramka iframe, jak i okno popup mają taką samą wartość pochodzenia null
.
Aby uzyskać więcej informacji, przeczytaj:
pageBypassing SOP with Iframes - 1Ominięcie e.source
Możliwe jest sprawdzenie, czy wiadomość pochodzi z tego samego okna, na którym skrypt nasłuchuje (szczególnie interesujące dla Skryptów zawartości z rozszerzeń przeglądarki w celu sprawdzenia, czy wiadomość została wysłana z tej samej strony):
Możesz wymusić, aby e.source
wiadomości było nullem, tworząc iframe, który wysyła postMessage i jest natychmiast usuwany.
Po więcej informacji czytaj:
pageBypassing SOP with Iframes - 2Ominięcie nagłówka X-Frame
Aby przeprowadzić te ataki, idealnie byłoby umieścić stronę ofiary w iframe
. Jednak niektóre nagłówki, takie jak X-Frame-Header
, mogą zapobiec temu zachowaniu.
W takich scenariuszach nadal można użyć mniej dyskretnego ataku. Można otworzyć nową kartę do podatnej aplikacji internetowej i komunikować się z nią:
Kradzież wiadomości wysłanej do dziecka poprzez zablokowanie głównej strony
Na poniższej stronie możesz zobaczyć, jak można ukraść wrażliwe dane postmessage wysłane do dziecięcego iframe'a, blokując główną stronę przed wysłaniem danych i wykorzystując XSS w dziecku, aby wyciec dane przed ich otrzymaniem:
pageBlocking main page to steal postmessageKradzież wiadomości poprzez modyfikację lokalizacji iframe'a
Jeśli możesz osadzić stronę internetową za pomocą nagłówka X-Frame-Options, która zawiera inne iframe, możesz zmienić lokalizację tego dziecinnego iframe'a, więc jeśli odbiera on postmessage wysłane za pomocą gwiazdki, atakujący może zmienić pochodzenie tego iframe'a na stronę kontrolowaną przez siebie i ukraść wiadomość:
pageSteal postmessage modifying iframe locationpostMessage do zanieczyszczenia prototypu i/lub XSS
W przypadkach, gdy dane wysyłane za pomocą postMessage
są wykonywane przez JS, możesz osadzić stronę i wykorzystać zanieczyszczenie prototypu/XSS, wysyłając exploit za pomocą postMessage
.
Kilka bardzo dobrze wyjaśnionych XSS poprzez postMessage
można znaleźć pod adresem https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html
Przykład wykorzystania do nadużycia zanieczyszczenia prototypu, a następnie XSS za pomocą postMessage
do iframe
:
Dla więcej informacji:
Link do strony o zanieczyszczeniu prototypu
Link do strony o XSS
Link do strony o zanieczyszczeniu prototypu po stronie klienta do XSS
Referencje
Aby ćwiczyć: https://github.com/yavolo/eventlistener-xss-recon
WhiteIntel to wyszukiwarka zasilana przez dark web, która oferuje darmowe funkcje do sprawdzania, czy firma lub jej klienci zostali skompromitowani przez złośliwe oprogramowanie kradnące dane.
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za darmo pod adresem:
Last updated