Cross-Site Scripting (XSS)

Cross-site scripting – określany jako XSS – to luka w aplikacji, która może potencjalnie siać spustoszenie w aplikacjach i witrynach internetowych. XSS jest tak powszechny i potencjalnie szkodliwy, że wciąż znajduje się na liście 10 największych luk Open Web Application Security Project (OWASP).

W rzeczywistości Cross-Site Scripting jest najczęściej wykrywaną podatnością od 2014 roku, a w 2019 roku nadal pojawia się w Top 3 zgłaszanych podatności.

Top disclosed vulnerabilities – State of Open source Report 2020 by Snyk.

Co to jest Cross-Site Scripting (XSS)?

Cross-site scripting to metoda ataku na strony internetowe, która wykorzystuje rodzaj wstrzyknięcia do wszczepienia złośliwych skryptów do stron internetowych, które w przeciwnym razie byłyby produktywne i zaufane. Ogólnie rzecz biorąc, proces ten polega na wysłaniu złośliwego skryptu po stronie przeglądarki do innego użytkownika. Jest to częsty błąd bezpieczeństwa w aplikacjach internetowych i może wystąpić w dowolnym punkcie aplikacji, w którym dane wejściowe są odbierane z przeglądarki i wykorzystywane do tworzenia danych wyjściowych bez uprzedniego sprawdzenia ich poprawności lub zakodowania.

W niektórych przypadkach, skrypt po stronie przeglądarki może również wprowadzić tę lukę, pozwalając atakującemu na jej wykorzystanie bez konieczności wysyłania przez użytkownika docelowego żądania do aplikacji webowej.

Atakujący wykorzystują XSS poprzez spreparowanie złośliwego kodu, który może zostać skierowany do innego użytkownika, a następnie wykonany przez niczego nie podejrzewającą przeglądarkę. Ponieważ skrypt jest najczęściej zawarty w treści odpowiedzi aplikacji internetowej, jest on wykonywany i ma taki sam dostęp, jak gdyby skrypt był legalny. Może uzyskać dostęp do tokenów sesji, plików cookie, a nawet poufnych lub wrażliwych informacji, do których przeglądarka ma dostęp na danej stronie, a nawet przepisać zawartość strony HTML.

Zabezpiecz się przed atakami XSS

Automatycznie znajduj, ustalaj priorytety i naprawiaj luki w zależnościach open source wykorzystywanych do budowania aplikacji natywnych w chmurze

Jak działa Cross-site Scripting?

Wykorzystywanie luk w zabezpieczeniach typu cross-site scripting jest stosunkowo prostym zadaniem dla atakujących. Poprzez wstrzyknięcie złośliwego skryptu do niezabezpieczonych lub niezwalidowanych danych wejściowych dostarczonych przez przeglądarkę, atakujący powoduje, że skrypt jest zwracany przez aplikację i wykonywany w przeglądarce. Może to umożliwić przejęcie kontroli nad funkcjonalnością aplikacji, manipulowanie danymi lub podłożenie dodatkowego złośliwego kodu.

Jakie są typy ataków XSS?

Istnieją trzy główne typy ataków XSS: reflected XSS, stored XSS, DOM-based XSS.

Odbite ataki XSS

W odbitych atakach XSS, złośliwy skrypt jest wstrzykiwany do żądania HTTP (zwykle przez specjalnie spreparowany link dostarczony użytkownikowi). W najprostszej odmianie wykorzystuje on parametry wejściowe w żądaniu HTTP, które można łatwo zmanipulować, aby zawierały szkodliwą zawartość skryptu. Złośliwy skrypt jest następnie odbijany od serwera w odpowiedzi HTTP i wykonywany w przeglądarce ofiary.

W tym przypadku działa on jak przechowywany XSS bez faktycznego przechowywania złośliwych danych na serwerze.

Oto przykład ataku Reflected XSS:

