Przejęcie dowolnego konta użytkownika w systemie wymiany linków linktak.pl

Autor systemu został poinformowany o błędzie jako pierwszy. W momencie publikacji wpisu system jest już zabezpieczony.

Pisząc własne oprogramowanie, stale muszę dbać o jak najwyższe bezpieczeństwo realizowanych projektów, naturalnym więc jest, że testuję kod pod tym kątem.

Działam również w “działce” SEO, korzystam więc z różnych narzędzi, własnych i zewnętrznych) Trafiłem na SWL linktak.pl.

Zarejestrowałem się, przejrzałem panel i zacząłem testować. Stworzyłem w tym celu dwa konta aby nie działać na prawdziwych kontach użytkowników.
Nazwijmy je roboczo konto1, konto2.

Krok pierwszy. Moją uwagę zwróciło to, że autor linktak.pl (okazwłoka) zapisuje sesję do cookie.

Co dziwne, również „logi” („ostatnio klikane”) są zapisane ciasteczku. Można było to rozwiązać bardziej elegancko ale to nieistotne. Chyba, że chcemy użytkownikowi wyświetlić również jakieś brzydkie rzeczy bezpośrednio na stronie… ?

Krok drugi. Okazało się, że korzystanie z systemu wiadomości (komunikatora linktak.pl) jest niebezpieczne. Autor (okazwłoka), owszem wycina „niebezpieczne” znaki z treści ale nie całkowicie.

Co zrobiłem? Napisałem zwykłą wiadomość („cześć”) z konto1 do użytkownika konto2. Wszystko poszło ok. W drugiej wiadomości wysłałem (z konto1 do konto2) kod JavaScript jako wiadomość – zamieniłem apostrof, cudzysłów na kod ASCII, przeszło bez problemu.

Konto2 otrzymuje pozornie pustą wiadomość, jednak w momencie odczytania wiadomości „w tle” wykonuje się kod, który pobiera zawartość cookie zalogowanego użytkownika (konto2), następnie wysyłany jest request do pliku PHP na moim serwerze, który zapisuje zawartość cookie do pliku tekstowego.

Request do mojego serwera z kodem, który zapisuje sesję użytkownika linktak.pl

Zawartość mojego serwera

Zawartość mojego serwera

Krok trzeci. Po pobraniu zawartości cookie z serwera (użytkownika konto2), należy jedynie podmienić sesję obecnie zalogowanego użytkownika (konto1) na tą skradzioną (konto2). Zrobiłem to używając wtyczki do Google Chrome pod nazwą „EditThisCookie”. Zapisałem zmiany.

Podmiana zawartości cookie

Odświeżasz stronę i gotowe. Jesteś zalogowany jako użytkownik, któremu wykradliśmy sesję.

Jak zabezpieczyć?

Rozwiązanie pierwsze.

W PHP wystarczyło użyć funkcji np. htmlspecialchars. Odsyłam do dokumentacji aby przeczytać o tej funkcji. Tym sposobem możemy zapobiec wykonywaniu się złośliwego kodu.

Rozwiązanie drugie.

Wdrożenie nagłówka Content-Security-Policy. Przeczytaj więcej o bezpiecznych nagłówkach HTTP.

You May Also Like

About the Author: Mateusz Dudek

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *