XSS: skrypty międzystronowe prostymi słowami
XSS (cross-site scripting, skrypty międzystronowe) — to sytuacja, gdy osoba trzecia sprawia, że na stronach Twojej witryny w przeglądarce odwiedzającego wykonuje się jej kod. Luka nie znajduje się w serwerze, lecz w tym, jak strona wyświetla dane przychodzące z zewnątrz: z adresu, formularza, komentarza lub profilu.
Analogia dla właściciela strony
Wyobraź sobie tablicę ogłoszeń przy wejściu do sklepu. Jeśli ktoś przyniesie notatkę „wydaj klucze do kasy osobie okazującej”, a Ty powiesisz ją nie czytając — pracownik wykona czyjąś instrukcję jako swoją. XSS działa w ten sam sposób: strona wstawia obcy tekst na stronę jako swój, a przeglądarka wykonuje wszystko, co tam się znalazło, z pełnym zaufaniem do Twojej domeny.
Jakie są rodzaje
| Typ | Gdzie występuje | Kogo dotyczy |
|---|---|---|
| Odzwierciedlony | Wartość z adresu lub formularza wraca bezpośrednio w HTML odpowiedzi | Osoby, które kliknęły w przygotowany link |
| Przechowywany | Obcy tekst został zapisany w bazie — komentarz, recenzja, nazwa profilu | Każdego, kto otworzy tę stronę |
| DOM-based | Skrypty strony same wstawiają dane z adresu do markup | Odwiedzających, przy tym w odpowiedzi serwera nie ma śladów |
Jakie niesie zagrożenia
- Przechwytywanie sesji. Obcy skrypt odczytuje cookie i loguje się do panelu lub admina w imieniu użytkownika.
- Spam i ukryte linki. Strona zaczyna promować obce tematy i traci zaufanie wyszukiwania.
- Oznaczenie w przeglądarce i wynikach. Jeśli przez lukę wprowadzono złośliwy kod, domena trafia do baz niebezpiecznych stron, odwiedzający widzi ostrzeżenie „ta strona może być szkodliwa”, a strony wypadają z indeksu.
Jak to wygląda w raporcie Security Shield
Skaner wstawia w parametrach stron nieszkodliwy znacznik i sprawdza, czy wróci on w HTML bez kodowania. Jeśli wróci — pojawia się znalezisko „Wskaźnik odzwierciedlonego XSS”: średni poziom powagi, klasa CWE-79, kategoria OWASP A03:2021. Oznaczenie „wymaga weryfikacji” oznacza, że serwis widzi powierzchnię, ale jej nie wykorzystuje.
Aktywne próby są dostępne tylko w płatnych trybach i na potwierdzonej domenie — szybkie bezpłatne sprawdzenie ich nie wykonuje. Co jeszcze jest sprawdzane — w artykule o Security Shield.
Otwórz adres i parametr z wiersza „Gdzie znaleziono” i poproś programistę o sprawdzenie, czy ta wartość jest kodowana przy wyjściu. Odzwierciedlenie surowej wartości w HTML — sygnał, że filtr tutaj nie działa.
Jak zamknąć
- Koduj wyjście. Dane od użytkownika przed wstawieniem do HTML przechodzą przez kontekstowe kodowanie: <, >, cudzysłowy i ampersand zamieniają się w bezpieczne sekwencje. W szablonach to jedna ustawienie.
- Sprawdzaj, co przychodzi. Jeśli parametr to liczba, przyjmuj tylko liczbę. Dla tekstów z markupem korzystaj z sprawdzonej biblioteki do czyszczenia HTML.
- Włącz CSP — nawet przy pomyłce w szablonie nie pozwoli wykonać obcego skryptu. Od czego zacząć, opisano w artykule o nagłówkach bezpieczeństwa.
- Zamknij cookie flagami HttpOnly i Secure, aby sesja nie mogła być odczytana z JavaScript.
- Aktualizuj CMS, motyw i wtyczki. Większość XSS na typowych stronach pochodzi z obcych rozszerzeń.
Jak zapobiec powtórzeniu
Reguła jest prosta: każde nowe pole, które widzi odwiedzający, przechodzi przez to samo bezpieczne wyjście, co pozostałe. Trzymaj CSP włączoną, powtarzaj skanowanie po wydaniach i instalacji wtyczek. Przydatny jest również SEO-audyt: nagły wzrost liczby zewnętrznych linków często okazuje się pierwszym śladem iniekcji.