Powiedzmy, że example.com/profile zawiera parametr name. Adres URL dla żądania wyglądałby następująco: https://example.com/profile?user=Tammy. Na podstawie tych danych wejściowych, aplikacja internetowa odpowiedziałaby „Hi Tammy” na górze strony. Jeśli parametry nie są walidowane, aby zapewnić, że zawierają tylko oczekiwane dane, atakujący mógłby spowodować, że użytkownik odwiedziłby złośliwą wersję adresu URL, taką jak ta: https://example.com/profile?user<script>some_malicious_code</script>.

Gdy odpowiedź jest wysyłana do przeglądarki, zawiera ona ten złośliwy skrypt, który jest następnie wykonywany w przeglądarce, prawdopodobnie nawet bez wiedzy użytkownika. Jest to przykład odbitego ataku XSS, ponieważ złośliwy kod jest natychmiast „odbijany” z powrotem do użytkownika zgłaszającego żądanie.

Zapisane ataki XSS

W tak zwanym zapisanym lub trwałym ataku XSS, złośliwa zawartość jest dostarczana bezpośrednio, wraz z odpowiedzią serwera, gdy użytkownik ładuje stronę internetową. W ten sposób treść jest już przechowywana w bazie danych witryny (stąd nazwa dla tego typu ataków). Użytkownicy po prostu wchodzą na zhakowaną stronę internetową i padają ofiarą takich ataków.

Każdy użytkownik, który otworzy taką skompromitowaną stronę internetową jest więc narażony na ryzyko kradzieży swoich danych osobowych, a więc można to uznać za najbardziej niebezpieczny rodzaj ataku XSS.

Ale jak złośliwa treść dostaje się do bazy danych na początek? W większości przypadków jest ona wprowadzana poprzez niezabezpieczone formularze stron internetowych, w których dane wejściowe użytkownika nie są odpowiednio walidowane i oczyszczane. Jeśli dane wprowadzone przez hakera nie zostaną zwalidowane zarówno po stronie klienta, jak i serwera, zostaną zapisane w bazie danych. Na przykład, takie dane wejściowe mogą zawierać obszar tekstowy komentarza, edytor tekstu postu, edytor danych osobowych lub inne formularze.

Rysunek 1: Stored or persistent XSS attack flow

Od momentu, gdy atakującemu uda się wysłać złośliwą zawartość do serwera i ta zawartość pojawi się na stronie internetowej bez filtrowania, wszyscy użytkownicy stają się potencjalnymi ofiarami.Powszechnym środkiem zaradczym na przechowywane ataki XSS jest sanityzacja danych wejściowych zarówno po stronie front-end, jak i back-end aplikacji. Sanityzacja obejmuje kombinację walidacji danych i ucieczki od znaków specjalnych lub całkowitego ich odfiltrowania i jest powszechną najlepszą praktyką w zakresie bezpieczeństwa stron internetowych i JavaScript.

Ataki XSS oparte na DOM

Document Object Model (DOM) jest interfejsem, który umożliwia aplikacjom odczytywanie i manipulowanie strukturą strony internetowej, jej zawartością i stylem. W ataku XSS opartym na DOM, luka leży w kodzie skryptu po stronie przeglądarki i może zostać wykorzystana bez żadnej interakcji z serwerem, modyfikując środowisko przeglądarki niczego niepodejrzewającej ofiary.

Niekiedy ataki XSS oparte na DOM są podobne do ataków odbitych. Powyższy przykład odbitego ataku XSS można zastosować w tym przypadku przy jednym założeniu: Aplikacja internetowa odczytuje dane bezpośrednio z ciągu zapytania.

Powiedzmy, że aplikacja używa parametru zapytania „name” w celu natychmiastowego wyświetlenia na ekranie imienia użytkownika w oczekiwaniu na załadowanie się reszty strony. Bez odpowiedniej walidacji może to przynieść taki sam rezultat, jak w przypadku ataku odbitego, jeśli hakerowi uda się skłonić ofiarę do otwarcia podejrzanego linku.

