HTTP, czyli co tam w przeglądarce piszczy

HTTP

Wg badań międzynarodowego instytutu do spraw Internetu w Tallinie, protokół http (Hypertext Transfer Protocol) jest jednym z najczęściej używanych protokołów w Internecie. O ile część związaną z instytutem zmyśliłem, to ta o protokole to najszczersza prawda. Nie inaczej jest w pracy pentestera. W codziennej pracy będziecie spotykać się z tym protokołem. Będziecie go przechwytywać, analizować, modyfikować i puszczać dalej wolno jak ptaszki z wyleczonymi skrzydłami złamanymi przez drapieżne koty. Do rzeczy…

HTTP jest jednym z protokołów TCP/IP, domyślny port, po którym się komunikuje to 80.  Dokładną specyfikację tego protokołu znajdziecie w pliku RFC 2616. Komunikacja polega na wysyłaniu Zapytań (Request) i odbieraniu Odpowiedzi (Response). Jest to tzw. Protokół bezstanowy, co oznacza, że w kolejnych Requestach nie ma informacji o poprzednich transakcjach.

Request (show me what you got)

GET /lol.htm?uname=admin&pw=password123456789 HTTP/1.1

Host: 10.0.2.5:9999

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Referer: http://10.0.2.14/

Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20

Connection: close

Zacznijmy od początku tzn. od samej gory:

GET /lol.htm?uname=admin&pw=password123456789 HTTP/1.1

GET to metoda (opis poszczególnych metod poniżej), jest ich trochę i warto wiedzieć czym się różnią. Dalej mamy URL, sklejając wartość z nagłówka (header) Host, otrzymujemy to, co widzimy w polu adresu w przeglądarce. Ostatnią rzeczą w tej lini jest HTTP/1.1, czyli określenie z jaką wersją protokołu mamy do czynienia.

Host: 10.0.2.5:9999

Informacja o hoście, czyli adresie serwera, który chcemy odwiedzić w przeglądarce. Może tu się pojawić adres IP (wraz z portem, patrz wyżej) jak również nazwa domenowa (np. www.example.com).

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0

Tutaj przesyłamy informację jakiego klienta używamy do komunikacji HTTP. Prościej, z jakiej przeglądarki korzystamy, ale nie tylko. Musimy pamiętać, że komunikację HTTP mogą wykorzystywać inne aplikacje niż przeglądarki, np. aplikacje uruchamiane z linii komend.

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Accept, Accept, Accept dużo tych Acceptów. Są to informacje przesyłane do serwera, które mówią jakiego rodzaju dane aplikacja preferuje, są tu też informacje o preferowanym języku i sposobie kodowanie znaków.

Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20

Nagłówek przechowujący ciasteczka. Ciasteczka ustawiane są w Responsie serwera nagłówkiem Set-Cookie: Więcej o ciasteczkach dowiecie się w kolejnym artykule.

Referer: http://10.0.2.14/

Referer to ważny nagłówek mówiący o tym skąd nastąpiło to połączenie. Z jakiego adresu wysłano nas na stronę aplikacji.

Connection: close

Tutaj HTTP przesyła informację, że połączenie zostanie zakończone zaraz po tym jak serwer przyśle odpowiedź (Response).

Response (take that)

HTTP/1.1 200 OK
Date: Fri, 22 Feb 2019 20:28:49 GMT
Server: Apache/2.4.18 (Ubuntu)
Set-Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20; path=/
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length: 70811
Connection: close
Content-Type: text/html; charset=utf-8

HTTP/1.1 200 OK

W pierwszej lini mamy kod odpowiedzi HTTP. W tym przykładzie mamy kod 200, co oznacza, że strona poprawnie się załadowała. Zobacz koniec artykułu.

Date: Fri, 22 Feb 2019 20:28:49 GMT

Data i czas odpowiedzi serwera.

Server: Apache/2.4.18 (Ubuntu)

Nagłówek ten przechowuje informację o serwerze WWW, z którego korzysta aplikacja. Z punktu widzenia osoby testującej cenna informacja. Wiemy już jaki jest cel, teraz tylko trzeba dobrać narzędzia. Dodatkowo, można też odczytać/domyślić się jaki jest serwer pod spodem, w przypadku IIS będziemy pewni, że to Windows, w przypadku Apache już niekoniecznie, ale tak czy inaczej informacje o serwerze są cenne.

