Ataki XSS (Cross-Site Scripting)
Cross-Site Scripting (XSS) to jedna z najczęstszych luk bezpieczeństwa w aplikacjach webowych. Polega na wstrzyknięciu złośliwego kodu JavaScript do stron internetowych, który może być wykonany w przeglądarkach użytkowników. Ataki XSS mogą prowadzić do kradzieży danych, przechwycenia sesji użytkowników, a nawet przejęcia kontroli nad kontami.
Rodzaje ataków XSS
1. Stored XSS (trwały XSS)
W tym ataku złośliwy kod JavaScript jest przechowywany na serwerze i wyświetlany wszystkim użytkownikom, którzy odwiedzą stronę. Jest szczególnie niebezpieczny, ponieważ może dotknąć wielu użytkowników jednocześnie.
Przykład:
Użytkownik wprowadza w formularzu komentarza następujący kod:
<script>alert('Atak XSS!');</script>
Jeśli aplikacja nie filtruje danych wejściowych, komentarz zostanie zapisany w bazie danych i wyświetlony innym użytkownikom, uruchamiając alert w ich przeglądarkach.
2. Reflected XSS (odbijany XSS)
W tym przypadku złośliwy skrypt jest przekazywany w parametrze URL lub formularzu i odzwierciedlany na stronie bez odpowiedniego filtrowania. Jest często wykorzystywany w atakach phishingowych.
Przykład:
Użytkownik klika w link:
http://example.com/search?q=<script>alert('XSS!')</script>
Jeśli aplikacja odzwierciedla wartość parametru q
bez odpowiedniego oczyszczania, kod JavaScript zostanie wykonany w przeglądarce ofiary.
3. DOM-Based XSS
Atak ten występuje, gdy skrypt po stronie klienta manipuluje DOM-em w taki sposób, że powoduje wykonanie złośliwego kodu.
Przykład:
Kod JavaScript na stronie:
document.write("Witaj, " + window.location.hash);
Jeśli użytkownik wejdzie na stronę:
http://example.com/#<script>alert('XSS!')</script>
w przeglądarce zostanie wykonany złośliwy kod JavaScript.
XSS w kontekście Markdown
Markdown to popularny język znaczników używany do formatowania tekstu, np. w dokumentacji czy komentarzach. Niektóre implementacje Markdown pozwalają na wstawianie surowego HTML-a, co może prowadzić do ataków XSS.
Przykład:
Jeśli aplikacja pozwala użytkownikom na dodawanie treści w Markdown i nie filtruje odpowiednio HTML-a, atakujący może wprowadzić następujący kod:
<script>alert('Atak XSS w Markdown!');</script>
W zależności od implementacji, przeglądarka może wykonać ten kod i zagrozić bezpieczeństwu użytkowników.
Inny przykład dotyczy atrybutu onerror
w obrazach:
")
Jeżeli aplikacja nie blokuje atrybutów JavaScript w tagach <img>
, kod może się wykonać.
Jak zabezpieczyć aplikację przed XSS w Markdown?
- Użycie bezpiecznych parserów Markdown, np.
marked
w trybie „sanitize” lubcommonmark
. - Filtracja niebezpiecznych tagów HTML – usuwanie
<script>
,<iframe>
,onerror
,onload
itp. - Escapowanie wyjścia – konwertowanie znaków
<>
na<
i>
. - Ograniczenie obsługi HTML w Markdown – np. poprzez wymuszenie czystego Markdown bez osadzonego HTML-a.
Jak zabezpieczyć aplikację przed XSS?
- Filtrowanie i walidacja danych wejściowych – należy unikać bezpośredniego wstawiania danych użytkownika do HTML.
- Użycie funkcji do kodowania danych – np.
htmlspecialchars()
w PHP czyescape()
w JavaScript. - CSP (Content Security Policy) – ograniczenie możliwości wykonywania nieautoryzowanego kodu JavaScript.
- HttpOnly dla ciasteczek – zapobiega kradzieży sesji przez JavaScript.
- Unikanie
innerHTML
idocument.write
– zamiast tego należy używaćtextContent
.
Wykrywanie XSS
Oto funkcja Valid::not_xss w PHP, która wykrywa potencjalne ataki XSS, w tym w dokumentach Markdown:
class Valid {
public static function not_xss(string $input): bool {
// Przypadki ataków XSS w HTML i JavaScript
$patterns = [
'/<script.*?>.*?<\/script>/is', // Wykrywanie znaczników <script>
'/javascript:/i', // Wykrywanie wywołań "javascript:"
'/on[a-z]+\s*=\s*["\']?[^"\'>]+["\']?/i', // Wykrywanie zdarzeń JS np. onerror="..."
'/<.*?href\s*=\s*["\']?javascript:[^>]+>/i', // Wykrywanie href="javascript:"
'/<.*?style\s*=\s*["\']?expression\(.*?\)/i', // Wykrywanie expression() w CSS
'/vbscript:/i', // Wykrywanie VBScript (stare ataki IE)
'/data\s*:.*?base64,.*?(<script|on[a-z]+\s*=)/i', // Wykrywanie ataków base64
];
// Przypadki ataków XSS w Markdown
$markdown_patterns = [
'/\[.*?\]\(\s*javascript:.*?\)/i', // [tekst](javascript:alert(1))
'/!\[.*?\]\(\s*data:image\/.*?;base64,.*?\)/i', // 
];
foreach (array_merge($patterns, $markdown_patterns) as $pattern) {
if (preg_match($pattern, $input)) {
return false; // Znaleziono podejrzaną treść
}
}
return true; // Brak wykrytych ataków XSS
}
}
Podsumowanie
Ataki XSS są poważnym zagrożeniem dla aplikacji webowych, jednak można się przed nimi skutecznie bronić poprzez odpowiednie praktyki programistyczne. Regularne testowanie zabezpieczeń i stosowanie polityk bezpieczeństwa to klucz do ochrony użytkowników przed skutkami tych ataków.