17:12
26/1/2011

Oto kod, który po umieszczeniu na stronie internetowej, pozwala jej właścicielowi na sprawdzenie czy odwiedzający go internauta jest zalogowany do Facebooka, Twittera lub GMaila i wielu innych serwisów internetowych. Poniżej wyjaśniamy kolejną metodę na udowodnienie komuś, że znów ogląda pr0n…

Atak groźny czy niegroźny?

Jak pisze Mike Cardwell, internauci mogą mieć gdzieś to, czy ktoś wie, że są zalogowani do Facebooka czy GMaila — ale raczej nie spodoba im się fakt, że strony internetowe mogą sprawdzać czy surfują np. po serwisach pornograficznych…

Kod wykrywający gdzie zalogowany jest użytkownik ma następującą formę:

<img style="display:none;"
onload="logged_in_to_gmail()"
onerror="not_logged_in_to_gmail()"
src="https://mail.google.com/mail/photos/static/AD34hIhNx1pdsCxEpo6LavSR8dYSmSi0KTM1pGxAjRio47pofmE9RH7bxPwelO8tlvpX3sbYkNfXT7HDAZJM_uf5qU2cvDJzlAWxu7-jaBPbDXAjVL8YGpI"
/>

lub

<script type="text/javascript"
src="https://twitter.com/account/use_phx?setting=false&format=text"
onload="not_logged_in_to_twitter()"
onerror="logged_in_to_twitter()"
async="async"
></script>

<script type="text/javascript"
src="https://www.facebook.com/imike3"
onload="logged_in_to_facebook()"
onerror="not_logged_in_to_facebook()"
async="async"
></script>

Atrybut src w powyższych przykładach odsyła użytkownika do zasobu w wybranym serwisie. Jeśli internauta jest zalogowany do serwisu to zobaczy ten zasób (kod HTTP 200 OK) — jeśli nie jest zalogowany, zostanie przekierowany na stronę logowania a webserwer wyśle inny niż 200 OK kod błędu i w konsekwencji uruchomiona zostanie funkcja ze zdarzenia onerror).

Laptop prywatność

W tym przypadku sweterek nie pomoże Twojej prywatności

Przed “złośliwością” zdarzeń onerror można uchronić się stosując rozszerzenia do przeglądarek typu NoScript.

Pozytywna strona tego “naruszenia prywatności”

Mike zauważa, że ten “wyciek informacji” ma też swoje plusy — autorzy stron internetowych mogą wykrywać, czy ktoś jest zalogowany do GMaila i np. w formularzach rejestracyjnych od razu uzupełniać pole e-mail domeną gmail.com

Ale to już było…

Zanim przez sieć przetoczy się fala artykułów typu “O MUJ BOSZE! ONI WIEDZĄ GDZIE JESTEM ZALOGOWANY!!!111”, wspomnijmy tylko, że podobne “ataki” znane są już od dawna: porównaj nasze artykuły o CSS history hacku z opcją wyliczania unikalności przeglądarki, oraz post Grossmana, którego badania można rozszerzyć o wariant z atakiem czasowym.

Temat nawinął skazi.

Przeczytaj także:


36 komentarzy

Dodaj komentarz
  1. Ciekawe czy można to jakoś wyłączyć w Firefoksie nie tracąc jednak wszystkich skryptów i nie bawiąc się w whitelistę w NoScripcie (co jest np. dla mnie bardzo irytujące, na tyle że tego rozszerzenie nie używam), w przypadku CSS’a wystarczało layout.css.visited_links_enabled na false…

  2. Mały błąd w skrypcie dla Twitter’a:
    onload=”not_logged_in_to_twitter()”
    onerror=”logged_in_to_twitter()”

    Powinno być:
    onload=”logged_in_to_twitter()”
    onerror=”not_logged_in_to_twitter()”

  3. @C!, wbrew pozorom, nie masz racji ;)

    “the Twitter URL returns an error code if you’re logged in, but redirects to the login form with a success status code if you’re not logged in.”

    czyli, jest tak, jak ma być, a że jest odwrotnie, no cóż, blame Twitter (albo znajdź inny zasób, o odwróconej, czyli normalnej, logice ;)

  4. Witam niebezpiecznik po dłuższej przerwie :)

    Fajna sprawa, ale pasowałoby wymyślić jakieś dobre zastosowania :) Aha, no i nie wiem jak to ma się do serwisów typu pr0n, przecież, o ile koledzy mnie nie okłamali ;) tam chyba nawet nie ma opcji logowania, więc co wrzucić w src? BTW: analogiczny skrypt można zrobić dla nk oczywiście. Pozdrawiam!

  5. Dobre zastosowanie: liczenie ile % odwiedzających stronę, posiadających facebooka, klika like.

  6. >>Fajna sprawa, ale pasowałoby wymyślić jakieś dobre zastosowania :)
    Zbieranie danych w celu stworzenia reklamy idealnie skierowanej do użytkownika?
    Jeżeli duży serwis to można by takie statystyki odsprzedawać, kto gdzie jak i po co.
    Phishing, czyli sprawdzamy czy ktoś ma konto na NK i jeżeli tak to wyświetlamy mu komunikat że jego profil został skradziony i musi się ponownie zalogować przez podstawioną stronę. Niech nawet 1% to łyknie…

  7. nie pytanie czy się ogląda pr0n, tylko gdzie ;-)

  8. @pecet : na proxy zrobić regułę czyszczącą taki “kod” ;)

  9. Skoro już kompletujemy różne metody wycieku tego rodzaju informacji cross-domain , to dodajmy jeszcze metodę http://jsbin.com/ataci5/4 . O co chodzi? Prawie każdą stronę możemy dać w iframe, a jeśli w jej URLu jest fragment identifier #id, prawie każda przeglądarka przescrolluje nas do elementu o zadanym ID. Z zewnętrznego dokumentu możemy za to odczytać ….. pozycję strony zagnieżdżonej (scrollTop).

    Po tym wiemy, czy jakiś ID występuje, czy nie na stronie docelowej, a po tym na 99% wiemy, czy jest zalogowany (np. wystarczy sprawdzić, czy jest id=logout, id=my_account itp.).

    Proste, wygodne, szybkie, działa prawie wszędzie, cross domain itp.

  10. Z blipa wykradniemy także login :)

    Nie będę tutaj podawał, ale jak ekypa z niebezpiecznika pozwoli to wrzucę :)

    • Pozwalamy. Ale może najpierw na e-mail, próba responsible disclosure, a potem post ;-)

  11. full disclosure FTW!

    A co do tematu to jest to kolejny dowod na to, ze nie doceniam javascriptu ;)

  12. Hmm, ale warto też zauważyć, że niektóre strony zwracają normalną stronę, na której po prostu napisane jest coś w stylu: “Nie jesteś zalogowany”, bez żadnych przekierowań. Nie mniej, atak ciekawy.

  13. A czy tryb “p0rno” nie wystarczy?

  14. tak z ciekawosci czy ten kod jest w stanie wykryc czy ktos surfuje po stronach porno lub tez innych jezeli przegladarka jest odpalona w trybie prywatnym?

    • elo: żeby Cię wykryło musisz
      a) być zalogowany w danym serwisie
      b) mieć włączony JS.
      c) wejść na stronę ze “złośliwym” skryptem

      Nie jest ważne czy korzystasz z trybu porno czy nie. Ważne, żeby warunki a), b), i c) zostały spełnione w tym samym trybie (porno lub nie)

  15. @hikikomori, też o tym pomyślałem. Sądzę że tryb porno w każdej “dobrej” przeglądarce pozwoli zabezpieczyć się przed tym.

  16. Przynajmniej nie siejecie paniki, jak goście z benchmarku ;)

    Kolejny plus dla was.

  17. A ja tak mysle że z pomocą tego możnaby wyciągnąć i detale… Proof of concept ktoś? :)

  18. Można tego użyć żeby wyświetlać śmiecioramki z fejsboga tylko tym, którzy go używają.

  19. Ze stronami handlującymi pozwoleniami na CO2 też działa?
    Może w reklamie umieścić skrypt, który wykryje czy ktoś jest na takiej stronie zalogowany, a jeżeli jest to podsunąć mu link ze “specjalną last minute” ofertą kupna CO2…
    Nie jest to może i błąd, który coś wnosi do CSRF ale czasami małe rzeczy do zamaskowania prostego ataku są równie wartościowe dla przestępców i pen testerów.

    I teraz pytanie. Czy waszym zdaniem karty w przeglądarkach powinny być domyślnie izolowane pod względem sesji, ciasteczek itp?

  20. czy mozna te skrypty wykozystac do sprawdzenia czy ktos jest w danej chwili zalogowany do jakiegos banku?

  21. @Sopel, Ten ficzer niestety daje ci odpowiedź na to czy jesteś zalogowany w sąsiednim oknie/tabie czy nie, nie pozwoli pobrać danych z innej domeny bez autoryzacji (same-origin-policy).

  22. Czy na pewno nie pozwoli “hotlinkować” np.skryptów JS z innej domeny? Same skrypty JS mogą zawierać wrażliwe dane…

  23. Ciekawe czy się da w ten sposób sprawdzić, czy ktoś jest zalogowany w jakimś forum phpbb czy IPB, np. w niebezpiecznikowym.

  24. Na PHPBB3 kod http://jsbin.com/ataci5/4 działał poprawnie dla URLa http://***.info/mcp.php?i=main&mode=topic_view&f=15&t=30543&start=0#posts_per_page przy zalogowaniu znajdywał, że moderator, przy nie nie znajdywał.
    Dla użytkowników jest to np.http://***.info/ucp.php?i=178#icq
    Dla metody przedstawionej w temacie urlem dla użytkownika przy PHPBB3 będzie http://***.info/ucp.php?mode=register i kod to

  25. http://wklej.to/3yaEr

  26. Piotr, dzięki za wyjaśnienie, nie zgłębiłem tematu. Zwracam honor. :)

  27. Ja się zastanawiałem nad tym czy możnaby pobrać chociażby ajaxem zawartość strony Facebooka i przetworzyć to w JS np. regexpem.

    • Sopel: google “SOP”, to więcej niż połowa Twojego nicka, a nie masz o tym pojęcia? :-)

  28. @Sopel: Nie.

  29. A jak się ma SOP w przypadku iframe, szybki test dziala, nie mozna JSem wyciagnac zawartosci ?

  30. @barkh: Nie.

  31. @C śmiecioramki z fb przydają się dla wszystkich użytkowników – niektórzy mogą w danym momencie nie być zalogowanym na fb, więc zastosowania nie widzę.

  32. Tak sobie pomyślałem o takim schemacie ataku:
    Utworzenie strony z generatorem haseł. Opisanie contentem i tagami, że to bezpieczne hasła do serwisów społecznościowych typu nk, czy facebook.
    Wielkie nagłówki – zmień hasło na facebooku na bezpieczne.
    Wygenerowanie hasła wymaga podania adresu e-mail..
    Oczywiście na stronie kod z artykułu..
    Reszta już chyba jasna.

  33. @Damian: Jeśli mamy e-mail [user sam dał] i hasło [userowi sami daliśmy] petenta, to nie potrzebujemy kodu z artykułu. W wielu [Facebook jest większością w tym momencie] portalach społecznościowych loginem jest mail, hasło jest hasłem… czego chcieć więcej?

    Ale pomysł niezły. “W celu zapewnienia maksymalnego bezpieczeństwa, propozycja silnego, niepowtarzalnego hasła zostanie wysłana na twój adres e-mail.”

Twój komentarz

Zamieszczając komentarz akceptujesz regulamin dodawania komentarzy. Przez moderację nie przejdą: wycieczki osobiste, komentarze nie na temat, wulgaryzmy.

RSS dla komentarzy: