Przejdź do głównej treści

Ataki XSS (Cross-Site Scripting)

Ataki XSS

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:

![złośliwy obraz](x "onerror=alert('XSS w Markdown!')")

Jeżeli aplikacja nie blokuje atrybutów JavaScript w tagach <img>, kod może się wykonać.

Jak zabezpieczyć aplikację przed XSS w Markdown?

  1. Użycie bezpiecznych parserów Markdown, np. marked w trybie „sanitize” lub commonmark.
  2. Filtracja niebezpiecznych tagów HTML – usuwanie <script>, <iframe>, onerror, onload itp.
  3. Escapowanie wyjścia – konwertowanie znaków <> na &lt; i &gt;.
  4. Ograniczenie obsługi HTML w Markdown – np. poprzez wymuszenie czystego Markdown bez osadzonego HTML-a.

Jak zabezpieczyć aplikację przed XSS?

  1. Filtrowanie i walidacja danych wejściowych – należy unikać bezpośredniego wstawiania danych użytkownika do HTML.
  2. Użycie funkcji do kodowania danych – np. htmlspecialchars() w PHP czy escape() w JavaScript.
  3. CSP (Content Security Policy) – ograniczenie możliwości wykonywania nieautoryzowanego kodu JavaScript.
  4. HttpOnly dla ciasteczek – zapobiega kradzieży sesji przez JavaScript.
  5. Unikanie innerHTML i document.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', // ![alt](data:image/…)
        ];

        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.

6 marca 2025 10

Kategorie

Ocena wpisu

Dziękujemy!
()

Powiązane wpisy


Używam plików cookie

Moja strona wykorzystuje niezbędne pliki cookie i local storage, które są konieczne do prawidłowego działania strony i świadczenia usług. Możesz dowiedzieć się więcej w mojej polityce prywatności.