Nowy Wykop już bezpieczny

Przedwczoraj pisałem o odkrytych lukach w serwisie Wykop.pl.
Dzisiaj mogę z czystym sumieniem powiedzieć, że obecny poziom bezpieczeństwa Wykopu jest wyższy, niż w przypadku poprzedniej wersji serwisu. Tego wszyscy chcieliśmy ;)

W ostatnim wpisie nie zdradziłem sposobu, za pomocą którego można było wstawić dowolny kod CSS / JS do komentarzy - teraz opiszę to wszystko dokładnie. Osoby posiadające własne strony, będą mogły sprawdzić ich zachowanie na podstawie przykładów które podam.
Opiszę także inne luki, których istnienia nie ujawniłem, a zostały skutecznie załatane.

Komentarze - lepsze formatowanie
Błąd polegał na niewłaściwym parsowaniu linków, w których można było umieścić pewne znaki, które w rezultacie dawały 'nowe możliwości' dla użytkownika.
Początkowo kod który testowałem wyglądał tak:

http://google.pl">fake 123

Zauważyłem, że dwa nowe znaki spowodowały zmianę budowy wygenerowanego linka - efekt:

fake 123

Według pomysłu twórców Wykopu, powyższy kod powinien zostać zamieniony na:

http://google.pl fake 123

Kolejne próby doprowadziły do powstania pierwszej 'nowej funkcji' - formatowania linków:

http://google.pl">normal **bold** _italic_

Najciekawszą rzeczą jest fakt, że prezentowana funkcja nadal działa - po zmianach kod linka nie jest już 'zanieczyszczany' niepotrzebnymi znakami. Ja proponowałbym pozostawienie takiej opcji formatowania - może być przydatna ;)
(Można dodać do linków rel=nofollow dla spamerów.)
Istnieje jednak wada: link nie posiada opcji zamknięcia. Znacznik zamykający link pojawi się tylko przed kolejnym odnośnikiem, lub na końcu komentarza.



CSS i JS w komentarzach
Wstawienie kodu JS i CSS do komentarzy było tylko kwestią kilku prób:

http://google.pl"id="fake"onclick="unicode"style="color:red;">to jest link

Kod jest trochę nieczytelny, bo nie zawiera spacji. W wyniku jego użycia otrzymywaliśmy link z id="fake", stylem CSS określającym czerwony kolor, a także kodem JS który wykonuje się po kliknięciu (onclick). Do wstawiania JS korzystałem z unicode z prostej przyczyny: nie musiałem likwidować spacji, znaków specjalnych itp. Proste i ciekawe narzędzie konwertujące ciągi znaków znajdziemy pod tym adresem.

Kilku użytkowników poznało ten sposób przed jego zablokowaniem - więc odkrycie tego nie było aż tak trudne.

Mogłeś być moderatorem jeden dzień



Sposób wykorzystania tej luki rozszyfrowało więcej osób, nawet przed tym, jak opublikowałem wpis informujący o tym.
Wystarczyło rozszerzenie przeglądarki Firefox - Web Developer. Posiada ono wiele ciekawych opcji, w tym może pokazywać ukryte pola formularzy. To właśnie poprzez edycję danych zawartych w tych polach, można było edytować komentarze innych użytkowników - wystarczyło zamienić numer identyfikacyjny komentarza.

Również inne manipulacje komentarzami odbywały się w podobny sposób.

Przy tworzeniu aplikacji należy pamiętać o tym, że użytkownik po stronie przeglądarki może zrobić wszystko, co tylko będzie chciał - wszystkie przesyłane informacje należy sprawdzić po stronie serwera (ilość i typ znaków / sposób wysłania / dodatkowe parametry / uprawnienia użytkownika).

Minusowe głosy
W tym przypadku wystarczyła edycja linka służącego do głosowania:

http://www.wykop.pl/wykop/numer

Okazało się, że po stronie serwera nie jest sprawdzany link na który głosujemy (czy on istnieje). Oddanie głosu na nieistniejący link nie było żadnym problemem. W chwili dodania linka do serwisu, posiada on liczbę głosów równą '0' (w tym czasie w bazie, w innej tabeli istnieje jeden głos). Wystarczyło tylko skorzystać z opcji 'cofnij' (cofnięcie głosu) - ogólna liczba głosów była zmniejszana o '1'.

Podszywanie się pod innych użytkowników
O tej luce nie wspomniałem, bo nie chciałem aby ją ktoś wykorzystał - już jest 'załatana', więc mogę ją opisać. Jakie były jej możliwości?
Mogliśmy dodawać linki do swoich stron za pomocą kont innych użytkowników - przykład:

Ktoś wchodzi na mój blog przeczytać ten wpis. Na tej podstronie znajdowałaby się ukryta ramka z formularzem, który wysyłałby automatycznie dane do Wykop.pl. Jeśli odwiedzający mojego bloga byłby zalogowany na Wykop.pl, to dodałby nowy link do serwisu nawet o tym nie wiedząc.
Po chwili na moim blogu pojawiliby się pierwsi goście - skrypt (w PHP) rozpoznałby, że link został już dodany (referer), i zamieniłby zawartość ukrytej ramki na link służący 'wykopywaniu'. W międzyczasie skrypt mógłby 'komentować' zachęcając innych użytkowników do wejścia na sprytnie podstawioną stronę. Po chwili link byłby już na stronie głównej serwisu.

Jak się możemy zabezpieczyć przed podobnymi działaniami?
Odpowiedź jest prosta - wystarczy dodać do formularzy unikalny identyfikator w ukrytym polu, a w przypadku linków sprawdzić skąd się odwołano do danej strony (referer).

Formularze i XSS
jeśli wpiszemy do jakiegoś formularza błędne dane i wyślemy, to zazwyczaj dostajemy komunikat o tym, że wprowadzone informacje są nieprawidłowe. Co zauważymy? Wpisane dane są zawarte w polach formularza.

Przykład:
Wpisujemy do formularza: 'nieprawidłowy nick'
Skrypt po stronie serwera wygeneruje nowy formularz, w którym znajdziemy:

[...] value="nieprawidłowy nick" >

Co może się stać, gdy w formularzu wpiszemy:

"> dowolny kod

Otrzymamy:

[...] value=""> dowolny kod" >

Jak widać 'dowolny kod' znalazł się poza obrębem pola formularza - ten sam błąd popełnili programiści Wykopu. Należy przefiltrować dane, zanim trafią ponownie do 'value': usunąć niepotrzebne znaki, lub zamienić je na znaki unicode (istnieją różne sposoby).

Warto sprawdzić formularze na swoich stronach - wyobraźmy sobie, że użytkownik jednym komentarzem może zrobić na naszej stronie wszystko (zasłonić całą stronę wypozycjonowanym divem , podmienić treść za pomocą JS, itp).

Testowanie strony na podatność na ataki typu XSS jest ważnym elementem podczas tworzenia nowego projektu. To jest jedyny etap, w którym nie powinniśmy zwracać uwagi na semantykę - to, że kod z zamkniętymi znacznikami, z cudzysłowami, itp, wstawiony do przykładowego formularza nie będzie groźny, nie oznacza, że możemy zaprzestać testowania. Należy sprawdzić różne warianty, których może użyć potencjalna osoba chcąca zaszkodzić nam, lub użytkownikom.

Wykop.pl - poziom bezpieczeństwa wzrasta
Obecnie jest bezpieczniej niż w poprzedniej wersji Wykopu.
Opisywane luki zostały w krótkim czasie załatane, przy okazji poprawiono bezpieczeństwo w miejscach, o których nawet nie wspomniałem.
Teraz żaden użytkownik nie musi się obawiać tego, że ktoś wykorzysta jego konto w jakikolwiek sposób do własnych celów.

Motywacja
Programiści Wykopu wiedzieli, że istnieje możliwość edycji komentarzy przed dowolnego użytkownika - załatano to po pewnym czasie, ale w sposób niezbyt dobry. Można powiedzieć, że tylko tak, 'aby jakoś było' ...
Opisałem całą sprawę, i wystarczył jeden dzień aby wszystko naprawić ;)
Podobnie wyglądała sprawa z Allegro, o luce wykorzystującej możliwości CSS'a wiedziano od ponad roku (albo dłużej), po nagłośnieniu sprawy, została załatana w ciągu kilku dni - coś w tym jest ;)

RoR - PHP

Wykop chodził zdaje się już ponad rok, w tym czasie pewne dziury zostały załatane i powiedzmy (jeśli chodzi o dziury) było ok. Przepisywanie natomiast takiej aplikacji powoduje prostą rzecz: startuje się od nowa, a więc produkowane są nowe błędy. Ich ilość akurat w tym wypadku jest dosyć spora, z bardzo prostej przyczyny - raczej słabi programiści.
(Cytat: Radarek)

