Wpis z mikrobloga

#programowanie #zagadkihakerskie #ssl

Ostatnio wrzucałem zagadki hakerskie, które polegały na wykorzystaniu błędów w implementacji strony. Tym razem skupimy się na pewnym problemie (w sumie dość powszechnym) od strony koncepcyjnej.

Mamy stronę, która działa zarówno w protokole HTTP jak i HTTPS. HTTPS jest postawiony na stronie tylko do realizacji procesu logowania, cała reszta jest wysyłana przez HTTP.

Na stronie głównej (tej w HTTP), w prawym górnym rogu znajduje się formularz do logowania wyglądający mniej więcej tak:


Jak widać, formularz odnosi się do strony logowania po HTTPS. Wszystko wygląda więc w porządku:

1. Użytkownik wchodzi na stronę w HTTP.

2. Wpisuje swoje dane do formularza logowania.

3. Dane logowania są przesyłane przez HTTPS (a więc nie ma możliwości by je podsłuchać w sieci).

4. Serwer zweryfikował poprawność danych, ustawia ciastka i przekierowuje użytkownika z powrotem do HTTP.

No... więc wszystko niby wygląda w porządku ale nie byłoby tej zagadki, gdyby faktycznie wszystko było ok :) Jaki jest problem w takim rozwiązaniu? W jaki sposób można tutaj przeprowadzić atak?

Albo sformułuję problem inaczej, żeby był bardziej obrazowy: dlaczego nie powinniście się logować na Wykop z niezaufanej sieci Wifi? ;)

Od razu powiem, że nie chodzi tutaj o keyloggery czy jakieś inne złośliwe oprogramowanie. Komputer ofiary nie jest niczym zainfekowany.
  • 16
@almafater: Może po prostu chodzi o to, że lecą hasło i użytkownik w formie zaszyfrowanej i łatwo te zaszyfrowane dane wyciągnąć z całego dokumentu, a potem przeprowadzić np. brute force? W sensie że kiedy cała strona leci po SSLu, wszystko jest zaszyfrowane i nie wiadomo, co jest czym. A tutaj wiadomo, który ciąg znaków to zaszyfrowane hasło, a które to zaszyfrowany użytkownik.
@almafater: mylę się, czy wystarczy przechwycić całe zapytanie (to co wysyła formularz) i wysłać je ponownie w późniejszym czasie logując siebie? Jeśli w ogóle da się zrozumieć co napisałem
@Jon_Shannow: generalnie problem polega na tym jak rozwiązano kwestię trzymania strony zarówno na HTTP i HTTPS.

@Wozyack: Zaszyfrowanych danych nie wyciągniesz z dokumentu, bo nie masz jak :)

@staa: Nie jestem do końca pewien, o którym zapytaniu mówisz, więc wolałbym większą precyzję.

Mała podpowiedź:

Skoro całe połączenie nie jest zaszyfrowane to pierwszy request do strony głównej zawierającej formularz logowania można zmodyfikować w złośliwej sieci. Np atakujący stawia proxy które podmienia wszystkie action we wszystkich przesyłanych dokumentach na http://zly-serwer/zbierakdanych.php i wymusza cały ruch http w sieci przez nie.
@AltumVidetur: Tak, właśnie o to chodzi.

Wyjaśnienie:

Pierwsze żądanie idzie w HTTP, ale zawiera formularz z odniesieniem do HTTPS. Ponieważ jednak jest w HTTP - złośliwy użytkownik może w nim podmienić atrybut

action
na taki, który nie będzie zawierał odniesienia do HTTPS tylko HTTP.

Istnieją gotowe skrypty, które coś takiego robią, jak np. sslstrip - on zamienia "https" na "http", dodatkowo może zmienić favikonę na taką samą, tylko zawierającą w sobie