Umut Tosun

I love low level stuffs and cyber security

HTTP Protokolü

19 Nov 2017 » Protocol

Eskiden network ler arası bağlantı arttığında, bilgiye ulaşmanın yanı sıra o bilginin düzgün bir biçimde görüntüleme ve işlem yapma konusunda sorunlar oluşmuştu. Buna çözüm olarak HTTP protokolü geliştirildi.

HTTP protokolünün tarihçesi için bu yazıya göz atabilirsiniz.

Kısaca HTTP: client ların web sayfalarını, web server lardan nasıl istediğini ve web server ların, web sayfalarını client lara nasıl transfer edeceğini tanımlar diyebiliriz. Protokolün detaylarını inceleyelim.

HTTP request-response behavior

HTTP, uygulama katmanı(application layer) bir protokoldür ve transfer için TCP protokolünü kullanarak haberleşme sağlanır.

İlk önce client, server ile TCP bağlantısı kurar. (Üçlü el sıkışma hakkındaki yazıma buradan ulaşabilirsiniz.) Daha sonra browser ve server, TCP bağlantısı ile haberleşmeyi socket ler yardımı ile gerçekleştirir.

Socket’ler, process ile TCP bağlantısı arasındaki kapı olarak düşünülebilir. Bir uygulama TCP protokolü üzerinden bir veri göndermek isterse bunu ilgili sockete gönderir ve gerisini işletim sistemi ve ağ kartı halleder. Aynı şekilde karşıdan bir veri geldiği zaman, ilgili socketin receive kısmına yazılır ve uygulama buradan okuyarak işlem yapar.

Server ve client birbirleri ile haberleşmesi için HTTP protokolünde 2 mesaj tipi bulunuyor: HTTP Request ve HTTP Response

HTTP Request

Server ve client arasında TCP bağlantısı kurulduktan sonra artık server ve client, HTTP Request ve HTTP Response mesajları ile birbirleriyle anlaşabilirler.

HTTP Request, client’ın server dan istekte bulunduğu mesaj tipidir. Örneğin bir bir web sitesine bağlanmaya çalıştığımızda ilk önce TCP bağlantısı kurulur, ardından client(yani biz) server dan hangi siteyi görmeyi istediysek bunu HTTP Request mesajı ile TCP bağlantısı üzerinden istiyoruz.

HTTP request mesajının genel formu

İsterseniz örnek bir HTTP Request mesajını inceleyelim.

GET /web-application-pentesting/ HTTP/1.1 HOST: www.umuttosun.com Connection: close User-agent: Mozilla/5.0 Accept-language: tr

Şimdi inceleyelim detaylı olarak.

HTTP request methodları yardımı ile server la aramızda hangi işlemin yapılacağını belirtebiliyoruz. “GET” methodu bunlardan biridir. GET methodu, serverdan bir obje(döküman) getirmek istediğimizi belirtiyor. Çeşitli HTTP Request methodları mevcuttur ve bunların herbirinin görevi ayrıdır. Eğer bir web developersanız sıklıkla karşılaştığınız bir method daha var: POST. Birazdan diğer methodları ve ne işe yaradıklarından bahsedelim ama şimdi örneğimize devam edelim.

GET’ten sonra server dan hangi objeyi istediğimizi belirliyoruz. Bizim örneğimize göre “/web-application-pentesting/” i istemişiz. ve satırın sonunda gördüğümüz HTTP/1.1 ise HTTP 1.1 protokolünü kullandığımızı gösteriyor.

Requestteki “Host” ise hangi websitesinden bu objeyi istediğimiz belirtiliyor.

Web sitesi ile bağlantı iki türlü oluyor: close ve keep-alive. Eğer “Connection”, close olarak belirtilmişse bu, web sitesini getirdikten sonra tcp bağlantısını sonlandır demek oluyor. Keep-alive ise web sitesini getirdikten sonra bile bağlantıyı açık tut demek. Close ve keep-alive birbirleri arasında daha üstün diyemeyiz. Örneğin facebook a girmek istediğinizi düşünün, eğer “Connection: close” olarak tanımlanmışsa sürekli yeni bağlantı kurulup kapatılacak, buda performans ve kaynak kaybına neden oluyor.

Tarayıcılarımızın kendine ait bir user-agent ı bulunuyor. Bunlar yardımı ile server tarayıcıya özel ayarlar yapabiliyor yada tarayıcıya özel içerikler üretebiliyor. İşte bu user-agent ımızı HTTP request mesajında “User-agent” başlığında belirtiyoruz.

“Accept-language” başlığı ile tercih ettiğimiz dili belirliyoruz.

GET methodunu gördük. Şimdi diğer HTTP request methodlarına bir göz atalım.

HTTP Request Methods

  • GET: Web sayfasını istediğimizi belirtiyor.
  • HEAD: Web sayfasını getirmek istediğimizi belirtiyor fakat sadece HTTP Response header ını getirir.
  • PUT: Web sayfasına bir dosya koymak için kullanılır.
  • POST: Bir veriyi http request mesajı ile ilgili sayfaya göndermek için kullanılır.
  • DELETE: Web server dan dosya silmek için kullanılır.

Sıklıkla kullanılan methodlar bu şekilde.

İsterseniz HEAD methodunu deneyelim. Bunu proxy kullanarak yapabilirsiniz fakat ben hemen kolaya kaçıp telnet kullanacağım.

$telnet google.com 80
HEAD /index HTTP/1.1
Host: www.google.com

Telnet bizim yerimize tcp bağlantısı kuruyor, biz sadece http request mesajını yazıyoruz. (HTTP request mesajını yazdıktan sonra iki kez enter a basmanız gerekiyor.) Bize gelen HTTP Response mesajı ise şu şekilde:

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Content-Length: 1566
Date: Sun, 19 Nov 2017 17:00:00 GMT

HEAD methodunun sadece GET methodunun response başlıklarını getirdiğini kendiniz deneyerek doğrulayabilirsiniz.

HTTP Response

HTTP request mesajı gönderdiğimizde server bize HTTP Response mesajı ile döner. Bu şekilde işlemimizin başarılı olup olmadığını, olduysa geri dönen verileri görebiliriz.

HTTP Response mesajının genel formu

Örnek bir HTTP Response mesajı üzerinden gidelim:

HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:00:00 GMT
Server: Apache/2.2.3 (Centos)
Last-Modified: Tue, 09 Aug 2011 14:00:00 GMT
Content-Length: 6511
Content-Type: text/html
Set-cookie: 1555
 
 (veri)(veri)(veri)

HTTP/1.1, HTTP Request mesajında gördüğümüz HTTP/1.1 ile aynı, yani HTTP protokolünü belirtiyor. Aynı şekilde Connection başlığı bağlantının kesildiğini belirtiyor.

HTTP/1.1 den sonra 200 yazdığını görüyoruz. Bu durum kodunu belirtiyor. Bu durum kodları yardımı ile istediğimizin durumunun ne olduğunu anlayabiliyoruz. Çeşitli durum kodları mevcuttur. Bunlardan bazıları:

  • 200: İstek başarılı, veriler http response mesajı ile gönderildi.
  • 301: İstenilen obje kalıcı olarak taşındı. Location başlığı ile belirtilen yerde bulabilirsiniz anlamında.
  • 400: Bu durum kodunun anlamı genelde server ın istenilen mesajı anlayamadığını gösteriyor.
  • 404: İstenilen obje serverda bulunmadığını belirtir.

Date başlığı, server’ın tarihini gösteriyor.

Server başlığı, kullanılan web servisinin adı ve işletim sisteminin adı bilgilerini içerebiliyor. Sızma testi yaparken bu bilgiler işimize çok yarayabilir fakat bu başlık zorunlu olmadığı için genelde http response mesajında bulunmaz.

Last-Modified başlığı, istenilen objenin en son ne zaman düzenlendiğini gösteriyor.

Content-Length başlığı, gönderilen objenin boyutunun kaç byte olduğunu belirtir.

Set-cookie başlığı, server ın cookie oluşturmasını sağlıyor.(Cookieleri ayrı bir yazıda bahsedeceğim.)

Content-Type başlığı, gönderilen verinin tipini belirtir.

Son olarak HTTP Response mesajının body kısmında ise gönderilen obje bulunuyor. Bahsetmediğim bir-iki başlık daha bulunuyor, bunları yavaş yavaş düzenleme yaparak eklemeyi düşünüyorum

Aslında biz bir web sayfası istediğimizde bizim yerimize browser bütün bunları hallediyor.

Kaynaklar

Computer Networking A Top-Down Approach