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.

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

SQL Injection
Hata dönderdiği 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.

SQL Injection

mysql 5 versionu için ;

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

User ve database isimlerini alabiliriz.

SQL Injection

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;

SQL Injection

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

SQL Injection

SQL Injection

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 ;

SQL Injection

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

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.

SQL Injection Blind

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

SQL Injection Blind

User tablosuna ait kolonları

SQL Injection Blind

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

SQL Injection Blind

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

SQL Injection Blind

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.

SQL Injection Blind

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

SQL Injection Blind

SQL Injection Blind

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.

SQL Injection Blind

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 Injection Blind

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

SQL Injection Others

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

SQL Injection Others

Sonucunu kontrol edersek;

SQL Injection Others

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:

SQLMAP Aracı Kullanarak Injection

SQLMAP Aracı Kullanarak Injection

Tablolar:

SQLMAP Aracı Kullanarak Injection

SQLMAP Aracı Kullanarak Injection

user tablosunun kolonlarını çekelim:

SQLMAP Aracı Kullanarak Injection

SQLMAP Aracı Kullanarak Injection

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

SQLMAP Aracı Kullanarak Injection

SQLMAP Aracı Kullanarak Injection

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.

SQLMAP Aracı Kullanarak Injection

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.

XSS Reflected

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.

XSS Reflected

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