Web Uygulama Güvenliği Web Application Security Ömer Çıtak1 Bilgisayar ve Öğretim Teknolojileri Eğitimi, Balıkesir Üniversitesi mail@omercitak.com ÖZETÇE Bu bildiri kapsamında web uygulamalarında sürekli karşılaşılan SQL Injection, Cross-site Scripting, Upload Authentication, Memcache Injection gibi güvenlik zafiyetlerinin nasıl ortaya çıktığı, saldırgan tarafından nasıl kullanıldığı ve güvenlik uzmanın bu zafiyeti nasıl gidereceği anlatılmıştır. 1. GİRİŞ Uzun yıllardır hem yazılımcı hem de güvenlik sorumlusu olarak görev yaptığımdan yazılımcıların işin güvenlik kısmında eksik kaldığı sonucuna ulaştım. Bir web geliştiricisinin kullandığı teknolojiler barındıran bir laboratuvar kurup sistemler üzerinde zafiyet testleri gerçekleştirdim. 2. Cross Site Scripting XSS yani Cross-site Scripting, kurbanın web tarayıcısında zararlı javascript kodu çalıştırmaya olanak sağlayan güvenlik zafiyetidir. Genelde Dom-Based, Reflected ve Stored olmak üzere 3 başlık altında incelenir. 2.3 Stored XSS Stored XSS, XSS türleri arasında en tehlike olanıdır. Çünkü kurban, zararlı kodu kurbanına çalıştırtmak için herhangi bir sosyal mühendislik sergilemesine gerek yoktur. Kurban tarafından çalıştırılması istenen zararlı kod, kurban ve sistemden etkilenecek tüm kullanıcıların görebildiği ortak bir sayfaya kaydediliyor. Genelde bu kaydedilme işlemi, veri tabanı üzerinden gerçekleşiyor. Kurban ve sistemdeki diğer kullanıcılar, farkında olmadan saldırgan tarafından yerleştirilmiş zararlı kodu çalıştırabiliyor. 3. SQL Injection SQL Injection, SQL dilini kullanan veri tabanı sistemlerinde, kullanıcıdan alınan verinin herhangi bir filtreleme işlemine sokulmadan doğrudan SQL sorgusuna dahil edildiği durumlarda ortaya çıkmaktadır. Genelde Union Based, Blind ve Time Based olmak üzere 3 başlık altında incelenir. 2.1. Dom-Based XSS 3.1. Union Based SQL Injection Dom Based XSS, kabaca sayfa içerisinde anchor yani çapalama kullanılan durumlarda ortaya çıkmaktadır. Bir web sayfasında çapaya tıklandığında sayfanın gidilen bölümü, yani gidilen çapanın div nesnesinin id atribütü herhangi bir şekilde javascript içerinden işleniyor ise, saldırgan çapanın id atribütünü değiştirerek kurbanın web tarayıcısına istediği zararlı kodu çalıştırtabilir. Union, SQL dilinde sorgu birleştirme görevini yapan komuttur. Genelde veri tabanından veri çekilen (SELECT * FROM gibi) gibi sorgulara, kullanıcıdan alınan veriler koşul olarak eklenir. Saldırgan, sorguya koşul olarak eklenecek veriyi UNION ile başlatırsa devamında kendi istediği sorguyu yazıp, sistem üzerinde istediği sorguyu çalıştırabilir. 3.2. Blind SQL Injection 2.2 Reflected XSS Reflected XSS, herhangi bir inputtan alınan verinin herhangi bir filtreden geçirilmeden doğrudan ekrana çıktı olarak yansıtılmasından kaynaklanan bir zafiyettir. Genelde GET metodu kullanılan, arama gibi sayfalarda karşımıza çıkar. GET metodu ile gönderilen veri doğrudan adres çubuğunda yer almaktadır. Arama sayfasından örnek verecek olursak; saldırgan gerçekten bir arama yapmak yerine aranacak kelimeyi kurbana zarar verecek tarzda bir javascript kodu ile değiştirir ise kurban farkında olmadan bu saldırıdan etkilenecektir. Blind SQL Injection ise Union Based ile aynı altyapıda çalışır. Tek farkı çıktı olarak verilen sistem hata mesajlarının gizlenmiş olmasıdır. Union Based’da sorgu bozulduğunda sistemin verdiği hatalardan yola çıkarak veri tabanı ismi, veri tabanındaki tablo isimleri, kolon isimleri gibi verilere ulaşılabiliyordu. Blind’de hata mesajları gizli olduğundan bu bilgilere doğrudan hata mesajı üzerinden ulaşılamıyor. Sorgunun sonuna ufak koşul sorguları yazarak istenilen verinin doğruluğu kontrol edile edile istenilen tüm bilgilere ulaşılabiliyor. 3.3. Time Based Time Based, veri tabanından veri çeken sorgularda değil, ekleme, silme, güncelleme gibi işlemlerde ortaya çıkan bir zafiyettir. Veri tabanından veri çekme işlemi olmadığından saldırgan istediği verilere doğrudan ulaşamıyor. O yüzden ekleme, silme, güncelleme gibi sorguların sonuna DELAY yani zaman aşımı koyuyor ve bu zaman aşımını bir kontrolcü olarak kullanarak sistem üzerindeki istediği veriye ulaşabiliyor. 4. Memcached Injection Memcached, sunucu tarafından kullanıcı tarafına verilerin daha hızlı iletilmesi için geliştirilmiş bir önbellekleme yazılımıdır. Veri tabanında sık sık güncellenmeyecek veriler Memcache üzerine kaydedilir. Kullanıcı sisteme girip, verita tabanından bir veri okumak istediği zaman eğer veri memcache’de var ise sistemin RAM’i üzerinden kullanıcıya çok hızlı bir şekilde verilir. Bu şekilde veri hem kullanıcıya hızlı bir şekilde ulaşmış olacak aynı zamanda veri tabanı bu tarz sorgular ile yorulmayacak. Ancak saldırgan, veri tabanından çekilip memcache’e kaydedilmesi gereken verilere Injection saldırısı ile kendi zararlı payload’ını yerleştirir ise, kullanıcı sisteme girdiğinde veri yerine saldırganın yerleştirmiş olduğu zararlı payload’ı görebilir. 5. Upload Authentication Bazı sistemler işleyiş gereği kullanıcıdan dosya almak zorunda olabilir. Örneğin bir fotoğraf barındırma servisi sunan web uygulaması, kullanıcının kendi bilgisayarından seçmiş olduğu resmi kendi sunucuna taşıyıp herkese servis ediyor. Bu tarz uygulamalarda saldırgan, kendi bilgisayarından gerçekten bir resim yerine sunucu ile SSH bağlantısı yapabileceği veya sunucuyu uzaktan yönetebileceği zararlı “web shell” yükleyebilir. Bu tarz saldırıların engellenmesi için dosya içeriği kontrolü, php veya kullanılan yazılım dilinin kendi resim işleme kütüphaneleri kullanılabilir.