Tak jak w przypadku przechowywanego XSS, aby zapobiec atakom odbitym i opartym na DOM, programiści powinni wdrożyć walidację danych i unikać wyświetlania surowych danych wejściowych użytkownika, niezależnie od obecności lub braku komunikacji z serwerem.

Jakie są wektory ataku Cross-site Scripting?

W atakach XSS powszechnie wykorzystuje się kilka wektorów:

  • <znacznik script>: Znacznik script może być użyty do odwołania się do zewnętrznego kodu JavaScript, co sprawia, że jest to najprostszy punkt XSS. Atakujący mogą również osadzić złośliwy kod wewnątrz znacznika script.
  • Zdarzenia JavaScript: Inny popularny wektor XSS wykorzystywany przez atakujących, atrybuty zdarzeń, mogą być stosowane w różnych znacznikach. Przykładem są takie atrybuty jak „onerror” i „onload”.
  • <znacznikbody>: Atrybuty zdarzeń mogą być również źródłem skryptu, gdy są dostarczane poprzez znacznik „body”.
  • <img> znacznik: W zależności od używanej przeglądarki, atrybut ten może być przydatny przez atakujących do wykonania kodu JavaScript.
  • <iframe> znacznik: Szczególnie skuteczny w przypadku ataków phishingowych, wektor ten pozwala atakowi XSS na osadzenie innej strony HTML w bieżącej stronie.
  • <input> tag: Niektóre przeglądarki pozwalają na manipulację poprzez ten wektor, który może być wykorzystany do osadzenia skryptu.
  • <znaczniklink>: Ten znacznik może zawierać skrypt, zamiast normalnego stosowania odnośników do zewnętrznych arkuszy stylów.
  • <znacznik table>: Tam, gdzie atrybut background normalnie odnosi się do obrazu, może on zostać skompromitowany, aby odnosić się do obraźliwego skryptu.
  • <znacznikdiv>: Ten znacznik również zawiera odwołanie do tła i może być użyty w taki sam sposób jak <table> do odwołania się do skryptu.
  • <object> znacznik: Skrypty z zewnętrznej witryny mogą być dołączane za pomocą tego znacznika.

Pomimo że istnieją inne wektory, które napastnicy XSS wykorzystują w swoich wysiłkach wykradania informacji i kompromitowania witryn, są to jedne z najczęściej stosowanych metod. Programiści muszą stosować się do odpowiednich praktyk ucieczki i sanityzacji, aby uchronić się przed takimi atakami.

Jaki jest wpływ luk XSS?

XSS ma potencjał, aby siać spustoszenie w aplikacjach i witrynach. Fakt, że XSS był obecny na każdej liście OWASP top 10 ilustruje potrzebę ochrony aplikacji internetowych przed tą podatnością.

Zależnie od atakującego i jego złych intencji, ataki XSS mogą powodować różne skutki, w tym:

  • hijacking a user’s session, utilizing credentials to access other sites or redirect the user to unintintended websites,
  • altering website pages or inserting sections into a web page,
  • executing scripts to extract sensitive information from cookies or databases,
  • jeśli ofiara ma prawa administracyjne, atak może rozszerzyć się na stronę serwera, powodując dalsze szkody lub pobierając dodatkowe wrażliwe informacje.

Jak testować Cross-site Scripting?

Testowanie podatności na XSS rozpoczyna się w fazie projektowania, biorąc pod uwagę najlepsze praktyki od samego początku. Projektanci stron internetowych powinni wbudować środki bezpieczeństwa, a nie dodawać je po fakcie.
Testy wstępne obejmują skanowanie kodu w celu zidentyfikowania użycia powszechnych wektorów ataku XSS, które stanowią potencjalne podatności. Pozwala to na zniwelowanie tych słabości przed rozpoczęciem testów aplikacji.

