Jedno pole wyszukiwania.
Zaufana domena mówiła głosem atakującego.
Techniczne case study XSS: marker, kontekst renderowania, reflected vs stored, wpływ na biznes, CSP, DOM XSS i praktyczne rekomendacje naprawcze.
w jednym kontekście
frontendu
nie naprawia
pracownik/admin
XSS nie jest “stare i nudne”, gdy działa w zaufanej domenie
Cross-Site Scripting bywa lekceważony, bo „przecież mamy HttpOnly” albo „to tylko alert”. W realnym pentestcie XSS oceniamy przez kontekst: gdzie wykonuje się skrypt, kto widzi payload, czy można modyfikować UI, podszyć się pod komunikat systemowy, wywołać akcje w aplikacji albo zaatakować pracownika w panelu.
Ten case jest zanonimizowany i bezpieczny. Nie pokazujemy payloadów do kradzieży sesji, omijania filtrów ani ataków na użytkowników. Używamy markerów typu BSTA_XSS_MARKER i neutralnych fragmentów HTML pokazujących brak encodingu.
Najpierw szukamy odbicia kontrolowanego tekstu
Odbicie markera nie jest jeszcze podatnością. Kluczowe pytanie brzmi: czy aplikacja koduje znaki specjalne odpowiednio do kontekstu HTML, atrybutu, JavaScriptu albo URL?
Aplikacja kodowała część miejsc, ale nie wszystkie
Filtr wejścia nie rozwiązuje XSS. Potrzebne jest kodowanie wyjścia zależne od kontekstu. Ten sam parametr może być bezpieczny w jednym miejscu i podatny w drugim.
Od markera do manipulacji zaufanym UI
W bezpiecznym PoC nie wykonywaliśmy agresywnego JavaScriptu. Pokazaliśmy, że można wstawić kontrolowany element w zaufanej domenie i zmienić komunikat widoczny dla użytkownika. Dla biznesu to ważniejsze niż alert: XSS może stać się phishingiem wewnątrz prawdziwej aplikacji.
Jeżeli ta sama ścieżka jest dostępna dla zalogowanych użytkowników albo administratorów, wpływ rośnie: fałszywe komunikaty, linki do akcji, clickjacking-like UI deception, wykonywanie requestów w kontekście użytkownika i pivot do innych podatności.
Najgroźniej, gdy payload zapisuje się w systemie
Reflected XSS w publicznej wyszukiwarce może być Medium. Stored XSS widoczny w panelu pracownika, moderatora albo administratora zwykle podnosi wagę do High, bo zmienia odbiorcę i zaufany kontekst.
To możliwość mówienia do użytkownika głosem Twojej domeny.
Co sprawdzamy poza samym payloadem
Kontekst renderowania
HTML body, atrybut, URL, inline JS i template mają różne reguły kodowania. Jeden sanitizer nie wystarczy.
Content Security Policy
Dobra CSP ogranicza skutki XSS, ale nie zastępuje encodingu. Sprawdzamy nonce, unsafe-inline, allowlisty i report-uri.
DOM XSS
Część XSS nie wraca z serwera. Powstaje w JavaScript przez innerHTML, dangerouslySetInnerHTML, document.write albo niebezpieczne templatingi.
Odbiorca payloadu
Inny wpływ ma XSS widoczny tylko dla autora, a inny payload, który trafia do moderatora, supportu lub admina.
Jak zamknąć XSS w praktyce
1. Encoding outputu w kontekście. HTML escape dla treści, attribute escape dla atrybutów, URL validation dla linków, brak inline JS z danymi użytkownika.
2. Bezpieczne komponenty UI. W React/Next unikaj dangerouslySetInnerHTML, a jeśli musisz renderować HTML, użyj sprawdzonego sanitizera i allowlisty tagów.
3. CSP jako ograniczenie skutków. Nonce dla skryptów, brak unsafe-inline, ograniczone connect-src/img-src, raportowanie naruszeń.
4. Testy regresyjne markerów. Dodaj testy z markerami HTML/JS dla każdego pola, które trafia do UI publicznego lub panelu administracyjnego.
Chcesz wiedzieć, czy Twoja aplikacja jest odporna na XSS?
Przetestujemy reflected, stored i DOM XSS, output encoding, CSP, panele administracyjne oraz realny wpływ na użytkowników i procesy biznesowe.
Zamów test bezpieczeństwa →