08 Eylül 2014

Web Uygulamaları Güvenlik Testleri İçin Temel Web Teknolojileri Bilgileri (Bölüm - 1)

HTTP protokolü,  web uygulamaları güvenlik testleri için bilinmesi gereken en temel ve öncelikli protokollerden birisidir. Bu makalemizde HTTP protokolü ve bu protokole ilişkin HTTP istek ve yanıtları, HTTP başlıkları ve HTTP metodları ele alınacaktır.

 

HTTP Protokolü:


Hyper Text Transfer Protocol bugün tüm web uygulamalarının altyapısını oluşturan metin tabanlı bir protokoldür. İlk olarak statik metin kaynaklara erişim için geliştirilmiş olan protokol daha sonra kompleks dağıtık uygulamaları desteklemek üzere genişletilmiştir.

HTTP mesajlaşma modeliyle çalışır, yani istemci bir istek (request) gönderir ve buna karşın sunucu bir yanıt döner (response). HTTP stateful TCP üzerinde çalışır, ancak connectionless bir protokoldür. Bu nedenle her istek ya da yanıt otonom bir mesaj olduğundan farklı bir TCP oturumu olarak gerçekleştirilebilir. HTTP’nin bu özelliği, yani protokol olarak oturum yönetim desteği sağlamaması, web uygulamalarında oturum yönetimini önemli bir güvenlik konusu haline getirmektedir.

URL (Uniform Resource Locator)


URL bir web kaynağını tanımlamak için kullanılır. URL’lerin genelinin formatı aşağıdaki gibidir:

Protokol://sunucuadı[:port]/[path/]dosyaadı[?parametre=değer]

HTTP İstekleri


Tüm HTTP mesajları (istek ya da yanıt) her biri ayrı bir satırda yer alan bir veya birden fazla mesaj başlığı taşır ve başlık bölümünden sonra mesaj içinde mecburi bir boş satır yer alır. Bu boş satırdan sonra opsiyonel olarak mesaj gövdesi yer alabilir.

Her HTTP isteğinin ilk satırı boşluk karakteri ile birbirinden ayrılan 3 bileşenden oluşur:
  • HTTP metodunu belirten bir eylem kelimesi. En çok kullanılan HTTP metodlarından biri sunucudan bir kaynak talep eden GET metodudur. Bu isteklerde mesaj gövdesi bulunmadığından başlıklardan sonraki boş satırdan sonra başka bir içerik taşımazlar.
  • Talep edilen URL. Opsiyonel bir sorgu string’i ile birlikte URL talep edilen kaynağın adını belirtir. Sorgu eki “?” karakteri ile başlar (genellikle demek daha doğru olur, çünkü URL’i istediğiniz gibi parse edebileceğiniz bir web uygulaması yazmak mümkündür). Sorgu kriterleri “kriter=değer” çiftleri şeklinde belirtilir. (URL için doğru teknik terim aslında URI – Uniform Resource Identifier’dır ancak sadece resmi spesifikasyonlarda bu şekilde anılır.)
  • Ve son olarak HTTP versiyonu. Internet’te hem 1.0 hem de 1.1 versiyonları kullanılmaktadır, ancak genellikle çoğu tarayıcı ön tanımlı olarak 1.1 versiyonunu kullanır. Güvenlik denetimleri açısından tek fark 1.1 versiyonununda “Host” başlığının mecburi olmasıdır.

HTTP başlıklarına aşağıda değinilecektir.

HTTP Yanıtları


Her HTTP yanıtıın ilk satırı boşluk karakteri ile birbirinden ayrılan 3 bileşenden oluşur:
  • Kullanılan HTTP versiyonu.
  • İsteğin sonucunu ifade eden numerik bir statü kodu. En sık karşılaşılan 200 statü kodu isteğin başarılı olduğu ve yanıtının dönüldüğü anlamına gelir.
  • Yanıtın statüsünü açıklayan bir neden metni. Bu değer tarayıcı tarafından herhangi bir amaçla kullanılmaz, ancak statü kodu tarayıcıların davranışını etkilemesi açısından çok önemlidir.


HTTP Metodları


HTTP 1.1 versiyonu (RFC 2616) ile tanımlanan ve diğer eklentilerle gelen başlıca HTTP metodları şunlardır:

  • GET: GET ve POST metodları en sık kullanılan metodlar olup sunucudaki kaynaklara erişmek için kullanılırlar. GET metodu ile sorgu metinleri URL içinde gönderilebilir. Bunun en önemli faydası kullanıcıların bookmark edebilmeleri ve aynı sorguyu içeren istekleri daha sonra gönderebilmelerini sağlaması ve tarayıcıda önceki sorguların “geri” tuşu ile veya tarihçeden çağrılarak aynı sayfalara ulaşabilmeleridir. Buna karşılık güvenlik açısından URL’lerin ekranda görüntüleniyor olması ve URL’in hedefine ulaşıncaya kadar ve hedef sunucu üzerinde iz kayıtlarında görülebilmesi gönderilen parametrelerin gizlilik ihtiyacı varsa sıkıntı yaratabilir. URL’de yer alan bilgiler aşağıda açıklanan “Referer” başlığında da görülmektedir. Bu nedenlerle hassas isteklerin GET ile gönderilmemesinde fayda bulunmaktadır.
  • POST: Bu metodun asli amacı bir aktiviteyi gerçekleştirmektir. Bu metodla istek parametreleri hem URL içinde hem de mesaj gövdesinde gönderilebilir. Sadece mesaj gövdesinin kullanımı yukarıda sayılan riskleri engelleyecektir. Tarayıcılar geri butonuna basıldığında POST isteğinin mesaj gövdesinde yer alan parametreleri tekrar göndermek isteyip istemedimizi sorarlar. Bunun temel nedeni bir işlemi yanlışlıkla birden fazla yapmayı engellemektir. Bu özellik ve de güvenlik gerekçeleriyle bir işlem gerçekleştirileceğinde POST metodunun kullanılması önerilir (GET metodunun yerine).
  • HEAD: GET metoduyla benzer işleve sahiptir ancak geri dönen yanıtta mesaj gövdesi bulunmaz (yani başlıklar ve içerikleri GET metoduyla aynıdır). Bu nedenle GET mesajı gönderilmeden önce bir kaynağın var olup olmadığını kontrol etmek için kullanılabilir.
  • TRACE: Teşhis amaçlı kullanılan bir metoddur. Sunucu bu metodla gelen istek mesajının içeriğini aynen yanıt gövdesinde geri göndermelidir. Bu yöntemle sunucu ile istemci arasında bir vekil sunucu varsa bu sunucunun ve yaptığı değişikliklerin tespiti mümkün olabilir.
  • OPTIONS: Bu metod belli bir kaynak için kullanılabilecek HTTP metodlarını sunucudan sorgulamak için kullanılır. Bu metod ile yapılan isteğe dönülen yanıtta tipik olarak “Allow” başlığında kullanılabilir HTTP metodları yer alır.
  • PUT: Mesaj gövdesinde yer alan içeriğin belirtilen kaynak olarak sunucuya yüklenmesini sağlayan istek metodudur. Eğer bu metod kullanılabilir durumdaysa bu metod aracılığıyla sunucuya herhangi bir betik yükleyip o betik çalıştırılarak uygulamaya ve sunucuya saldırmak mümkün olabilir.
  • DELETE: Belirtilen kaynağın silinmesini sağlar.
  • CONNECT: Bir proxy sunucu üzerinden başka bir sunucuya bağlanmak ve proxy sunucuyu bir tünel gibi kullanmak için kullanılır.
  • COPY: Belirtilen kaynağın “Destination” başlığında bulunan lokasyona kopyalanmasını sağlar.
  • MOVE: Belirtilen kaynağın “Destination” başlığında bulunan lokasyona kaydırılmasını sağlar.
  • SEARCH: Bir dizinin altındaki kaynakları sorgulamak için kullanılır.
  • PROPFIND: Belli bir kaynak için yazar (author), boyut ve içerik tipi gibi özellikleri sorgulamak için kullanılır.

Yukarıdaki metodlardan bir kısmı ve daha fazlası WebDAV (Web-based Distributed Authoring and Versioning) HTTP eklentisi ile gelen metodlardır (COPY, MOVE, SEARCH, PROPFIND). Bu eklenti web sunucusu üzerinde yer alan kaynakların ortaklaşa geliştirilmesi (editing) ve yönetilmesi için imkan sağlar.



HTTP Başlıkları


Genel Başlıklar:


Genel başlıklar hem istek hem de yanıt mesajlarında kullanılabilir. İstek ve yanıt mesajlarına özgü başlıklar ise aşağıda ilgili bölümlerde belirtilmiştir.

  • Connection: Karşı tarafa kurulan TCP bağlantısının kapatılması mı yoksa devam edecek mesajlar için açık mı tutulması gerektiğini bildirmek için kullanılır.
  • Content-Encoding: Mesaj gövdesinde iletilen içeriğin hangi kodlamaya sahip olduğunu belirtmek için kullanılır. Örneğin daha hızlı iletim için sıkıştırmanın kullanıldığı durumlarda bu başlık “gzip” değerini içerir.
  • Content-Length: Mesaj gövdesinin byte cinsinden uzunluğunu belirtir.
  • Content-Type: Mesaj gövdesinde iletilen içeriğin tipini belirtir. Örneğin HTML dokümanları için “text/html” değerini içerir.
  • Transfer-Encoding: HTTP üzerinden iletilen mesajın kullandığı kodlama tipini belirten başka bir başlıktır. Normalde “chunked” kodlamayı belirtir. Chunked kodlama eğer sunucunun üreteceği mesaj çok uzunsa bunu parçalayarak gönderebilmesini ve tüm mesajın büyüklüğünü önceden hesaplamadan mesajı göndermeye başlayabilmesini sağlar. Ayrıca sıkıştırılmış mesaj gövdelerinde mesaj gönderilirken bir yandan da sıkıştırma yapılabileceği için zaman kaybı engellenmiş olur.

İstek Başlıkları:


  • Accept: Sunucuya hangi tipte içeriğin istemci tarafından kabul edileceğini söyler. Örneğin imaj/resim formatları, ofis doküman formatları vb. gibi.
  • Accept-Encoding: Sunucuya hangi kodlama tiplerinde içeriğin istemci tarafından kabul edileceğini söyler. Örneğin “gzip” gibi.
  • Authorization: Built-in HTTP authentication tipleri için kullanıcı tarafından sunucuya gönderilen credential’ları içerir. Örneğin NTLM hash’i veya Base64 encoded parola gibi.
  • Cookie: Sunucu tarafından daha önce istemciye iletilmiş cookie’leri içerir.
  • Host: URL’de belirtilen host adını içerir. Bu özellikle aynı port üzerinden servis veren HTTP sunucularının ayırt edilebilmesi veya proxy sunucuların mesajları doğru sunuculara yönlendirebilmesi için önemlidir.
  • If-Modified-Since: Bu başlık istemci tarayıcının talep edilen kaynağa son eriştiği zamanı içerir. Eğer kaynak bu zamandan sonra değiştirilmemişse sunucu istemciye 304 statü koduyla hafızadaki (cache edilmiş) kopyayı kullanmasını söyleyebilir.
  • If-None-Match: Bu başlığın içinde istemci aşağıda açıklandığı gibi sunucu tarafından Etag başlığı içinde belli bir kaynak için bir tag göndermişse bu tag’i sunucuya geri gönderebilir. Bu şekilde sunucu kaynağın değişip değişmediğine karar vererek yanıtını dönebilir.
  • Referer: Mevcut talebin hangi URL’den kaynaklandığını içerir. Bu saha örneğin google’da yapılan bir arama sonrası erişimi tespit etmek ve ilgili google URL’inden hangi arama cümlesiyle ilgili siteye ulaşıldığının öğrenilebilmesi için kullanılabilir.
  • User-Agent: İstemci tarafından kullanılan tarayıcı hakkında bilgi içerir.

Yanıt Başlıkları:


  • Cache-Control: Sunucu tarafından istemciye cache’lemeyle ilgili talimatların iletilmesi için kullanılır. Örneğin “no-cache” içeriği tarayıcının kaynağı cache’inde tutmaması talimatı anlamına gelir.
  • ETag: Yukarıda da belirtildiği üzere sunucu istenen kaynağa bir tag değeri atayarak (entity tag) daha sonra istemci tarafından “If-None-Match” başlığı içinde gönderilen içeriğe göre yanıtını belirleyebilmektedir. Bu başlık içinde kaynağa atanmış tag değeri iletilir.
  • Expires: Sunucu tarafından istemci tarayıcıya gönderilen kaynağın ne zamana kadar geçerli olacağının iletilmesini sağlar. İstemci tarayıcı bu zamana kadar cache’lediği kopyayı kullanabilir.
  • Location: Bu başlık statü kodu 3 ile başlayan yeniden yönlendirme (redirection) mesajlarında yönlendirilmek istenen hedefi belirtir.
  • Pragma: Bu başlık da istemci tarayıcısına yönelik cache’lemeyle ilgili talimatları içerir. Yukarıdaki örnekte olduğu gibi yine “no-cache” içeriği tarayıcının ilgili kaynağı cache’inde saklamaması talimatı anlamına gelir. HTTP 1.1 uyumlu olmayan sunuculara karşı hem “Cache-Control” hem de “Pragma” başlıkların gönderilmesi önerilmektedir RFC 2616 (HTTP 1.1) tarafından. Cache-Control başlığı HTTP 1.1’de tanımlanmıştır.
  • Server: Web sunucu yazılımı hakkında bilgi içerir (yazılım üreticisi, yazılım versiyon, eklentiler, vd.)
  • Set-Cookie: İstemci tarayıcıya sonraki isteklerinde geri göndermesi için gönderilen cookie’leri içerir.
  • WWW-Authenticate: Bu başlık 401 (unauthorized) statü kodlu yanıtların içinde sunucu tarafından desteklenen tanılama (authentication) tiplerini belirtmek için kullanılır.


Cookie’ler


Cookie’ler URL string’i içinde veya HTTP mesaj gövdesinde iletilen diğer bilgilerin aksine kullanıcı tarafından herhangi özel bir işlem yapılmaksızın sunucu tarafından daha önce gönderilmiş olan bilgilerin her istekte otomatik olarak gönderilmesini sağlar.

Cookie’ler genellikle “isim=değer” çiftleri olarak ifade edilse de aralarında boşluk olmamak kaydıyla istenen karakterleri içerecek biçimde ifade edilebilir. Birden fazla cookie noktalı virgülle (;) ayrılarak tek seferde gönderilebilir.

Set-Cookie başlığı cookie’nin değerinin yanı sıra istemci tarayıcısının davranış talimatlarını tanımlamak için aşağıdaki opsiyonel özellikleri de içerebilir:

  • expires: Cookie’nin geçerli olduğu zaman sınırını tanımlar. Bu özellik tanımlı değilse istemci’nin bilgisayarı cookie’yi diskine yazmaz ve cookie sadece mevcut tarayıcı oturumunda kullanılabilir. Ancak bu özellik ileri bir tarih olarak belirtilmişse diske yazılır ve bu tarihe kadar açılacak olan diğer tarayıcı oturumlarında da kullanılır.
  • domain: Cookie’nin geçerli olduğu alan adını tanımlar. Bu alan cookie’nin gönderildiği alan veya daha üst (parent) alanlardan farklı olamaz.
  • path: Cookie’nin geçerli olduğu dizin (path) adını içerir.
  • secure: Eğer bu özellik kullanılmışsa ilgili cookie sadece HTTPS isteklerinde gönderilebilir.
  • HttpOnly: Tüm tarayıcılar bu özelliği desteklememekle birlikte eğer bu özellik kullanılmışsa cookie değerine istemci tarafında çalışan JavaScript kodları tarafından erişilemez.


                                                                                                          Sonraki Bölüm>>