Poniedziałek z trenerem – CSS Injection i kradzież sekretów

dodał 13 lutego 2018 o 21:18 w kategorii HowTo, Info  z tagami:
Poniedziałek z trenerem – CSS Injection i kradzież sekretów

Trochę czasu minęło od ostatniego wydawania „Poniedziałku z trenerem”, ale spieszymy poinformować, że nie zrezygnowaliśmy z prowadzenia cyklu. Dzisiaj poniedziałek wypada we wtorek, zatem zapraszamy do lektury.

Witamy po przerwie w następnym odcinku z serii opisów bardziej technicznych. Dziś przeczytać będzie można o tym, jak wykorzystać język CSS, by wykradać wrażliwe dane.

W poprzednich odcinkach

We wcześniejszych wpisach cyklu Poniedziałek z trenerem:

Selektory CSS

Język kaskadowego arkusza stylów posiada mnóstwo zaskakujących możliwości. Jedna z nich polega na bardzo dokładnym wyborze elementów, do których stosować ma się aktualna reguła. Na przykład przy pomocy

możemy pokolorować wszystkie linki na stronę główną Zaufanej Trzeciej Strony. Co więcej, selektor do wyboru interesującego elementu może wykorzystywać znaki specjalne – ^$, czy *, oznaczające odpowiednio początek, koniec i dowolne miejsce w ciągu. Przykładowo

pokoloruje na zielono wszystkie odnośniki do Zaufanej, bez względu na konkretną podstronę.

Sytuacja nie jest ograniczona do linków. Wybrać można dowolny element na stronie – na przykład pole formularza zawierające informacje poufne – klucz API, czy token anty-CSRF. Załóżmy, że na stronie znajduje się taki oto formularz:

Jeśli na tej samej stronie znajdzie się fragment CSS jak poniżej

dyrektywa zostanie zastosowana, bo w istocie wartość pola zaczyna się od znaku 9. Co więcej, przeglądarka spróbuje pobrać 9.png z serwera atakującego, co może zostać zaobserwowane. Daje to napastnikowi możliwość odsyłania wykradzionych informacji.

Wstrzyknięcie

Uważny czytelnik z pewnością dostrzeże pewną słabość. Jak mianowicie sprawić, by na atakowanej stronie znalazł się fragment złośliwego kodu CSS? Potrzeba tutaj wstrzyknięcia wybranej zawartości w kod podatnej strony. A przy założeniu, że możemy wstrzyknąć kod, dlaczego nie umieścić fragmentu JavaScript i nie odczytać sekretu przy jego pomocy?

Istotnie, w przypadku w którym możliwe jest wstrzyknięcie JavaScript, czyli podatność XSS, sytuacja staje się prostsza. Nie zawsze jednak jest to możliwe, jak na przykład w sytuacji, gdy odbita zawartość jest umieszczana bezpośrednio w otwartym tagu <style>

Atak może wtedy wymagać nieco więcej pracy, ale naszkicujemy jak go wykonać.

Wersja z ramkami

Jeśli aplikacja nie zawiera ochrony przez Clickjackingiem, tj. zezwala na renderowanie w ramce z innej domeny, atakujący może stworzyć witrynę, która otworzy po jednej ramce na każdą literę alfabetu, np.

Która po załadowaniu ramek odpyta o do tej pory odkryty początek ciągu:

a następnie spróbuje odgadnąć kolejną literkę:

Choć całość dokładnej implementacji, w tym kod aplikacji atakującego, można zostawić jako ćwiczenie, bardziej kompletny przykład znajdziecie tutaj.

Wersja bez ramek

Na szczęście coraz częściej strony zawierają ochronę przed umieszczaniem w ramce. Stąd pojawiła się potrzeba zademonstrowania ataku bez użycia ramek. Dylan Ayrey zademonstrował właśnie taki kod. Zamiast dodawać kolejne ramki, podatna strona otwierana jest w taki sposób:

Istotne jest, by skrypt uruchomiony był dopiero po akcji użytkownika, np. kliknięciu na stronie, oraz by to samo otwarte okienko służyło do kolejnych prób. Nikt nie lubi miliona okienek wyskakujących automatycznie i dlatego przeglądarki blokują takie zachowanie.

Dodatek

Okazuje się, że czasem możliwe jest ujawnienie pewnych informacji również bez potrzeby wstrzykiwania czegokolwiek. Można na przykład wykorzystać fakt, że odnośniki raz kliknięte mają w przeglądarce inny kolor. Co prawda dla nowoczesnych przeglądarek nie jest to już tak trywialne jak kiedyś, niemniej wciąż możliwe. Sami możecie się przekonać, w jaki sposób zmyślny fragment kodu jest w stanie odkryć Waszą historię przeglądania.

Szkolenia

A tych, którzy wciąż czują niedosyt wiedzy, zapraszamy na nasze szkolenia, prowadzone przez autora artykułu.

Bezpieczeństwo aplikacji WWW - atak i obrona

Warsaw-center-free-license-CC0
Warszawa, 19 – 21 lutego 2018

Warsaw-center-free-license-CC0
Warszawa, 16 – 18 kwietnia 2018

Czas trwania: 3 dni (20h), Prowadzący: Adam z z3s, Przemysław Sierociński
Liczba uczestników: maksymalnie 12 osób, cena: 3900 PLN netto

Szczegółowy opis szkolenia