[Tutorial]Cross-Site Request Forgery

Magnefikko

Były Moderator
Dołączył
Maj 29, 2004
Posty
709
<div align='center'>Cross-Site Request Forgery
by Magnefikko</div>

XSRF to wbrew pozorom i ciężkiej do zapamiętania (przynajmniej dla mnie xD) nazwie jest bardzo prostym atakiem. Możnaby nawet rzec że najprostrzym, ale wstrzymajmy się od takich określeń - wszystko zależy od skryptu i od osoby skrypt łamiącej.
Najpierw po krótce, co to jest XSRF. Otóż, jeżeli strona nie jest zbudowana na jakimś dzikim JS, flashu czy innym gównie, "sterowanie" skryptem odbywa się przez formularze - zmienne POST i GET. XSRF następuje gdy ofiara wykona u siebie przygotowany przez nas... hmm... coś (xD) który odpowiednio "posteruje" skryptem.
Wyjaśnienie i opisanie samego mechanizmu ataku, na przykładzie.
Mamy sobie prosty bank internetowy. Autentyfikacja użytkownika prowadzona jest z użyciem Cholernie_Zaszyfrowanej_Niemożliwej_Do_Wykorzystania_Przez_Napastnika_Sesji. Ofiara ma Cholernie_Trudne_Niemożliwe_Do_Złamania_Hasło. Cały skrypt jest odporny na Bardzo_Fajne_Ataki. Zalogujmy się i przelejmy na konto pana Mietka dwa złote... używamy sobie programu Live HTTP Headers albo innego tym podobnego by zobaczyć jakie dane są przesyłane...
Kod:
IdDo=532&Suma=2
Przelaliśmy dwa złote Mietkowi i... o cholera, jesteśmy bez grosza! I za co tu kupić tanie wino? Musimy sobie jakoś poradzić...
Wypatrujemy użytkownika o nicku Bankier. Pan Bankier ma na swoim koncie - co wiemy od naszych zatrudnionych za ziemniaki ludzi - kilka tysięcy PLN. Jednak o dziwo nie chce się podzielić. Bardzo nieładnie!
Cóż by tu zrobić... otworzyć notatnik/getit/vim i wpatrywać się weń bezmyślnie! To zawsze pomaga.
Po kilku minutach procesu odwrotnego do procesu myślowego piszemy sobie:
Kod:
<form action = "http://www.superbank.pl/przelew.php" method = "POST">
<input type = "hidden" name = "IdDo" value = "951">
<input type = "hidden" name = "Suma" value = "6000">
<input type = "submit" value = "Najlepsze kartofle swiata za darmo!"></form>
superbank.pl to strona naszego banku, natomiast skrypt przelew.php dokonuje przelewu. Sprawdza oczywiście czy mamy wystarczająco dużo pieniądzów, czy jesteśmy tym za kogo się podajemy i tak dalej. Gdy ofiara wciśnie guzik nęcący ją wizją darmowych kartofli, do skryptu przelew.php wysłane zostaną dane typu POST. Teoretycznie z jego konta ubyć powinno sześć tysięcy (<input type = "hidden" name = "Suma" value = "6000">) która to kwota znajdzie się u nas (na koncie o ID 951). Oczywiście możnaby napisać formularz lepiej - na przykład, mógłby wysyłać się automatycznie po wejściu na stronę. Taki efekt można osiągnąć przez zastosowanie skryptu JS. Czemu go nie zastosowałem?
TAK, K*A, NIE ZNAM JS!
Przepraszam, kryzys osobisty ;-)
Wracając do tematu... warto byłoby mieć jako-taką pewność że ofiara będzie zalogowana gdy dane zostaną wysłane gdzie trzeba.
Toteż wykorzystujemy na przykład system wysyłania wiadomości do innych klientów banku. Oczywiste że nasz kolega, Bankier, będzie zalogowany gdy przeczyta naszą genialną pod względem socjotechnicznym wiadomość.
Kod:
Joó zenek111!!!11 MósisH to zobacHhYĆ! PHAShisjifhasHHFSAHS!
[url]http://www.aleciewyru*am.yoyo.pl/skryptdoautomatycznegoprzelewaniapieniedzyroznychfrajerownamojekontoktorywykorzy[/url]
stujeichnaiwnosciglupte.html
Wymanewrowana ofiara wchodzi pod wskazany adres (pod którym jest nasz formularz. TAK, K*A, BEZ JS!), klika na magiczny przycisk traktujący o kartoflach (ŻE JS CO?), i - jeżeli skrypt nie wywala użytkownika po wyjściu ze strony albo ciacha nie są automatycznie czyszczone - na nasze konto trafia sześć patoli. Czas zaprosić kolegów na libacje :)
Podsumowywując:

  1. Określamy swój cel.
  2. Szukamy odpowiedzialnych za realizację zamierzenia skryptów.
  3. Sprawdzamy jakie zmienne przyjmuje skrypt i do czego owe służą.
  4. Tworzymy formularz lub link (zmienne GET lub gdy włączone jest Register Globals, link "chowamy" pod aliasem, np. prv.pl).
  5. Wysyłamy go ofierze lub wykorzystujemy XSS (jeżeli znajdziemy błąd).
  6. Jeżeli ofiara da się nabrać, ciacha są na miejscu i nic nie zwaliliśmy - cel zostaje osiągnięty.

Przepraszam za kiepską jakość ale piszę z roboty pod presją. W każdym razie co najważniejsze jest - w prostej formie. Wręcz prostackiej xD
Miłej zabawy.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
sorry że odpowiadam w tutorialu ale nie mogłem się powstrzymać.
no tutek fajny ale najlepsze komentarze ;] tak się dawno nie śmiałem ;]
 
Do góry Bottom