02 Kasım 2015

DVWA Security Lab ile Web Uygulama Güvenlik Testleri -2

DVWA Lab içerisinde çeşitli açıklıklar barındıran bir web uygulamasıdır. Owasp kuruluşu tarafından Php dilinde geliştirilen DVWA web uygulamalarındaki açıklıkların tespit edilmesinde eğitici nitelikte olmakla birlikte , yazılım geliştiriciler içinde güvenlik kod yazma alışkanlıkları kazandıracaktır. 

İlk bölümde  Brute Force, Command Execution, CSRF, File inclusion , File upload açıklıklarının tespiti ve zafiyetten faydalanma anlatılmıştı.
Makalemizin ikinci bölümünde ise SQL Injection, Blind SQL Injection, LOAD_FILE, INTO OUTFILE, SQLMap aracının kullanımı, Reflected XSS, Stored XSS açıklıklarının tespiti ve bu açıklıklardan faydalanma konuları ele alınacaktır.

SQL Injection              

SQL injection veritabanı ile veri alışverişinde bulunulan yerlerin kullanıcının kötü amaçlı kullanımından korunmaması nedeniyle ortaya çıkar. Low level incelendiğinde hiçbir kontrol uygulanmadığı görülür.


ID değerini tırnak koyarak gönderdiğimizde:

Hata döndürdüğü görülür. Kolon sayısının bulunması için;
id=1’+order+by+1--+
id=1’+order+by+2--+
id=1’+order+by+3--+

şeklinde kolon sayısı artırılarak gidilir. 3 yazdığımızda hata vermektedir, dolayısıyla 2 kolon bulunur.

id=1’+union+select+1,version()--+  yazarak version bilgisi alırız.


mysql 5 versionu için ;

id=1’+union+select+1,user()--+
id=1’+union+select+1,database()--+

User ve database isimlerini alabiliriz.


Kullanımda olan veri tabanının tablolarını döndürdük.
Bu tablolardan users tablosunun kolonlarını inceleyelim;
id=1’+union+select+1,column_name+from+information_schema.columns+where+table_schema=database()--+   komutu ile kolon isimlerini dönderelim;


User ve password kolonları işimize yarayacak bilgiler içerebilir. users tablosundan user ve password isimli kolonları döndürelim;



Medium Level için ;
mysql_real_escape_string() fonksiyonu kullanılmış ve özel karakterler (tırnak)silinmek istenmiştir.
Ancak 1 or 1=1 ve 1 or 1=0 inputlarını denediğimizde sayfalar arasında fark oluşmaktadır.
Bu kez ise tırknak(‘) atmadan sql sorgusu oluşturmak istersek ;


Yine versiyon bilgisi çekebilmekteyiz. İlk levelda yaptığımız aynı işlemleri tırnak atmadan işletirsek yine aynı şekilde kullanıcı adları ve şifrelere ulaşabiliriz.

High Level için ID’ nin sayı olması gerekliliği ile birlikte stripslashes() fonksiyonu kullanılmıştır.ID parametresi sadece sayı olabileceği için SQL komutları çalışmayacaktır.


SQL Injection Blind        

Blind Sql için id=1’ or 1=1--+  veya id=1’ or 1=0--+  kullanmamız faydalı olacaktır.Ekrana verilerin basıldığı görüldüğünde version bilgisi çekebiliriz.


Bu şekilde version bilgisi çekebildikten sonra manuel olarak tabloları sonrasında kolonları ve istenilen önemli bilgileri çekebiliriz.


User tablosuna ait kolonları


Bu kolonların içeriğini ekrana yazdıralım


Medium Level
Blind Sql injectionda tırnak atıldığı zaman hata alınmamaktadır. Girdiğimiz sql sorgularının karşılığını göremediğimiz için sayfanın sql injection korumalı olduğunu düşünebiliriz


sleep(10) , or 1=1 veya  or 1=0 gibi komutlarının sayfaya etkisi ve sayfadaki değişimler gözlenerek sayfada halen sql komutlarını test edebiliriz.

Bu komutlar sayfaya etki ediyorsa sql injection uygulanabilir demektir.
Birkaç deneme sonrasında sleep(10) komutunun işe yaradığını ve sayfanın 10 saniye beklemeli açıldığını görebiliriz.


Ayrıca or 1=1 ve or 1=0 durumları için sayfanın yapısı değişmektedir.



Bu durum sayfada Blind SQL Inj. Açığı olduğunun açıkça göstergesidir.
İlerletebilmek için syntax’ına gore değişiklikler yaparak ekrana basılan veriler görmemiz gerekir.


Bu şekilde version bilgisi çekebildikten sonra 2 numaralı kolondan tablolar ve içerikleri aynen önceki yöntemdeki gibi çekilebilir.

High level için stripslashes , mysql_real_escape_string fonksiyonları kullanılmış ve ayrıca gelen id değerinin sayı olması zorunluluğu getirilmiştir.


SQL Inj. Others           

Sql injectionda tek yapabileceğimiz şey tablo içeriklerini çekebilmek değildir.Bazı durumlarda very tabanında işimize yarayacak hassas bilgiler bulunmayabilir.Bu durumda dosya okuma dosya yazma ve işletim sisteminde komut çalıştırma seçeneklerini deneyebiliriz.

LOAD_FILE : Gerekli izinlere sahip olduğumuz dosyaları okuyabilmemizi sağlar


INTO OUTFILE : Gerekli izinlere sahip olduğumuz yerlerde dosya oluşturup yazmamızı sağlar.


Sonucunu kontrol edersek;


Dosya yazma işlemi doğru bir şekilde gerçekleşmiş demektir.

SQLMAP Aracı Kullanarak Injection

Sqlmap aracı python dili ile geliştirilmiş sql injection atağını otomatize etmeyi amaçlayan faydalı bir terminal aracıdır.Kali Linux dağıtımında default olarak yükle gelmektedir.Kullanımı :
-u : URL
-h : help
-p : test edilecek parametre
-D  : kullanılacak olan database
-T : tablo seçimi
--dump : kolon içinden seçilen verilerin ekrana yazılasını sağlar.
--tables : seçilen database’den tabloları dönderir.
--cookie : giriş yaptıktan sonra yaptığımız testlerde cooki bilgisini programada vermemiz gerekir.
--columns : seçilen tablodan kolonları dönderir.
--current-db : güncel database’in adını dönderir.

Kullanımda olan veritabanını çekelim:



Tablolar:



user tablosunun kolonlarını çekelim:



user ve password kolonlarının içeriğini ekrana bastıralım. (dump)



XSS Reflected                  

Cross site scripting açığı kullanıcıdan alınan verilerin kontrol edilmeden html yada javascript bloklarına dahil edilmesi sebebiyle oluşur.Low levelde kaynak kodu incelenirse:
echo ‘Hello ’ . $_GET[‘name’]  // gelen parametre incelenmeden koda dahil edilmiştir.
<script>alert(document.cookie)</script> komutu ile javascript kodu çalıştırarak cookie bilgilerini ekrana yansıtabiliriz.


Security level ‘i medium yaptığımızda aynı işlemi gerçekleştiremeyiz. Bazı testler yaparak filtreleme olup olmadığını inceleyebiliriz. Örneğin “script” , “alert” , “document” , “cookie” , “ <b>test</b>” gibi metinleri denediğimizde “script” haricindeki diğer metinlerin işlediğini görürüz . Buradan “script” kelimesinin filtrelendiği sonucuna varırız. Bu tarz filtrelemeler yeterli değildir ve aşılması mümkündür.
Bu örnek için script kullanmadan örneğin <script> tag’ini iç içe yazarak tek bir defa kontol ediliyorsa aşabiliriz.


Ancak filtreleme işleminin recursive(tekrar eden) şekilde yapıldığını görmekteyiz.Bir diğer seçenek olarak ise script kelimesi kullanmadan yapmayı denemektir.


Body onload seçeneği ile bu filtreleme aşılabilir.

High Level için inceleme yapılırsa “htmlspecialchars()” fonksiyonu ile tüm html karakterlerinin temizlendiğini ve yeterli güvenliğin sağlandığı görülür.

XSS Stored        

Stored cross site scripting kullanıcı tarafından gönderilen verilerin kontrolden geçirilmeden sayfa içerisine gömülmesi üzerine ortaya çıkar.Uygulamamızda bir ziyaretçi defter örneği verilmiştir.
Low level için “<script>alert(document.cookie)</script>” yazarak yine açığı tespit etmemiz mümkün.

Bu makale 2015 yılı stajyerlerimizden İstanbul Teknik Üniversitesi öğrencisi Cemal Türkoğlu tarafından yazılmıştır.

<<Önceki Bölüm