Kluczowe kroki w testowaniu podatności XSS dla krytycznych aplikacji internetowych obejmują:

  • wykorzystanie narzędzia do skanowania kodu w celu wykrycia podatności, co pozwala na poprawki kodu podczas procesu rozwoju,
  • wdrożenie funkcji automatycznego testowania, która dokładnie i szybko ujawni potencjalne podatności.

Testuj swój kod pod kątem podatności XSS

Automatyczne znajdowanie, priorytetyzowanie i naprawianie podatności w zależnościach open source wykorzystywanych do budowania Twoich aplikacji natywnych w chmurze

Co to jest przykład Cross-site Scripting?

Skryptowanie sieciowe może zostać wykorzystane, gdy aplikacja internetowa wykorzystuje dane dostarczone przez przeglądarkę do tworzenia odpowiedzi na żądania użytkownika. Bardzo uproszczonym przykładem może być przypadek, w którym aplikacja internetowa wykorzystuje parametr w adresie URL, aby dostarczyć użytkownikowi spersonalizowaną odpowiedź.

Powiedzmy, że exmple.com/profile zawiera parametr name. Adres URL dla żądania wyglądałby jak https://example.com/profile?user=Tammy. Aplikacja internetowa odpowiada „Cześć Tammy” na górze strony na podstawie tych danych wejściowych.

Jeśli parametr użytkownika nie zostanie zweryfikowany w celu zapewnienia, że zawiera tylko oczekiwane dane, atakujący może spowodować, że użytkownik odwiedzi złośliwą wersję adresu URL, która wygląda tak:
https://example.com/profile?user<script>some_malicious_code</script>.
Gdy odpowiedź jest wysyłana do przeglądarki, zawiera ten złośliwy skrypt, który jest następnie wykonywany w przeglądarce, prawdopodobnie nawet bez wiedzy użytkownika. Jest to przykład odbitego ataku XSS. Złośliwy kod jest natychmiast „odbijany” z powrotem do użytkownika zgłaszającego żądanie.

Jak zapobiegać atakom Cross-site Scripting?

Istnieje kilka kluczowych elementów działań zapobiegających atakom XSS: zwiększenie edukacji i świadomości programistów, ekranowanie i walidacja danych wejściowych oraz skanowanie kodu w poszukiwaniu luk.

  • Edukacja i świadomość: Upewnij się, że wszyscy programiści, projektanci stron internetowych i zespoły QA są świadomi metod, jakie hakerzy stosują w celu wykorzystania luk w zabezpieczeniach oraz zapewnij wytyczne i najlepsze praktyki kodowania. Obejmuje to odpowiednie techniki ucieczki/kodowania dla środowiska aplikacji (JavaScript, HTML, itp.).
  • Sanitize input: Niezależnie od tego, czy chodzi o wewnętrzne strony internetowe, czy witryny publiczne, nigdy nie ufaj ważności danych wejściowych użytkownika. Prześwietl i zweryfikuj wszystkie pola danych, zwłaszcza jeśli będą one zawarte jako dane wyjściowe HTML.
  • Skanowanie kodu: Wdrażaj oprogramowanie, które skanuje kod pod kątem luk, w tym cross-site scripting, aby zapewnić, że najlepsze praktyki są przestrzegane i minimalizuje narażenie na XSS i inne podatności z listy OWASP.
  • Content Security Policy: Użyj Content Security Policy (CSP), aby zdefiniować, co witryna może robić, a przez to zmniejszyć ryzyko ataku XSS. Dzięki zastosowaniu CSP, XSS może zostać całkowicie zablokowany (poprzez zablokowanie wszystkich skryptów in-line) lub zredukowany do znacznie niższego ryzyka.

OWASP dostarcza dodatkowych wskazówek, jak zapobiegać podatności XSS za pomocą obszernego cheat sheet.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.