15 Eylül 2014

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

Bu makale Web Uygulamaları Güvenlik Testleri İçin Temel Web Teknolojileri Bilgileri makalemizin ikinci bölümünü oluşturmaktadır.

Statü Kodları


Her HTTP yanıtı ilk satırında yanıtın niteliğini ifade eden bir statü kodu bulundurur. Bu kodlar ilk basamaklarındaki sayıya göre 5 gruba ayrılır. Bu gruplar ve grup tanımları aşağıdaki gibidir:

  • 1xx: Bilgi mesajları.
  • 2xx: Başarılı istek yanıtları.
  • 3xx: İstemciyi başka bir kaynağa yönlendiren yanıtlar.
  • 4xx: Bir hata barındıran isteklere karşı üretilen yanıtlar.
  • 5xx: Sunucu tarafında istek karşılanmaya çalışılırken bir hata alındığına ilişkin yanıtlar.

Çoğu çok özel durumlarda karşılaşılan pek çok statü kodu bulunmaktadır. Aşağıda sıkça karşılaşılan statü kodlarını bulabilirsiniz:

  • 100 Continue: Bu mesaj istemcinin mesaj gövdesi içeren bir istek gönderdiği durumlarda sunucunun mesaj başlıklarını aldığı ve mesaj içeriğini göndermeye devam etmesini belirten statü kodudur. Mesajın tamamen iletilmesi sonrasında başka bir statü kodu dönülecektir.
  • 200 Ok: İsteğin başarılı olduğu ve yanıt gövdesinde isteğin sonucu olan mesaj içeriğinin dönüldüğünü ifade eder.
  • 201 Created: PUT isteği sonucunda ilgili isteğin gerçekleştirildiğini ifade eder.
  • 301 Moved Permanently: İstemciyi “Location” başlığında belirtilen URL’e yönlendirmek için kullanılan statü kodudur. İstemci sonraki taleplerde yeni URL bilgisini kullanmalıdır.
  • 302 Found: İstemciyi geçici olarak “Location” başlığında belirtilen URL’e yönlendirmek için kullanılan statü kodudur. İstemci sonraki taleplerde orjinal URL’i kullanmaya devam etmelidir.
  • 304 Not Modified: İstemci tarafından istenen kaynak için gönderilen “If-Modified-Since” ve “If-None-Match” bilgilerine dayanılarak sunucunun istemciye cache’lenen versiyonu kullanması talimatını vermesi için kullanılır.
  • 400 Bad Request: İsteğin hatalı bir HTTP isteği olduğunu belirten statü kodudur. Bir URL’in içine boşluk karakteri yerleştirilmesi gibi durumlarda ortaya çıkar.
  • 401 Unauthorized: Sunucunun istemciye istenen kaynağa ulaşmak için kullanıcı credential’ları göndermesi gerektiğini söylediği statü kodudur. Yanıt mesajındaki “WWW-Authenticate” başlığı içinde sunucunun desteklediği tanılama yöntemleri belirtilir.
  • 403 Forbidden: İstenen kaynağa kim olursa olsun (authenticate olunsa dahi) erişimin yasak olduğu anlamına gelir.
  • 404 Not Found: İstenen kaynağın mevcut olmadığını belirtir.
  • 405 Method Not Allowed: İstenen URL için belirtilen metodun sunucu tarafından desteklenmediğini belirtir. Örneğin PUT metodunun desteklenmediği bir dizin için bu metodun kullanılması durumunda 405 statü kodlu yanıt mesajı alınır.
  • 413 Request Entity Too Large: Hafıza taşması açıklıkları için istek mesajı gövdesinde çok uzun bir içerik oluşturduysanız ve bu statü kodlu yanıt mesajını aldıysanız mesaj gövdesinin sunucunun işleyebileceğinden çok uzun olduğu anlamına gelir.
  • 414 Request URI Too Long: URI bilgisinin sunucunun işleyebileceğinden uzun olduğu anlamına gelir. Yukarıdaki gibi durumlarda karşılaşılabilir.
  • 500 Internal Service Error: Sunucu tarafından istek işlenirken bir hata oluşması durumunda gönderilen statü kodudur. Hatanın detayları yanıt mesajında belirtilebilir.
  • 503 Service Unavailable: Web sunucusunun çalıştığı ancak sunucu tarafından erişilen uygulamanın çalışmadığı durumlarda gönderilir.


HTTPS


HTTPS, HTTP protokolünün SSL tüneli içinden kriptolu biçimde gönderilmesine verilen addır. Genellikle 443 portunu kullanır. Uygulama seviyesinde yine HTTP protokolü çalışır. HTTPS ile ulaşılan sunucuların testlerini yaparken ya HTTPS’i destekleyen istemciler kullanmalı veya bir SSL proxy kullanılmalıdır.

HTTP Proxy’leri


Proxy istemci tarayıcı ile sunucu arasında mesaj iletimine aracılık eder. Proxy’lerin temel kullanım alanları kullanıcı tanılama, erişim kontrolü, caching ve iz kaydı tutmadır.

Saldırı proxy’leri dediğimiz istemci bilgisayarında çalışabilen ve HTTP istek ve yanıtlarına erişip bunlarda değişiklik yapabilmemizi sağlayan proxy’ler web uygulama güvenliği denetimlerinde en büyük yardımcımızdır. Bunların bazıları gözlenmiş istekler üzerinde otomatik değişiklikler yapabilmek suretiyle kaba kuvvet yöntemiyle testler yapabilmemizi sağlarlar.

Normal proxy’lerden bahsedersek, istemci tarayıcılar proxy ile HTTP ve HTTPS kullanımına göre aşağıdaki şekilde bağlantı kurarlar:

  • HTTP kullanımı durumunda: İstemci proxy’ye “http://” prefix’ini de içeren tüm URL bilgisini istek mesajına yerleştirerek gönderir. Proxy host adını alarak mesajı ilgili sunucuya yönlendirir.
  • HTTPS kullanıldığı durumlarda istemcinin proxy ile SSL el sıkışmasını yapması güvenlik açısından mümkün değildir, çünkü bu durumda SSL iletişiminin dinlenme riski doğacaktır. Bu nedenle proxy TCP seviyesinde bir aracı olarak çalışır. İstemci tarayıcı URL’de host adı ve port numarasını belirterek CONNECT metoduyla proxy’ye bağlanır. Proxy bağlantıya izin verirse 200 statü kodlu yanıtla cevap verir ve TCP bağlantısını açık tutmaya devam eder. Bu noktadan sonra sadece hedef sunucuyla istemci arasında TCP seviyesinde aracılık yapmaya devam eder.

Bir başka proxy türü de “reverse proxy”dir. Bunlar sunucunun önünde duran ve sunucuya erişmek isteyen tüm kullanıcıların sunucu IP adresi ile şeffaf (transparent) bir şekilde bağlandığı sunuculardır. Bu proxy’lerin ana amaçlarından bazıları yük dengelemesi yapmak ve erişim kontrolüdür. Bunlara ek olarak diğer proxy faydaları olan iz kaydı tutma, caching sağladıkları faydalardandır.


HTTP Kullanıcı Tanılama (Authentication)


HTTP protokolü içinde tanımlı ve tüm tarayıcılar tarafından desteklenen kullanıcı tanılama yöntemleri genellikle internetten erişilen uygulamalar için kullanılmaz. Bu metodların daha çok intranet sunucularında kullanıldığını görürüz. Bu metodlar şunlardır:

  • Basic: Bu yöntem göreceli olarak basit bir yöntem olup “Authorization” başlığı içinde kullanıcı credential’ları Base64 encoded olarak gönderilir. Base64 kodlama bir kriptolama yöntemi değildir ve herhangi bir anahtara ihtiyaç olmaksızın orjinal veriye ulaşmaya imkan tanır. Temel kullanım alanı binary verilerin metin olarak kodlanabilmesine imkan tanımak suretiyle metin tabanlı protokoller üzerinden (ör. HTTP) veri aktarımı yapılmasını sağlar. Tabi bu özelliğinin password kullanımında sağladığı fazla bir fayda yoktur.
  • NTLM: Bir challenge-response mekanizması olup Windows NTLM protokolünün bir versiyonunu kullanır.
  • Digest: Bir challenge-response mekanizması olup sunucudan alınan nonce değeri ve kullanıcı credential’larının MD5 hash’inin alınması ile kullanılır.

Internet üzerinden ulaşılan uygulamalarda çoğunlukla form tabanlı kullanıcı tanılama yapıldığını gözlemleriz, ancak bu metod Basic dahil yukarıdaki metodlardan daha güvenli değildir. Çünkü form temelli tanılamada credential’lar genellikle açıkta gider. Bunların güvenliğini sağlamak için mutlaka HTTPS protokolü kullanılmalıdır, bu durumda Basic kullanıcı tanılama yöntemi de form temelli tanılamadan daha düşük bir güvenlik sağlamaz.


Sunucu Tarafı Web Fonksiyonalitesi:


Sunucu teknolojileri HTTP protokol desteğinin ötesinde gerekli fonksiyonaliteyi sağlayabilmek için farklı bileşenleri içerir. Bunlar:

  • Scripting dilleri (PHP, VBScript, Perl)
  • Web uygulama platformları (ASP.NET, Java)
  • Web sunucuları (Apache, IIS, Netscape Enterprise)
  • Veritabanları (MS-SQL, Oracle, MySQL)
  • ve diğer destekleyici servislerdir (File Systems, SOAP tabanlı web servisleri, dizin servisleri)

Sunucu üzerinde gerekli işlemlerin gerçekleştirilebilmesi için kullanıcı tarafından parametre gönderme imkanları aşağıdakilerden oluşmaktadır:

  • URL sorgu string’leri
  • HTTP cookie’leri
  • POST metodu ile yapılan istek mesaj gövdeleri

Özellikle web uygulama platformları ve scripting dillerinden bazılarından bahsedersek şunları söyleyebiliriz:

Java Platformu


Sun Microsystems tarafından geliştirilen Java Platform, Enterprise Edition pek çok büyük ölçekli uygulamanın altyapısını oluşturmaktadır. Java platformu Windows, Linux ve Solaris gibi işletim sistemleri üzerinde çalışabilmekte ve modüler çalışma şeklini desteklemektedir. Java platformu oluşturan teknolojilerin bazılarından bahsedersek:

  • Java Servlet: Uygulama sunucusu üzerinde çalışarak HTTP isteklerini alıp, işleyip geri HTTP yanıtları gönderir. Servlet’ler tarafından kullanılabilecek çok sayıda fonksiyonel arayüz farklı fonksiyonel ihtiyaçlara sahip uygulamalar geliştirebilmek için mevcuttur.
  • Web Container: Java tabanlı web uygulamalarının üzerinde çalışabileceği ortamı sağlayan bileşenlerdir. En çok görülen örnekler Apache Tomcat, BEA WebLogic ve Jboss’tur. Bu container’lar kendi yönetim arayüzlerini de barındırabilir ve saldırganlar için iyi birer hedef olabilirler.
  • Enterprise Java Bean (EJB): Nisbeten büyük java nesneleri olup genellikle yazılımın iş mantığını oluşturan, işlem bütünlüğü gibi teknik sorunları çözen kodları barındırırlar.
  • Plain Old Java Object (POJO): Sıradan java nesneleri olup geliştiriciler tarafından yazılan basit kodları barındırırlar.

Çoğu java uygulaması özel geliştirilen kodların yanı sıra üçüncü taraflarca geliştirilmiş ve açık kaynak kodlu bileşenler de barındırmaktadır. Bunlar kullanıcı tanılama (JAAS), iz kaydı tutma (Log4J) ve diğer konularda yardımcı uygulamalardır. Kullanılan bileşenlerin tespit edilebilmesi halinde bunlardan kaynaklanan açıklıklardan da yararlanılabilir. Açık kaynak kodlu bileşenler üzerinde araştırma yapılabilir.

ASP.NET


Microsoft’un web uygulama geliştirme çerçevesi olan ASP.NET .Net framework üzerinde çalışmaktadır. Bu altyapı üzerinde çalışması nedeniyle .NET dillerini (C# ve VB.NET) desteklemekte, Common Language Runtime adlı virtual machine üzerinde çalışmakta ve olay tabanlı (event driven) çalışmayı desteklemektedir.

Virtual Studio aracı ile diğer platformlara göre kullanım kolaylığı sağlamaktadır.

PHP


PHP bir hobi projesi olarak başlayıp (PHP personel home page’in kısaltmasıdır) güçlü bir platform haline gelmiş ve yaygın kullanıma ulaşmıştır. PHP genellikle LAMP yığını olarak adlandırılan (Linux, Apache, MySQL ve PHP) diğer açık kaynak kodlu yazılımlarla bir arada kullanılmaktadır.

PHP kullanım kolaylığı ve ücretsiz olması dolayısı ile çoğu yeni uygulama geliştiriciler için tercih edilen araç olmaktadır. PHP ile yazılmış pek çok kullanıma hazır açık kaynak kodlu uygulama projeleri (Webmail uygulamaları – SquirrelMail, yönetici arayüzü – PHPMyAdmin, fotoğraf galerisi – Gallery, alışveriş siteleri – osCommerce, wikiler – MediaWiki gibi) bulunmaktadır. Bunlar özel geliştirilmiş kodlarla birlikte de kullanılmaktadır.




<<Önceki Bölüm                                                                                                      Sonraki Bölüm>>