Napisany lis-29-2008

cross site request forgery

CSRF jest bardzo ciekawą metodą ataku na aplikacje webowe - wykorzystuje bowiem fałszowanie żądań HTTP.

Wprowadzenie

Zacznijmy jednak od momentu, w którym chcemy odwiedzić przykładową stronę www:

http://mypage.pl

W naszej przeglądarce wpisujemy adres i wciskamy enter. Serwer odpowie nam poprzez przesłanie dokumentu:

<html>
<head>
<title>mypage.pl</title>
</head>
<body>
…..
<img src=”fotka.jpg” alt=”fotka” />
</body>
</html>

Co robi przeglądarka, gdy widzi znacznik img? Wysyła żądanie HTTP o zasób występujący w atrybucie src. Podobna sytuacja zachodzi dla innych znaczników (np. pobieranie kaskadowych arkuszy stylów). Wydaje się to oczywiste, aczkolwiek stanowi podstawę dla ataków CSRF. Proszę zwrócić uwagę, że src może dotyczyć nie obrazka, a chociażby skryptu. Przykład:

<html>
<head>
<title>mypage.pl</title>
</head>
<body>
…..
<img src=”skasuj_mnie.php?id=1″ alt=”fotka” />
</body>
</html>

I teraz zagadka. Co by się stało gdyby taki dokument został przesłany do osoby zalogowanej do naszej aplikacji, posiadającej prawa administratora? Nieświadome wywołanie skasuj_mnie.php?id=1 spowoduje usunięcie użytkownika o identyfikatorze 1. Bez naszej wiedzy i wyraźnej zgody! Nasuwa się pytanie jakim cudem ów spreparowany znacznik, miałby znaleźć się w dokumencie. Prosta i szybka odpowiedź - np. system komentarzy, w którym brak jest walidacji danych wejściowych, co przekłada się na umieszczanie kodu HTML bezpośrednio w wypowiedziach komentujących. Wystarczy, że ktoś z odpowiednimi uprawnieniami odwiedzi tak “przygotowaną” stronę i gotowe!

formularze + $_REQUEST = nieszczęście

Nie zalecane jest używanie tablicy $_REQUEST dla obsługi formularzy! Wynika to z faktu, iż nie rozróżnimy żądanie GET i POST. A ma to zasadnicze znaczenie! Popatrzmy poniżej:

<form action=”skrypcik.php” method=”post”>
<input type=”text” name=”id” />
<input type=”submit” />
</form>

Jak się okazuje powyższe dane możemy wysłać korzystając z metody GET:

skrypcik.php?id=costam

Teraz tylko należy umieścić powyższy adres w znaczniku img:

<img src=”skrypcik.php?id=costam” alt=”opis” />

Jeżeli uda nam się osadzić ten fragment kodu na atakowanej stronie, to każdy odwiedzający user wyśle formularz, choć na pewno nie miał takiego zamiaru…

strzeżcie się!

Warto zwrócić uwagę, że zabezpieczenie przed każdym możliwym atakiem Cross Site Request Forgery nie jest zadaniem łatwym. Dlatego zachęcam do pogłębiania wiedzy - w sieci znajduje się mnóstwo artykułów na ten temat.

Tagi : ,

Komentarze:

Napisz komentarz