XSS – prosty atak na stronę z formularzem

By | 11 lutego 2018

Jakiś czas temu rejestrowałem się na pewnej stronie internetowej. Podczas procesu rejestracji zauważyłem, że po wypełnieniu formularza, w następnym kroku, wpisane przeze mnie dane wyświetlone są w celu ich potwierdzenia. Dodatkowo mogłem cofnąć się do formularza i poprawić wprowadzane dane. Takie zachowanie, zwykle kusi mnie, aby sprawdzić, czy autor aplikacji prawidłowo radzi sobie z ochroną przed atakiem typu XSS – Cross Site Scripting.

W pierwszej kolejności w części pól wprowdziłem prosty test na wykorzystywanie kodowania HTML:

'';!--"<TEST>=&{()}

i zatwierdziłem formularz. Wynik był bardziej niż obiecujący.

<p class="data">'';!--"<TEST>=&{()}</p>

Żaden z wprowadzonych znaków nie został poddany kodowaniu HTML. Co więcej, wprowadzony tag HTML nie został usunięty, co oznacza, że prawdopodobnie na danych wejściowych nie są przeprowadzane żadne testy na zawartość kody HTML. Postanowiłem wyedytować dane i wprowadziłem standardowy kod wyświetlający okienko z pomocą Java Script.

<script>alert(1);</script>

Po przejściu na kolejną stronę oczywiście okienko się pojawiło, co dowodzi istnieniu podatności XSS. Co więcej, analizując parametry kolejnych żądań, okazało się, że wartości wprowadzane w formularzu rejestracyjnym zostały już zapisane w bazie danych przed wyświetleniem strony do potwierdzenia danych (tzw. „persistent XSS”). Stwarza to jeszcze większe możliwości do nadużyć, gdyż zapisane dane mogą być teraz wyświetlone na bardziej wrażliwych stronach aplikacji, np. w panelu administratora.

Skoro XSS występował na stronie wyświetlającej moje dane, zastanowiałem się czy jestem w stanie jeszcze bardziej poszerzyć wektor mojego „ataku”. Okazało się, że gdy wracam do formularza rejestracyjnego w celu poprawy wprowadzonych danych kod pól formularza wygląda tak:

<input class="form-control" type="text" name="data" value="<script>alert(1);</script>" maxlength="35"/>

Powstaje pytanie, czy da się tak zmodyfikować kod skryptu aby, działał w obu przypadkach (kontekstach)? Spróbujmy…
Widać, że wprowadzona wartość nie wykona się, gdyż znajduje się tym razem wewnątrz wartości atrybutu „value” tagu „input”. Aby zadział musimy nasz atak musi wykonać kilka czynności:

  1. zamknąć atrybut cudzysłowem podwójnym „””,
  2. zamknąć tag „input”,
  3. wprowadzić skrypt,
  4. wykomentować parametr „maxlength”

Zobaczmy jak może wyglądać taki atak:

"/><script>alert(1);</script><!--

, a wynikowy kod HTML wygląać będzie wtedy tak:

<input class="form-control" type="text" name="data" value=""/><script>alert(1);</script><!--" maxlength="35"/>

Oczywiście jest to tylko jedna z możliwości jaką możemy wykorzystać.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *