Jedną z najczęstszych klas luk w zabezpieczeniach witryn internetowych jest „Cross-Site Scripting” lub „XSS”. Luki XSS to miejsca, w których użytkownik może spowodować wykonanie JavaScript. Istnieje wiele różnych wariantów luki XSS o różnym stopniu ważności.
Problem z tym, że atakujący jest w stanie wykonać JavaScript w sesjach innych użytkowników, polega na tym, że osoba atakująca może wtedy zrobić cokolwiek ze stroną internetową, którą widzą ofiary. Obejmuje to przekierowywanie ofiar na zewnętrzne strony internetowe, kradzież tokenów uwierzytelniających i monitorowanie szczegółów płatności.
Najpoważniejszą formą luki XSS jest „Stored” lub „Persistent” Cross-Site Scripting, w którym atakujący może stworzyć ładunek XSS, a następnie przesłać go, aby został zapisany w bazie danych. Po zapisaniu exploita XSS w bazie danych możliwe jest, że będzie on oddziaływał na innych użytkowników przez dłuższy czas.
Inną formą Cross-Site Scripting jest „Reflected”, ten typ nie jest w żadnym momencie zapisywany, zamiast tego ładunek jest dołączany do przeglądarki. Zazwyczaj ten typ XSS jest częścią ataków phishingowych, w których atakujący próbuje nakłonić ofiarę do kliknięcia złośliwego łącza.
Ogólnie rzecz biorąc, większość ataków XSS ma w pewnym momencie ładunek wysyłany do serwera, ale niektóre ataki są czysto po stronie klienta, nigdy nie są wysyłane do serwera, a zamiast tego wpływają tylko na JavaScript po stronie klienta. Nazywa się to XSS opartym na DOM, ponieważ pozostaje w JavaScript Document Object Model lub DOM. Ten rodzaj luki jest szczególnie trudny do zidentyfikowania i usunięcia, ponieważ exploity nigdy nie są widziane przez serwer, a więc nie mogą być rejestrowane.
Historycznie technika zapobiegania podatnościom XSS polegała na filtrowaniu wszystkich danych przesłanych przez użytkowników przy użyciu list bloków do odrzucania wszelkich wiadomości zawierających znaczące znaki lub słowa w JavaScript. Prowadziło to zwykle do wyścigu zbrojeń w poszukiwaniu obejścia filtra, jednocześnie uniemożliwiając niektóre legalne zgłoszenia użytkowników. Poprawnym rozwiązaniem jest użycie encji HTML do kodowania danych przesłanych przez użytkownika. przy włączonych modułach encji HTML znaki są automatycznie kodowane do formatu, w którym przeglądarka wie, że ma wyświetlać je jako poprawne symbole, ale nie traktować ich jako kodu.