Zgadzam się z tym cytatem, ale 'słabi programiści'? Hmm, wczoraj sami udowodnili, że jednak potrafią coś dobrze zrobić ;)

Mirek - nowa maskotka Wykopu?
Czytając komentarze można było zauważyć, że 'robal' spodobał się użytkownikom Wykopu do tego stopnia, że nawet został 'wykopany' ;)

Tak, mirek zdecydowanie powinien zostać maskotką wykopu ;) Do czasu załatania absolutnie wszystkiego ;)
(Cytat: wuzetes)

Wszystko zostało załatane, 'robala' na Wykopie już nie ma, ale myślę, że byłoby dla niego jeszcze miejsce - tutaj, pusta strona stałaby się trochę 'żywsza' ;)

Komentarze 21:

  • » Marek: 31.07.2007 o 15:50

    Upss, moja strona nie jest odporna na XSS :D
    Muszę coś z tym zrobić :p

  • » Pizzadude: 31.07.2007 o 17:28

    Jestem ciekawy, czy przypadkiem twórcy Wykopu nie pomyśleli sobie "hm, a może jednak warto było pozostać przy RoRze?" :D

  • » Marek: 31.07.2007 o 19:31

    Twój blog nadal jest zbanowany na wykopie?

  • » Adriano: 31.07.2007 o 19:41

    Nie wiem, zawsze pozostają jeszcze aliasy ...

  • » ketsu: 31.07.2007 o 21:43

    Chwali się, że jak tylko mogli (czyt. w poniedziałek - to chyba był największy ból Twojego wpisu - ujawnić wszystko w niedzielę) to posprzątali.
    Piszesz: "Programiści Wykopu wiedzieli, że istnieje możliwość edycji komentarzy przed dowolnego użytkownika - załatano to po pewnym czasie, ale w sposób niezbyt dobry." - znaczy, że edycja była jeszcze prostsza? (jakoś nie chce mi się w to wierzyć).

  • » Adriano: 31.07.2007 o 21:54

    Najpierw do edycji komentarzy korzystałem z osobnego formularza - wprowadzili sprawdzanie, skąd dane są przesyłane (referer).

  • » skkf: 31.07.2007 o 23:41

    Adriano - Mirek teraz mieszka tutaj - http://chust4.xoomwebs.com/mirek/index.htm ;))

  • » wzs: 31.07.2007 o 23:44

    Dobrze, że "wszystko" zostało załatane... Boli tylko, że niektóre błędy były naprawdę... dyskredytujące programistów. Bo o ile parsowanie linków - mogło im umkąć, to już edytownie komentarzy, czy XSS - powiedzmy sobie szczerze - świadczą o braku doświadczenia w projektowaniu aplikacji www.

    Inna srawa, że akurat profil użytkowników wykopu sprawia, że każdą najmniejszą nawet pomyłkę w lot podłapią.

    Adriano, piwo od Wykopu Ci się należy (i honorowe miejsce dla Mirka również!)

  • » Adriano: 01.08.2007 o 01:11

    @skkf, widziałem to już ;)
    Na Wykopie Mirek ma już 19 głosów, heh ...

    @wzs, może to nie jest aż takie "wszystko", jednak w porównaniu z sytuacją sprzed kilku dni ...
    Nawet projektując serwis dla grupy osób, która nie potrafi zaglądnąć w źródło strony należy pamiętać o podstawach w zabezpieczeniach.

    Piwa od Wykopu raczej nie dostanę - teraz mnie chyba trochę nie lubią :)

    Wielu użytkowników nadal myśli, że Wykop jest pełen dziur - zastanawiałem się nad tym, aby ten wpis wykopać (w celach informacyjnych), ale to już wyglądałoby na spam ...

  • » ketsu: 01.08.2007 o 10:02

    Http://www.wykop.pl/link/23189/wykop-dziurawy-jak-polskie-drogi-piekny-final << GZyl dodał ten wpis za Ciebie ;) Na razie na wykopalisku, ale chyba nie będzie miał problemu z przebiciem się na stronę główną, zwłaszcza, że warto "uspokoić" ludzi, bo żadnego oświadczenia na Wykopie nie było (a mogli choć na blogu wspomnieć).

  • » MDo: 01.08.2007 o 14:29

    Witaj,
    Nie wiem czy, przed napisaniem tych artkułów, konsultowałeś się z tym w administratorami wykopu, bo jeśli tak, to wszystko ok, i możesz dalej nie czytać :). A jeśli nie, to poprostu bezmyślnie popisałeś się swoją znajomością PHP, żeby pochwalić się, że znalazłeś strone z błędami (a bardzo łatwo w sieci takie strony znaleźć), a administratorzy mogą się odwdzięczyć, pozwaniem Cię o przeprowadzenia audytu bezpieczeństwa bez ich zgody. Oczywiście mam nadzieję, że jednak ich uprzedziłeś.
    Pozdrawiam.

  • » MDo: 01.08.2007 o 14:32

    Dodam jeszcze, że nawet jeśli ich uprzedziłeś że znalazłeś błędy, to jest to już nielegalne, a raczej cięzko będzie Ci udowodnić, że wpisałeś te ciągi znaków przypadkiem. Dla mnie jest to absurd, ale nie stety tak jest, od czasu, gdy sie o tym dowiedziałem dałem sobie spokój z nawracaniem webmasterów :)

  • » Damian: 01.08.2007 o 14:51

    Wykonał za nich robotę, powinni mu podziękować a nie oskarżać. Wykop swojej opini w taki sposób by nie zepsuł przecież.

  • » MDo: 02.08.2007 o 01:20

    Masz rację, ale mogą go oskarzyć. Teraz (jesli nie uzgodnił tego z nimi) autor bloga jest skazany na dobrą wole adminów. Dla administratora, nie ma wiekszej hańby, niź włamanie na jego serwer lczy złamanie zabezpieczeń jego programu, kiedyś jak sie w to bawiłem (kiedy byłem głupi i nie wiedziałem, co mi za to grozi), to administratorzy rzadko dziękowali, raczej wyskakiwali z tekstem "Dobra, teraz odwal się od tej strony" itp. A wykop.pl gdyby chiał mogli by bez problemu zatuszować sprawę oskrżenia autora bloga.

  • » migawka: 02.08.2007 o 04:57

    Opera 9.22. po tych wszystkich zmianach Wykopu jedna rzecz mnie martwi: klikniecie na logo nie odswieza zawartosci strony (tak jak i powtorne wejscie w komentarze), co bylo w "starej" wersji. teraz zeby odswiezyc strone trzeba przeladowac buttonem.

  • » Radarek: 03.08.2007 o 11:40

    Adriano, odnośnie tych "słabych programistów". Hm może przesadziłem, ale na pewno są niedoświadczeni. To widać, bo ktoś kto pracował przy kilku aplikacjach webowych wie gdzie czyha niebezpieczeństwo. Niestety to, że załatali dziury nie czyni ich od razu "dobrymi programistami", bo podałeś im na tacy błędy i zapewne rozwiązania (a nawet jeśli nie to raczej nie trudno jest się ich domyśleć wiedząc jak gdzie jest luka). I jeszcze raz chciałbym podkreślić: Wykop jest dosyć prostą aplikacją. Ilość formularzy (czyli miejsc z których przychodzą dane wejściowe, których trzeba się bać i w ogóle;) ) można policzyć na palcach jednej ręki więc też nie dziwi mnie to że dziury zostały załatane tak szybko. Tak czy siak to co zrobiłeś jest dobre, zarówno dla Wykopu (bezpieczeństwo), Ciebie (sława :D) i przede wszystkim pozostałej części czytelników (wzrasta poziom świadomości). To ostatnie o tyle istotne, że dzisiaj XSS i tego typu ataki są niejako zamiennikiem dawnych wirusów (bo jak np. słusznie zwróciłeś uwagę, mogłeś oddać głos w imieniu użytkownika, który odwiedzał Twoją stroną - sam to kiedyś wykorzystałem przy samowykopującym się linku). Pozdrawiam :).

  • » Janka: 20.06.2008 o 21:24

    I tak ktoś znajdzie dziurę :)

  • » Adi: 11.07.2008 o 15:59

    Nie kumam czemu ten wykop jest taki popularny. Tam nic przecież nie ma zwykle ciekawego, a informacje można znaleźć na portalach branżowych i ogólnych. To chyba ta możliwość wykopywania i zakopywania jest źródłem sukcesu.

  • » Konri: 18.07.2009 o 18:18

    Jakoś nie mogę się przyzwyczaić do tego wykopu

Dodaj komentarz:

Dostępne tagi: [link]http://adres-www[/link] [quote]cytat[/quote] [code]kod[/code] [pre]tekst preformowany[/pre] [b]bold[/b]