Wpis z mikrobloga

#zagadkihakerskie #programowanie #xss #js #html

Ostatnio rzuciłem kolejne wyzwanie związane z bezpieczeństwem stron internetowych. Strona pod adresem http://hakerium.cba.pl/zad2/ jest podatna na błąd typu Cross-Site Scripting (XSS) i celem zadania było dołączenie pliku z zewnętrznej domeny. Zaproponowałem plik spod adresu http://pastebin.com/raw.php?i=mYM90ckz który po prostu wyświetla alert, ale oczywiście można go dużo bardziej rozwinąć.

Sama strona umożliwiała dodawanie komentarzy o długości co najwyżej 100 znaków. Zacznijmy od analizy jak ta strona działa i dlaczego istnieje na niej podatność. (Sugeruję, żebyście samemu chwilę się stroną pobawili, żeby wiedzieć o czym ja dalej piszę :))

Na wstępie zobaczmy co w ogóle na stronie się dzieje przy dodawaniu komentarza. Zacznijmy od dodania prostego komentarza o treści

abc
. Zajrzyjmy teraz do HTML-a:

abc
Pierwsza rzecz, którą zawsze sprawdzamy to jest czy strona enkoduje znaki, które są istotne z punktu widzenia składni HTML-a, a więc:

" ' < > &
. Wpiszmy więc komentarz

abc"'<>&
i sprawdźmy co się dzieje:

abc"'<>&
Okazuje się więc, że odpada najprostsza metoda ataku czyli dodanie własnego tagu HTML-owego wewnątrz

div
a, ponieważ znak < jest enkodowany do <. Zwracamy jednak uwagę na fakt, że wartość atrybutu

title
nie jest umieszczona w cudzysłowiach. Być może więc możemy w naszym komentarzu dodać spację i stworzyć nowy atrybut? Dodajmy komentarz

abc onmouseover=alert(1)
:

abc onmouseover=alert(1)
Spacja nie została w żaden sposób zenkodowana i dodaliśmy nowy atrybut! Teraz wystarczy przejechać kursorem po komentarzu i zobaczymy, że pojawi się alert o treści "1".

Naszym zadaniem nie było jednak wyświetlanie takich alertów, ale dołączenie pliku JS z zewnętrznej domeny. W tym celu możemy skorzystać z faktu, że strona używa jQuery i użyć metody jQuery.getScript (dzięki @mero3 za to!). Gdybyśmy nie mieli dostępu do jQuery, wówczas można samemu zrobić znacznik
  • 4
Ochrona przed zagrożeniem:

Błąd na tej stronie jest całkiem ciekawy, ponieważ strona enkoduje dane wyjściowe (tj. np. znak

<
jest zamieniany na

<
, a

"
jest zamieniany na

"
). Pomimo tego i tak udaje się znaleźć podatność i wykorzystać błąd. Wynika to z niedostosowania się do pewnych dobrych standardów w HTML-u. W tym przypadku wystarczyło atrybut wartość atrybutu

title
umieścić w cudzysłowach i błędu już by nie było. Wniosek jest