15-11-2018 / Od 0 do pentestera

Clickjacking

Jak przekonać użytkownika do usunięcia swojego konta w serwisie internetowym bez jego zgody?

Jak działa atak Clickjacking?

Większość serwisów, aby być w zgodzie z obecnie funkcjonującym, prawem musi posiadać funkcjonalność usunięcia konta.

Usuń konto

Jak taki formularz może wyglądać?

Mamy tutaj pole tekstowe z losową wartością wygenerowaną przez serwer w momencie tworzenia formularza.

Po wciśnięciu przycisku Usuń konto wartość ta jest sprawdzana przez serwer.

Jeżeli wartość zgadza się z tą wygenerowaną wcześniej przez serwer - konto zostaje usunięte.

W innym przypadku otrzymujemy komunikat błędu.

Formularz usunięcia konta

Dzięki temu osoba z zewnętrz nie jest w stanie przygotować wcześniej formularza usunięcia konta z prawidłowym tokenem, a następnie podłożyć go nam do kliknięcia.

Nie zna bowiem prawidłowej wartości. Dzięki temu chronimy się przed atakiem CSRF, w którym to użytkownik nieświadomie przesyła do serwera żądanie spreparowane przez osoby o wrogich zamiarach.

Dzisiaj jednak o Clickjacking, czyli innej metodzie ataku.

HTML pozwala na osadzanie we wnętrzu naszej strony zewnętrznych witryn.

Można tego dokonać przy pomocy tagu iframe1.

Tag IFRAME

W parametrze src podajemy adres i tyle.

Na naszej stronie pojawiła się treść z zewnętrz.

Możemy dowolnie modyfikować wielkość osadzonej ramki, a także zmieniać jej położenie względem naszej strony.

Możemy także sprawić, aby była niewidoczna da użytkownika.

I właśnie kombinacja tych elementów zostanie teraz wykorzystana.

Najlepiej zademonstrować to na przykładzie. Posłużę się do tego celu skryptem clickbandit z narzędzia Burp Suite.

Burp Clickbandit

Z menu aplikacji wybieram odpowiednią opcję i kopiuję treść skryptu.

Teraz na stronie, którą chcę zaatakować otwieram konsolę deweloperską i wklejam do niej zawartość schowka.

W ten sposób uruchomiłem oprogramowanie pomagające w przeprowadzaniu ataków Clickjacking.

Następnie klikam "Start".

Teraz mogę wybrać miejsca, które mają zostać kliknięte przez niczego nieświadomą ofiarę.

W naszym wypadku jest to guzik Usuń konto.

Tych miejsc może być wiele - nam jednam wystarczy to jedno.

Kończę pracę generatora przyciskiem Finish.

Tworzenie ataku clickjacking

Jak widzisz skrypt stworzył teraz czerwony przycisk z napisem Click.

Jest on idealnie umieszczony w taki sposób, aby leżał bezpośrednio nad przyciskiem Usuń konto.

O co chodzi? Wyłączmy przezroczystość oraz zapiszmy wygenerowany kod.

Atak clickjacking w praktyce

Naszym oczom ukazała się biała strona z jednym czerwonym przyciskiem zachęcający do kliknięcia.

Ani śladu zewnętrznego serwisu.

Jednak to, że go nie widać, nie oznacza, że nie jest wyświetlany na danej stronie.

Możemy to potwierdzić przeglądając opcje deweloperskie.

Zewnętrzna strona jest załadowana przez Chrome.

Konsola deweloperska

Zobaczmy co się stanie po wciśnięciu przycisku.

Otrzymaliśmy komunikat o tym, że zostaliśmy zaatakowani.

Dodatkowo, do serwera został wysłany prawidłowy formularz z prawidłowym tokenem, który sprawił, że nasze konto zostało usunięte.

Jeżeli wyłączymy przezroczystość zobaczymy jak atak działa w praktyce.

Atak w trybie demo

Na stronie wyświetliliśmy zawartość zewnętrznej witryny przy pomocy tagu iframe.

Używając kaskadowych arkuszy styli sprawiliśmy, że treść okienka jest niewidoczna dla użytkownika.

Dodatkowo w miejscu przycisku narysowaliśmy kolorowy prostokąt.

Użytkownik myśli więc, że klika w prostokąt na naszej stronie - nie widzi bowiem przycisku zewnętrznej strony z powodu CSS.

Tak naprawdę jednak klika w przycisk znajdujący się w iframe.

Informacja o ataku

Prawdopodobieństwo ataku zależy zatem od naszej kreatywności.

Musimy bowiem przekonać użytkownika do kliknięcia w przycisk.

Sposobów jest wiele - chociażby stworzenie fałszywej ankiety,

Ale dlaczego nie zadziałała obrona przed CSRF?

Jakim cudem atakujący poznał treść losowego tokena?

Odpowiedź jest prosta. Nie musiał jej znać. Nie tworzyliśmy bowiem fałszywego formularza usuwania konta a wykorzystywaliśmy prawdziwy, używany normalnie na stronie.

Wszystko przez tag iframe.

Jak się chronić przed tym atakiem?

Wystarczy aby na naszej stronie dodać specjalny nagłówek:

header("X-Frame-Options: DENY");

Przeglądarka widząc taki nagłówek nie pozwoli na wyświetlenie naszej strony przy pomocy iframe.

Próbując wykonać jeszcze raz nasz atak tym razem w konsoli przeglądarki otrzymamy informację, że nasza strona nie została wyświetlona z powodu nagłówka.

Informacja o błędzie

W przeszłości ataki tego rodzaju były wykorzystywane do kradzieży lajków, między innymi na Facebooku2.

Facebook

Atakujący umieszczali stronę Facebooka i ustalali na swojej stronie przyciski w takich miejscach, iż niczego nieświadomy użytkownik lajkował dany fanpage.

Icon made by Freepik, Alfredo Hernandez, Flat-icons-com from www.flaticon.com