LYK — Web Uygulama Güvenliği ve Güvenli Kod Geliştirme (2.gün)

Hatice Ergün
Jul 23, 2017 · 4 min read

Bir önceki yazı için tıklayın.

Bu yazımda, bilgisayarın açma düğmesine basıp, kamp.linux.org.tr adresine ulaşıncaya kadar hangi işlemlerin gerçekleştiğini anlatacağım.

HTTP (Hypertext Transfer Protocol)

Bilgisayarın açma düğmesine bastık ve bios çalışmaya başladı. Ardından bootloader, kernel, prosesler çalıştı işletim sistemi yüklendi ve masaüstü açıldı. Şimdi internet erişimini sağlayalım, cat kablosunu taktık yada wifi ile modeme bağlantı kurduk. Burada modemden bir ip almamız gerekiyor. Ağda bir brodcast yayını yapılır ve DHCP ( Dynamic Host Configuration Protocol) bize ip adresini verir. Artık internete erişimimiz var.

Raw Request(Ham İstek)

Tarayıcımıza ulaşmak istediğimiz adresi yazıyoruz, kamp.linux.org.tr. Adresi yazdık ve bir request(istek) yapmış olduk. Bu istek tarayıcımızın hazırladığı istek paketiyle yapılıyor. Tarayıcı bir Raw Request http paketi hazırlıyor. Bu paket içerisinde head line, header ve body kısmı bulunur.
Head line, yazıldıktan sonra bir crlf yapılır alt satıra geçilir.
Headerlar, yazıldıktan sonra iki kez crlf yapılır ve alt satıra geçilip bir satır daha boşluk bırakılmış olur.
Body, yani esas gönderdiğimiz içerik yer alır(bir form doldurmuş ve onu gönderiyor olabilirdiniz buradaki bahsettiğim içerik sizin gönderdiğiniz veriler).

Format Kuralı: Bu raw request paketlerinin formatını RFC topluluk kuralları belirler. Bu kurallara tüm tarayıcılar uymak zorundadır. Aralarında bu şekilde boşluk bırakılmasının sebebi ise, sunucu gelen paketleri parçalayarak işleme alır. Parçalara ayırmayı bu boşluklara göre yapar. Dolayısıyla sunucunun gelen isteği anlayabilmesi için Raw requestler bu formatda olmak zorundadır.

Örnek;

GET /index.html HTTP/1.1
Host: kamp.linux.org.tr
Name: Value
Cookie: ad=hatice; soyad=ergun
Referer: http://abc.com/a.html
Content-Type: aplication/x-www-form-urlencoded

body

İlk satırda methot belirtir, istek yaptığımız sayfayı yazarız. Sunucuya yaptığımız bu raw request istekleri methotlarla yaparız. (GET, POST, PUT, DELETE…). Eğer bir sayfaya değilde domaine istek yapıyorsak sadece “/” işaretini yaparız ve kullandığımız protokolün adını ve sürümünü yazarız.
Bir crlf yaptıktan sonra(alt satıra geçince) headerları yazmaya başlarız. Headerlar giden request paketinde ve gelen response paketinde kullanılırlar. Her header farklı bir bilgiyi taşır.
İki kez crlf yaptıktan sonra body yani sayfa içeriği yazılır ve paket hazırlanmış olur. Hazırlanan bu raw requestinin güvenliği ssl sertifikası ile sağlanır. Bu giden request paketi şifrelenerek gönderilir. Bu sayede zafiyet önlemi alınmış olur.

Header

Yukarıdaki örnekte bir kaç header verdim. Giden request paketinde olmazsa olmaz tek bir header vardır, host headerı.
Host headerı istek yaptığımız adresi gönderir. İstek yapılan adresi bilmeden sunucuya ulaşamayız. Bunun dışındaki giden headerlar olmasa da olur fakat tarayıcılar bu headerları da gönderir. Sadece gönderilen paketde kullanılan headerlar da vardır.
Cookie headerı, adından da anlaşılacağı gibi cookie de bulunan değerleri gönderir.
Referer headerı, bu siteye girmeden bir önceki adresi gönderir. Referans olan sitenin bilgisidir.
Content-Type headerı, body içerisinde gönderilen sayfa içeriğinin, hangi body tipinde gönderildiğinin bilgisidir.
Burada bahsettiğimin dışında bir çok header vardır. Bunlara bir göz atmakta fayda var.(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)

Body Tipleri

form-data, x-www-form-urlencoded, raw, binary.

Request ile gönderilen body (sayfa içeriği) dört farklı tiple gönderilir. Bunların arasında yazı formatı olarak fark vardır. Bu tipler arasındaki farkları postman programıyla görebilirsiniz. Programı indirip key ve value değerlerini girdiğinizde code yazan butona bastığınız zaman seçtiğiniz body tipine göre sayfa içeriğinin nasıl gönderildiğini görebilirsiniz.
Tarayıcı bu body tipini gönderilen içeriğe göre kendisi seçer. Body tipini kendiniz belirlemek isterseniz, form içinde enctype ile body tipini verebilirsiniz.

Raw Request Paketi Nasıl Server’a Ulaşır?

Tarayıcı bu paketi hazırladıktan sonra ulaşmak istediği adresi yani host headerındaki adresi öncelikle hosts dosyasında arar. Daha sonra sırasıyla dns cache, pc dns, modem, isp(internet sağlayıcı servisi), root dns, server dns’de arar (Bulana kadar bu sırayla adresi arar.).
İlk iki adımda host dosyasında ve cache de direk ip adresini arar. Bu iki adımda ip adresini bulamıyorsa, bu adresi bulacağı dns serverın olduğu adresi aramaya başlar. Dns server’da gelen adrese bakılır. kamp.linux.org.tr
Dns sorgusuyla, bu paket tr uzantılı olduğu için tr uzantılı domainlerin bulunduğu sunucuya yönlendirilir. Bu sunucularda sırasıyla org, linux şeklinde sağdan sola doğru adım adım yönlendirilerek aranan adres bulunur. İstek yapan makine(client) ile cevap veren sunucu(server) aralarında üçlü el sıkışma (3 Way Handshake) yapar ve artık paket sunucuya ulaşmış olur.

Sunucu(Server)

Sunucularda portlar bulunur. Server gelen portları dinler ve gelen isteklere göre cevap döndürür. Web serverlarda 80 portundan gelen isteklere cevap verilir (Dns portu: 53,HTTP: 80, HTTPS: 443, SSH: 22).
Bu ayarlar web serverlar tarafından yapılmıştır(apache, ngnix gibi.) Apache bir web server servisidir.

Peki neden bu servisleri kullanıyoruz, kendimiz gelen portu dinle diye kod yazamaz mıyız? Elbette yazabiliriz ve çok da uzun bir işlem değil. Fakat bu servisler sadece port dinlemesi yapmıyor. Config yapmayı sağlarlar ve kendi içinde birçok ayarı vardır. Gelişmişlerdir. Sadece port dinlemesi yapıyor şeklinde düşünmemek gerekir. Sunucu kendisine gelen istekleri host headerındaki istek adrese göre cevaplar.

Şöyle bir request gelmiş olsaydı;
GET /kayit.php HTTP/1.1
Host: kayit.linux.org.tr
Host: abc.com

Bu şekilde gelen isteğe web sunucuları farklı cevaplar verir. Apache abc.com adresini gönderirken, ngninx kayit.linux.org.tr adresini gönderecektir. Burada biri hatalı diyemeyiz. İkisininde cevabı doğrudur aslında.

Server gelen isteğin adresine göre kendi içinde öncelikle nerede olduğunu bulur (İstenilen dosya /home/linux/kayit.php gibi bir dizinde bulunur.). Server buradaki kodu alır ve gönderir. Biz sunucuda php kurmuşsak eğer apache önce bu dosyayı php’ye gönderir ve php bu dosyayı çalıştırdıktan sonra apache’ye verir. Apache aldığı cevabı yollar. Eğer php kurulu olmasaydı bu dosya kodları işlenmeden gönderilmiş olacaktı.

Response Paketi

Apache servisi vereceği cevabı bir paket olarak yollar, tarayıcı bu paketi alır ve paketde gönderilen cevaba göre kullanıcıya sayfa görüntüler.

HTTP/1.1 200 OK
Header: Value
Server: _server version bilgileri_
Set-Cookie: ad=hatice

_Response body(html)_

İlk satırda protokol bilgisi verildikten sonra HTTP Statüs Kod bilgisi verilir.
100'den başlayarak 100,101,102… şeklinde üç haneli statüs kodları vardır.

1xx : 100 haneli kodlar bilgi vermek için gönderilir.
2xx : 200 haneli kodlar “tamam” kodlarıdır, sorun yok.
3xx : Yönlendirme kodlarıdır.
4xx : Hata kodlarıdır. Hata gelen istektedir.
5xx : Hata kodlarıdır. Hata sunucu tarafındadır.

Sunucu tarafında olan hatalarda paket kullanıcıya gitmez, loglara düşer.
Response paketlerde header olmak zorunda değildir.

(Daha ayrıntılı bilgi için buradaki terimleri ayrı ayrı araştırmakta fayda var teknik detaylar oldukça fazla.)

Bir sonraki yazı için tıklayın.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade