Cross-site Scripting (XSS)
Atak Cross-site Scripting (XSS) polega na wstrzyknięciu złośliwego kodu (zazwyczaj JavaScript) do aplikacji webowej, który następnie jest wykonywany w przeglądarce innego użytkownika. Dochodzi do niego, gdy dane wejściowe od użytkownika są wyświetlane na stronie bez odpowiedniego filtrowania lub kodowania.
Wyróżnia się trzy główne typy XSS:
- Stored XSS – złośliwy kod jest trwale zapisany w bazie danych lub pliku i wyświetlany innym użytkownikom,
- Reflected XSS – złośliwy kod znajduje się w URL-u i zostaje natychmiast odbity do przeglądarki użytkownika,
- DOM-based XSS – podatność występuje na poziomie klienta (JavaScript), bez udziału serwera.
Konsekwencje ataku:
- kradzież ciasteczek sesyjnych i przejęcie konta ofiary,
- podszywanie się pod użytkownika (np. administratora),
- zmiana treści strony widzianej przez ofiarę,
- przekierowanie użytkownika na stronę phishingową,
- instalacja złośliwego oprogramowania.
Jak wykryć podatność:
- Wprowadzenie skryptu testowego (np.
<script>alert(1)</script>) w pola formularzy, URL lub parametry GET/POST i obserwacja efektu, - Analiza kodu źródłowego strony w poszukiwaniu danych wejściowych wyświetlanych bez modyfikacji,
- Użycie narzędzi automatycznych, np. Burp Suite, OWASP ZAP, XSSer, DalFox.
Jak się zabezpieczyć:
- Filtrowanie danych wejściowych – odrzucanie niedozwolonych znaków i sekwencji,
- Kodowanie danych wyjściowych – np.
<zamiast<, aby przeglądarka nie interpretowała HTML-a, - Użycie nagłówków zabezpieczających, np. Content-Security-Policy,
- Unikanie dynamicznego generowania HTML-a z niesprawdzonych źródeł,
- Stosowanie frameworków i bibliotek z wbudowanymi mechanizmami zabezpieczającymi (np. React, Angular).
Przykłady testów
-
Stored XSS — Wstrzyknięcie HTML do systemu wiadomości
Zadanie: Wstrzyknij dowolny tag HTML do formularza wiadomości, tak aby został zapisany na serwerze i wyświetlony wszystkim użytkownikom.
Szczegółowy opis: Na stronie znajduje się formularz do pozostawiania wiadomości. Wprowadzone dane nie są odpowiednio filtrowane ani kodowane, co umożliwia trwałe zapisanie w treści HTML dowolnego znacznika. Celem testu jest potwierdzenie podatności typu Stored XSS poprzez przesłanie tekstu zawierającego np. tag<u>XXSTEST</u>. Po zapisaniu, wiadomość ta zostanie wyświetlona każdemu użytkownikowi odwiedzającemu stronę — wraz z osadzonym kodem HTML.KROKI:
1: W formularzu wiadomości wpisz następujący ciąg znaków:
<u>XXSTEST</u>REZULTAT:
Po wstrzyknięciu przeglądarka wyświetla „XXSTEST” gubiąc tag HTML. Oznacza to, że aplikacja jest podatna na Stored XSS — przesłany kod HTML nie został odpowiednio przefiltrowany ani zakodowany (escaped) po stronie serwera i został zapisany w bazie danych oraz zinterpretowany przez przeglądarkę przy wyświetlaniu wiadomości.
SCREEN: task-XSS1 - scr1
-
Stored XSS — Wstrzyknięcie JavaScript do systemu wiadomości
Zadanie: Wstrzyknij kod JavaScript do formularza wiadomości, tak aby został zapisany na serwerze i wykonany w przeglądarce innych użytkowników.
Szczegółowy opis: Na stronie znajduje się formularz umożliwiający pozostawienie wiadomości. Wprowadzone dane nie są odpowiednio filtrowane, co umożliwia zapisanie dowolnego kodu JavaScript w treści wiadomości. Celem testu jest potwierdzenie podatności typu Stored XSS poprzez przesłanie kodu z tagiem<script>— np.<script>alert('XSS')</script>. Po zapisaniu, kod ten zostanie wywołany automatycznie podczas odwiedzin strony przez dowolnego użytkownika.
Target: [Target_IP]KROKI:
1: Wejdz na [TARGET_IP], w formularzu wiadomości wpisz następujący ciąg znaków:
<script>alert('XSSTEST')</script>REZULTAT:
Po wstrzyknięciu i odświeżeniu strony w przeglądarce wyświetla się alert z komunikatem „XSSTEST”. Oznacza to, że aplikacja jest podatna na Stored XSS — przesłany kod JavaScript nie został przefiltrowany ani zneutralizowany, a następnie został zapisany w bazie i wykonany po stronie klienta.
SCREEN: task-XSS2 - scr1
-
Stored XSS — Wstrzyknięcie JavaScript wyświetlającego ciasteczka (document.cookie)
Zadanie: Wstrzyknij kod JavaScript, który wywoła funkcję alert(document.cookie) i wyświetli zawartość ciasteczek w przeglądarce użytkownika.
Szczegółowy opis: Na stronie znajduje się formularz wiadomości, który nie waliduje poprawnie przesyłanych danych wejściowych. Umożliwia to atakującemu zapisanie trwałego kodu JavaScript w treści wiadomości. Celem testu jest przesłanie ładunku w postaci znacznika<script>z funkcją alert(document.cookie). Po zapisaniu wiadomości, kod zostanie wykonany w przeglądarce ofiary i wyświetli zawartość ciasteczek. Ten typ ataku może prowadzić do kradzieży sesji lub innych danych przechowywanych w cookie.
Target: [Target_IP]KROKI:
1: Wejdz na [TARGET_IP], w formularzu wiadomości wpisz następujący ciąg znaków:
<script>alert(document.cookie)</script>REZULTAT:
Po odświeżeniu strony lub jej odwiedzeniu przez dowolnego użytkownika, w przeglądarce pojawi się alert zawierający zawartość ciasteczek. Oznacza to, że aplikacja jest podatna na Stored XSS, który może zostać wykorzystany m.in. do kradzieży sesji użytkownika za pomocą document.cookie.
SCREEN: task-XSS3 - scr1
-
Stored XSS — Wstrzyknięcie JavaScript z użyciem zapytania (document.cookie)
Zadanie: Wstrzyknij kod JavaScript w parametrze zapytania URL, tak aby został „odbity” w treści strony i wywołał funkcję alert(document.cookie) — pokazując zawartość ciasteczek.
Szczegółowy opis: W tym scenariuszu dane użytkownika nie są zapisywane na serwerze, lecz natychmiastowo „odbijane” w odpowiedzi HTTP i wstawiane bez filtrowania do źródła HTML. Atakujący może skonstruować złośliwy link zawierający kod JavaScript (np.<script>alert(document.cookie)</script>), który po kliknięciu przez ofiarę spowoduje wykonanie skryptu w jej przeglądarce. To typowy przykład podatności typu Reflected XSS — wykorzystywany często w phishingu oraz atakach opartych na manipulacji linkiem.
Target: [Target_IP]/reflectedKROKI:
1: Załaduj stronę z tym zapytaniem i obserwuj reakcję przeglądarki:
http://[Target_IP]/reflected/?name=<script>alert(document.cookie)</script>REZULTAT:
W przeglądarce pojawia się alert z zawartością ciasteczek, co oznacza, że aplikacja dynamicznie wstawia dane wejściowe użytkownika do źródła HTML bez odpowiedniego filtrowania. Potwierdza to podatność typu Reflected XSS, która może zostać wykorzystana do kradzieży danych sesyjnych lub przejęcia sesji użytkownika po kliknięciu spreparowanego linku.
SCREEN: task-XSS4 - scr1
SCREEN: task-XSS4 - scr2
SCREEN: task-XSS4 - scr3
-
DOM-based XSS — Wstrzyknięcie z użyciem zdarzenia onerror
Zadanie: Wstrzyknij kod JavaScript za pomocą parametru w URL, tak aby uruchomił się przez zdarzenie onerror w tagu<img>i wyświetlił ciasteczka za pomocą funkcji alert().
Szczegółowy opis: Na stronie [TARGET_IP]/dom/ dane użytkownika nie są widoczne w źródle HTML, lecz dynamicznie osadzane w strukturze DOM przy użyciu właściwości innerHTML. To znaczy, że podatność nie jest od razu widoczna w źródle strony — atak działa jedynie w kontekście renderowania DOM-u przez przeglądarkę.
Target: [Target_IP]/domKROKI:
1: Załaduj stronę z tym zapytaniem i obserwuj reakcję przeglądarki. Przykład (nieistniejący obrazek powodujący wykonanie kodu):
http://[Target_IP]/dom/#<img src="nonexistenterror" onerror="alert(document.cookie)">REZULTAT:
Po przejściu pod spreparowany adres URL zawierający ładunek w fragmencie (po znaku #), przeglądarka dynamicznie wstawia do DOM element
<img>z atrybutem onerror, co skutkuje wyświetleniem okna alert z zawartością ciasteczek. Mimo że payload nie pojawia się w źródle HTML strony, jest interpretowany przez przeglądarkę — potwierdzając podatność typu DOM-based XSS.
SCREEN: task-XSS5 - scr1
SCREEN: task-XSS5 - scr2 - (tu widac ze jest wyswietlana w zrudle strony)