Set-Cookie: PHPSESSID=ri7uglq373rek69ufl3psbut20; path=/

Set-Cookie wprowadza ciasteczka do komunikacji. Jako że HTTP jest protokołem bezstanowym, ciasteczka umożliwiają utrzymanie informacji o działającej sesji. Tutaj też ustawiane są flagi ciasteczek i “zakres działania” (path). Temat ciasteczek i flag będzie poruszany w kolejnym artykule.

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Nagłówek ten mówi przeglądarce, czy strona powinna być zapisywana w cache’u na dysku komputera. Z punktu widzenia security ważne jest, żeby informacje wrażliwe, poufne, takie jak nr kart kredytowych, dane personalne itp. nie były przechowywane lokalnie na dysku użytkownika.

Content-Length: 70811

Informacja o tym, jaki rozmiar ma nasza odpowiedź (Response)

Connection: close

Tutaj response przesyła informację, że już można zakończyć połączenie.

Content-Type: text/html; charset=utf-8

Content-Type określa jakiego typu dane są dostarczane do przeglądarki. W tym przypadku dostajemy text oraz HTML. Zapisana jest tam również informacja o kodowaniu znaków. (charset=utf-8)

Metody

Metody definiują co i w jaki sposób aplikacja będzie przesyłać dane. Mamy cały arsenał do dyspozycji, więc nie przedłużając zapraszam do czytania:

GET – metoda przesyłająca parametry w URL’u

POST – różni się od GET tym, że parametry przesyłane są w body Requestu. Linijkę poniżej nagłówków.

PUT – służy do przesyłania np. plików na serwer.

HEAD – wysyłając request z taką metodą w odpowiedzi otrzymamy tylko nagłówki. Przy okazji tej metody warto sprawdzić jak serwer WWW reaguje na tego typu Request np. Serwer WWW Microsoft’u, IIS odpowie dając informację o wersji, która jest zainstalowana.

DELETE – służy usuwaniu plików z serwera.

TRACE – metoda, która w starszych przeglądarkach może służyć do wykonania ataku Cross-Site-Tracing.

OPTIONS – zwraca jakie metody są dostępne w komunikacji miedzy clientem a serwerem.

HTTP – Rozmowa rekrutacyjna

Często podczas rozmów rekrutacyjnych pada pytanie: Co się dzieje, gdy w przeglądarce wpisujemy adres strony i naciskamy ENTER? Oczywiście można zacząć od poziomu sieci i mówić o tzw. “three way handshake”, ale z punktu widzenia pracy ważne jest to, że wysyłamy Request do serwera i czekamy na Response. Rozwinięciem tego tematu jest pytanie, czym różni się GET od POST. Istnieje parę różnic, które należy wymienić:

  • GET przesyła parametry w URL’u, POST w BODY Requestu.
  • Parametry z GET’a są widoczne w logach serwera, natomiast te z POST nie są.
  • GET nie powinien być wykorzystywany do przesyłania wrażliwych danych. POST jak najbardziej.

Często też podczas rozmów rekrutacyjnych pojawiają się pytania o komunikaty odpowiedzi. Ciekawą odpowiedź na to pytanie zawarła autorka blogu jakosctobedzie.pl LINK

w skrócie: 2xx jest ok, 3xx przekierowania, 4xx coś poszło nie tak, 5xx błędy serwera

Najpopularniejsze odpowiedzi to:

  • 200 – poprawne załadowanie strony
  • 302 – przekierowanie do innej strony
  • 403 – dostęp zabroniony
  • 404 – brak strony
  • 500 – błąd wewnętrzny serwera
  • 503 – usługa niedostępna

Connection: Close

Mam nadzieję, że wyciągniesz z tego artykułu przydatną wiedzę i pozwoli Ci on lepiej zrozumieć to, z czym na co dzień styka się Pentester w swojej pracy. W kolejnych artykułach będę poruszał takie tematy jak HTTPS oraz Ciasteczka oraz narzędzia pomocne przy analizowaniu tych właśnie rzeczy. 

Spodobał Ci się artykuł? Zalinkuj proszę: