Bu makale Web Uygulamaları Güvenlik Testleri İçin Temel Web Teknolojileri Bilgileri makalemizin üçüncü bölümünü oluşturmaktadır.
İstemci Tarafı Web Fonksiyonalitesi:
Bir web uygulamasını kullanmak veya bir web sitesi kaynaklarının kullanımı için istemci tarafında da belli fonksiyonaliteler sağlanmaktadır. Bunlardan bazıları aşağıdaki gibidir:
- HTML: En temel istemci fonksiyonalitesi web sunucusundan gelen HTML ile kodlanmış bir sayfayı / dokümanı görüntülemektir. HTML içinde içeriğinin nasıl yorumlanması gerektiğini belirten tag’ler barındırır. HTML çalışma anında bir fonksiyonalite sağlamamakla birlikte statik içerik görüntülemeden başlayan tarihi boyunca fonksiyonellik açısından gelişmiştir.
- Hyperlinks: Web sayfaları üzerinde gezintimizin önemli bölümü hyperlink’lerin tıklanmasıyla gerçekleşmektedir. <a> HTML tag’i ile belirtilen hyperlink’ler içeriğinde hazır query string’leri barındırabilir. (Ör: <a href=”/haberler/habergoster?haberno=12345&dil=turkce”>) Bir hyperlink’e tıklanması sonucunda tarayıcı bildiğimiz GET metodu ile bir istek mesajı yaratır ve ilgili sunucuya gönderir.
- Formlar: Hyperlink’ler farklı işlemleri gerçekleştirmek için query string’ler içerecek biçimde oluşturulabilse de daha esnek ve parametrik bir giriş yapma ihtiyacı bulunmaktadır. <form> HTML tag’i ile tanımlanan formlar bu ihtiyacı yerine getirirler. Örnek bir HTML formu aşağıdaki gibi tanımlanabilir:
<form action=”/secure/login.php?app=quotations” method=”post”>
Username: <input type=”text” name=”username”><br>
Password: <input type=”password” name=”password”>
<input type=”hidden” name=”redir” value=”/secure/home.php”>
<input type=”submit” name=”submit” value=”log in”>
</form>
Kullanıcı formun sahalarına bilgi girişi yaptıktan ve “submit” tuşuna bastıktan sonra tarayıcı aşağıdaki istek mesajını gönderir:
POST /secure/login.php?app=quotations HTTP/1.1
Host: companyx.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
Cookie: SESS=wsdrtg67opl098mnbv938726?
username=fatih&password=eses&redir=/secure/home.php&submit=log+in
Bu örnek üzerinden form aracılığı ile oluşturulan bir istek mesajının yapısı ve mesajın hangi bölümleri sunucu uygulamanın çalışması üzerinde etkili olabilir tartışabiliriz:
· HTML form tag’i içindeki “method” özelliğinde POST değeri bulunduğundan istek mesajı POST metodu ile oluşturulmuştur. Bu nedenle form içindeki bilgiler mesaj gövdesinde gönderilmektedir. Bununla birlikte formun “action” attribute’ünde tanımlı URL aynen gönderildiğinden içinde bulunan query string’de POST metodundaki URL’de görülmektedir. Daha önceden değer atanmış olan “app” parametresi sunucu tarafındaki kodun işleyişi üzerinde etkili olabilir.
· Kullanıcı tarafından girilen 2 sahanın yanı sıra POST mesajında bir gizli (hidden) parametre (redir), bir de submit parametresi bulunmaktadır. Kullanıcı tarafından girilen bilgilerin yanı sıra bu parametrelerde bulunan değerler de sunucu tarafındaki çalışmayı etkileyebilir.
· İstek mesajı daha önce sunucu tarafından sağlanan bir cookie’yi (SESS) barındırmakta olup bu değer sunucu uygulama tarafından kullanılabileceğinden sunucu işleyişini kontrol etmek için kullanılabilir.
Yukarıdaki örnekte gönderilen istek mesajının içinde mesaj gövdesinde gönderilecek verinin formatının parametre/değer çiftleri halinde olduğunu belirten bir başlık değeri bulunmaktadır, “x-www-form-urlencoded”. Bir diğer format “multipart/form-data”dır. Bur web uygulaması gönderdiği formun “enctype” özelliğini bu şekilde belirtirse istemci tarayıcısı mesaj gövdesinin formatını bu şekilde oluşturacaktır. Ayrıca istek mesajı başlıklarından Content-Type içinde rastgele oluşturulmuş bir metin parametre ayracı olarak tanımlanacaktır (Ör: Content-Type: multipart/form-data; boundary=------------asdfgh345678).
- JavaScript: Uygulamalar daha fonksiyonel işlevler sağlamak için HTML kodunun içinde istemci tarafında yorumlanmak ve çalıştırılmak üzere scriptler barındırabilir. Bu kodlar bazı kontrolleri istemci tarafında yaparak veya kullanıcı arayüzünü daha dinamik hale getirerek mesaj gönderme ve yanıt alma ihtiyacını azaltır ve dolayısıyla uygulama performansını da olumlu etkiler.
- İstemci tarafında başlıca scripting kullanılma alanları şunlardır:
- Girilen verinin hatalı olması durumunda gereksiz mesaj alış verişini azaltmak için kullanıcı tarafından girilen verilerin kontrolü
- Kullanıcı aksiyonlarına göre kullanıcı arayüzünün dinamik olarak değiştirilmesi (örneğin bir seçenek seçildiğinde bir drop-down menü görüntülenmesi gibi).
- Document Object Model (DOM) aracılığıyla tarayıcıya yüklenmiş web sayfasını sorgulamak ve güncellemek.
AJAX teknikleri ile JavaScript fonksiyonalitesi daha da artırılmış ve kullanıcıya lokal uygulama deneyimine yakın bir deneyim yaşatma imkanı doğmuştur. Bu teknikle sayfa tamamen yenilenmeden kullanıcının belli aksiyonları karşısında sayfanın ilgili alanları için tarayıcı sunucuya istek göndermekte ve gerekli güncellemeleri yapmaktadır. Ancak bu fonksiyonalite özellikle kullanıcılar arasındaki saldırılarda da etkili bir araç olarak kullanılabilmektedir.
- Thick Client Bileşenleri: İstemci tarafında yüksek fonksiyonalite için bir virtual machine üzerinde çalışmak üzere veya native kod olarak geliştirilmiş thick client bileşenleri de bulunmaktadır. En çok rastlanan teknolojiler aşağıdaki gibidir:
- Java Applet’leri
- ActiveX kontrolleri
- Shockware Flash nesneleri
- Oturumun ve Durum Bilgisinin Takibi: Web uygulamaları gereken fonksiyonaliteyi sağlayabilmek için durum bilgisini saklayabilmeli ve ardışık isteklerin belli bir kullanıcıdan ve belli bir işlem için geldiğini takip edebilmelidir. Çünkü pek çok işlem birden fazla adımdan geçilmesini, dolayısıyla birden fazla mesaj alış verişini gerektirir. HTTP protokolünün native bir oturum yönetim desteği olmadığından oturum takibi HTTP istek parametreleri kullanılarak yapılmaktadır. Herhangi bir parametre (parametre string’i içinde bulunan ad=değer çiftleriyle, form sahalarıyla veya cookie’lerle) ile oturum takibini yapmak mümkün olmakla birlikte tercih edilen yöntem cookie’lerin kullanımıdır.
Durum bilgileri (örneğin alışveriş sepetinde yer alan ürünlerin daha sonra uygulama kullanıldığında da gösterilebilmesi amacıyla) sunucu üzerinde tutulabileceği gibi bu bilgileri istemciye gönderip her istekte geri göndermesi de sağlanabilir. Ancak istemciden gelen bilgilerin istemci tarafından değiştirilebileceğini unutmamak gerekir. Durum bilgisinin istemci tarafından tekrar gönderilmesine örnek olarak ASP.NET’in bir hidden form sahası olarak kullandığı ViewState sahasını örnek verebiliriz. ViewState içindeki bilgilerin değiştirilmediğinden emin olmak için bu bilgi ayrıca bir anahtar kullanılarak parametrelerin hash’lenmiş değerini de içerir.
Encoding Yöntemleri:
Hem HTTP hem de HTML metin bazlı protokoller olup ikilik (binary) veri iletimi veya HTTP veya HTML protokolleri içinde özel anlamlara gelen meta karakterlerin orjinal hallerinde iletilebilmeleri için bazı encoding yöntemleri kullanılmaktadır.
- URL Encoding: URL’ler sadece US-ASCII karakter setindeki yazılabilir karakterleri içerebilir (yani başlangıç ve bitiş karakterleri dahil olmak üzere 0x20-0x7e ya da ondalık düzende 32-122 (boşluk karakteri ve “z” harfi arasındaki karakterler) kodlu karakterler). Bu karakterler dışındaki karakterler “%” işaretinin arkasına ilgili karakterin onaltılık düzende (hexadecimal) kodunun eklenmesiyle ifade edilmelidir. Ayrıca bu aralıkta yer almasına rağmen URL içinde özel anlamları olan karakterlerin de kodlanması gerekir. Sıklıkla karşılaşılan ve URL kodlanması gereken karakterlerden bazıları aşağıdaki gibidir:
- %3d =
- %25 %
- %20 boşluk karakteri
- %0a yeni satır
- null byte
Boşluk karakteri özel olarak yukarıdaki kodlamasının (%20) yanı sıra “+” karakteri şeklinde de kodlanabilir.
Eğer yukarıdaki karakterlerin denetiminiz sırasında asıl anlamlarıyla URL içindeki veride yer almasını istiyorsanız URL kodlamayı unutmamalısınız.
- Unicode Encoding: Unicode dünyadaki tüm alfabe ve karakterleri desteklemek üzere oluşturulmuş yeni bir karakter tablosudur ve 16 bit’lik bir kodlamayla ifade edilir. Unicode kodlama URL kodlamaya benzer biçimde kodun başına “%u” karakterleri yerleştirildikten sonra Unicode karakterin birinci ve ikinci byte’larının onaltılık düzende (hexadecimal) kodlarının yazılmasıyla oluşturulur.
Örneğin:
%u2215 /
%u00e9 é
Unicode kodlama özellikle girdi kontrolleri açısından önem arzetmektedir. Örneğin girdi kontrol prosedürü belli tehlikeli blok veya karakterleri ararken Unicode ile kodlanmış bir girdi bu kontrolden geçtikten sonra Unicode kodlamayı decode edebilen bir prosedür tarafından işlenebilir ve zarar verebilir.
- HTML Encoding: HTML encoding Unicode encoding gibi İngilizce karakter setinde olmayan karakterleri ve diğer özel karakterleri kodlamak için kullanıldığı gibi HTML dili için özel anlamı olan karakterleri de oldukları gibi görüntülenebilmeleri ve yorumlanmamaları için kullanılmaktadır. Bu konu özellikle XSS ile yakından ilgilidir, çünkü kullanıcının girdiği veriler kendisine veya başka bir kullanıcıya görüntülenirken kodlanmazsa kullanıcının tarayıcısı tarafından yorumlanarak XSS saldırıları mümkün hale gelmektedir.
Bu anlamda önemli olan karakterlerden bazılarının HTML kodları aşağıdaki gibidir. Genel HTML encoding standardı “&ad;” formatındadır (ad yerine karakterin adı ya da kısaltması küçük harflerle yazılır):
" “
' ‘
& &
< <
> >
HTML encoding sadece yukarıdaki formatta yapılmaz, ilgili karakterin ASCII kodu ondalık veya onaltılık düzende aşağıdaki gibi ifade edilerek de yapılabilir:
Karakter Ondalık Düzende Onaltılık Düzende
“ " "
‘ ' '
- Base64 Encoding: Base64 kodlama herhangi bir ikilik (binary) verinin yazılabilir ASCII karakterlerle (daha doğrusu şu 64 karakterlik set ile: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/) ifade edilmesini sağlar. Bu şekilde ikilik verinin metin tabanlı protokoller içinde iletilmesi mümkün olur.
Örneğin SMTP üzerinden e-posta iletiminde e-posta ekleri Base64 ile kodlanır. HTML’de Base64 basic authentication için kullanıcı credential’larının kodlanmasında kullanılır. Ancak uygulama geliştiricilerin bazı bilgilerin bariz biçimde gönderilmelerini engellemek için Base64 kodlu gönderdiğini görebilirsiniz.
Base64 kodlama ikilik veriyi 3’er byte şeklinde alıp (toplam 24 bit) 4’e böler (her biri 6 bit). 6 bitlik bir alanda 64 değer ifade edilebilir, Base64’ün adı da buradan gelmektedir. Kodlama yukarıda belirtilen karakter seti için her bir karakterin indisine göre yapılır (yani 0-A, 1-B şeklinde). Son 3’e kalan byte’ların sayısı yeterli değilse 3 byte’lık alan “0” bit’i ile tamamlanır. Yani son kalan grupta 1 byte’lık bilgi varsa 2 byte’lık “0”, 2 byte varsa 1 byte’lık “0” eklenir. Eğer son 3’e kalan byte’lardan 1’i eksikse çıktının sonuna “=”, 2’si eksikse “==” eklenir. Örneğin 10101011 son byte ise son 2 byte “0” olduğunda ve ortaya çıkan değer 4’e bölünürse şu 4 6 bit’lik değer ortaya çıkar: 101010 110000 000000 000000. En sona kalan 2 değer için 2 “=” karakteri çıktıya eklenir. Bu sayede decoder’ın hem kaç byte 0 eklendiğini anlaması hem de çıktıda bulunan karakter sayısının 4’ün katları olması sağlanmış olur.
Base64 encoded bir bilgiyi “=” işaretleri ve tipik karakter setiyle anlamak çok kolaydır. Web uygulaması denetiminde bu bilgilerle karşılaşıldığında içeriğine bakmak ve eğer saldırı amacıyla kullanılabilecek parametreler içeriyorsa değiştireceğimiz değerleri Base64 kodlamamız önemlidir.
- Hex Encoding: İkilik veriyi yazılabilir karakterlerle göndermenin yollarından biri de onaltılık düzende göndermektir. Örneğin: “daf” kelimesinin bir cookie içinde onaltılık düzende ifadesi 646166’dır.
Base64’te olduğu gibi Hex kodlamada da tipik karakter setinden dolayı Hex kodlanmış veriyi gözle tanımak kolaydır.