Merhaba arkadaşlar bir süredir yoğundum biraz fırsat buldum bu fırsatta makale yazmaya karar verdim.Bir zamandır php’de güvenlik üzerine makaleler yazmayı planlıyordum.Bugün yazmaya başladım ilk makalem phpde sql injection saldırıları
Kullanıcının olduğu her websayfasında veritabanı vardır.Çeşitli bilgiler bu veri tabanlarında tutulur.Yetkisiz girişleri engellemek amacıyla giriş işlemlerinde veritabanlarına bağlantı kurulur girilen verilerin kontrolü yapılır.Bu tür yerlerde veritabanı bağlantıları mevcuttur.Hatalı bir kodlama olan yerde veri tabanına yetkisiz erişim sağlanıp açık suistimal edilebilir.
Giriş yapacağımız 1 adet form oluşturuyoruz.
Daha sonra formda girilen verilerin kontrol edileceği giriskontrol.php dosyamızı aşagıdaki şekilde oluşturuyoruz.
Bilgilerin kontrol edileceği veritabanı aşağıdaki resimdeki gibidir.
Kullanıcı Adı ve şifremize admin yazıyoruz giriş yapıyoruz.
Girilen veriler veritabanı ile eşleştiği için giriş yaptık.Yukarda basit bir veritabanı bağlantı uygulaması mevcuttur.İşimizi biraz daha ilerletelim ne gibi açıklarla karşı karşıyayız bunları inceleyelim.
Şimdide kullanıcı adı kısmına ‘(tırnak işareti) girelim ve giriş yap’a basalım
Aşağıdaki gibi bir hata çıktısı ekranda yer alacaktır.Burada sql injection açığı mevcuttur.Peki bu açığı nasıl suistimal edebiliriz onu inceleyelim
Kullanıcı adı ve şifre kısmına ' OR ''=' ifadesini yazalım.(OR'dan sonra üst üste 2 tane tek tırnak var)
Artık sql sorgumuz şu hale döndü;
Giriş yap butonuna basıyoruz.
Ekranda görüldüğü üzere başarılı bir şekilde giriş yapıldı peki nasıl doğru kullanıcı adı ve şifre girmeden login panelini bypass ettik?
SQL Sorgumızda görüldüğü üzere” kullanıcı adı veya şifresi boş olanları al veya boşluk eşittir boşluk” şeklini aldı boşluk boşluğa eşit olduğunu göre sorgudan doğru değer döndü ve giriş yapıldı.
Veriler Aşağıda görüldüğü gibi filtreden geçirilmeden alınıyor.
Daha sonra direk veritabanı işlemini giriyor.Açık tamda burada meydana geliyor.Eğer biz verileri filtreleseydik açık meydana gelmiyecekti.
Gelen verileri aşağıda görüldüğü gibi mysql_real_escape_string fonksiyonu ile filtreden geçiyoruz böylece açık kalmamış oluyor.
Yukarıda görüldüğü gibi tekrar denendiğinde açık ortadan kalkıyor bu gibi basit açıklara sebebiyet vermemek için kod yazarken dikkatli olmalısınız.Gelen her verinin tehlikeli olabileceğini hesaba katmalısınız.
Merhaba arkadaşlar bugün php’de meydana gelen xss açıklarından bahsediceğim.Öncelikle XSS açığı nedir ona deyineyim.Xss açığı script kodlamalarında kullanıcıdan gelen verilerin filtresiz bir şekilde işleme sokulması sonucunda meydana gelen açıklardır.Post veya get ile aldığımız verileri filtreden geçirmezsek kullanıcı buralara javascript,html kodları girebilir bu kodlar üzerinden cookielerimizi çalabilir yönlendirme gibi şeyler yapabilir.Sniffer kurarak admin şifresini ele geçirebilir.
Xss Açık Türleri
StoredXSS:Bu açık daha çok ziyaretçi defterlerinde veya yorum kutularında bulunur.Ziyaretçi defterlerinde yazı yazılan yere javascript kodu enjekte edildiğinde bu kod veritabanındasaklanır.Sayfa her yenilendiğinde kod tekrardan çalışır.
Reflected XSS:Sadece kodu enjekte eden kişi etkilenir.Url alanlarında bulunur.
DOM XSS:En tehlikeli xssaçığıdır.Trojanvs enjekte edilebilir,indexdeğiştirilebilir.Javascript kodlarının suistimal edilmesine dayanır.
Ben Örnek olarak stored xss açığını seçtim.1 Adet ziyaretçi defteri üzerinde bu açığı inceleyeceğiz.
Yorumumuzu göndereceğimiz yukardaki şekilde bir giriş sayfası kodluyoruz.
Veritabanı bağlantımızı daha kolay idare edebilmek için 1 adet yukardaki gibi veritabanı bağlantı sayfamızı kodluyoruz.
Veritabanı bağlantı dosyamızı include ederek bağlantıyı sağlıyoruz.Daha sonra yorumgonder.php’den post ile gelen verilerimizi alıyoruz.Veritabanımıza kayıt ediyoruz.
Yaz.php adresinde veritabanına kayıt olan yorum ve yazıları listeliyoruz.Kodlamaları yaptık şimdi uygulamasını yapalım
Yorumgonder.php adresine yukardaki gibi yazılarımızı yazıyoruz.Gönder’e basıyoruz.
Gördüğünüz gibi yorumumuz veritabanına kayıt oldu ve yaz.php sayfasında bize listelendi.
Şimdi nerede hatalı kodlama var ve nasıl bir tehlike ile karşı karşıyayız bunu inceleyelim.
Yorumgonder.php adresini herhangi bir kullanıcının yukardaki gibi doldurduğunu düşünün daha sonra göndere bastığında aşağıdaki gibi javascript kodları çalışacaktır.
Gördüğünüz gibi ekrana yazdığımız yazı yansıdı bu bize yazdığımız kodlarda xss açığı olduğunu gösteriyor. Şimdi kodlarımıza tekrar dönelim.
Yukarda gördüğünüz gibi kullanıcının girdiği verileri hiçbir filtrelemeden geçirmeden direk veritabanında işleme soktuk.Bunun sonucu kullanıcı javascript kodunu enjekte etti.Bu kod veritabanına kayıt oldu sayfa her açıldığında aynı kod çalışcak.Şimdi sayfayı yenileyelim
Yukardaki görüldüğü gibi sayfa her yenilendiğinde bu alert ile karşılaşacağız.Burda basit bir stored xss saldırısı var.Sebebide yukardaki görüldüğü gibi verileri filtrelemeden işleme almamız.Daha farklı zararlı kodlar enjekte edilerek yönlendirme,cookie çalma gibi işlemler yapılabilirdi.
Veritabanımızadönelim.Veritabanımızı temizleyelim
mesaj_kaydet.php dosyasını yukardaki gibi düzenlediğimiz takdirde açık ortadan kalkacaktır.Gelen verileri değişkene atadık.Daha sonra htmlspecialchars ile verileri filtreledik.Daha sonra veritabanı işlemlerimiz için mysql_real_escape_string fonksiyonunu kullanarak bir daha filtreledik.Böylece açık ortadan kalkmış oldu.Siz daha farklı filtreleme metodları kullanabilirsiniz(script_tags,addslashesvs) yada kendiniz bir fonksiyon yazabilirsiniz.
Şimdi tekrardan ziyaretçi defterimize dönelim
Yukarda görüldüğü gibi kodlarımızı tekrar enjekte edelim ve gönder’e basalım.
Bu sefer yukarda görüldüğü gibi javascript kodlarının çalışmadığını görebilirsiniz.Bu tür hatalara sebebiyet vermemek için gelen her verinin zararlı olabileceğini unutmamanız gerekmektedir.
Merhaba arkadaşlar bugün post ile get verilerinin bir farkından bahsedeceğim.Post ile get kullanıcıdan veri alırken kullandığımız metodlardır.Örnek bir uygulamayla görelim.
Get metodunu kullanarak yukardaki şekilde veri gönderebiliriz.Bu veriyi başka bir sayfadan alalım.
Aldığımız sayfada alınan veriye göre ekrana Hoşgeldiniz yazdıralım.
Get ile veri girişi yapacağımız sayfaya yukardaki gibi verimizi girelim.Butona bastığımızda aşağıdaki gibi veri ekrana yansıcaktır.Ancak burda dikkat edilmesi gereken nokta get ile aldığımız verinin Url adresinde gözükmesi dolayısıyla ordan açık olarak erişilmesidir.
Yukardaki gibi urlyi değiştirdiğimizde bu sefer ekrana yansıma aşağıdaki gibi olcaktır.
Post metoduyla alınan veriler ise gizli bir şekilde aktarılır url’de gözükmez.
Metodumuzu yukardaki gibi post olarak değiştirelim
Aşagıdaki gibi veri girişimizi yapalım.
Butona basalım.
Bu sefer veri aynı şekilde işlem görcek ancak url’de herhangi bir ize raslanmıcaktır.
Get ile işlem gören veriler url’de belli olduğu için post ile alınan verilerden daha güvensizdir diyebiliriz.Bu yüzden metod olarak daha çok post’u tercih etmeliyiz.
CSRF Açıkları
Yukardaki gibi bir işlemin gerçekleştiğini düşünürsek deneme@deneme.com bilgileri tehlike@tehlike.com’a gönderiliyor.Eğer burda yeterli güvenlik önlemi sağlanmazsa veriler url üzerinden çarpıtılabilir bunun sonucunda deneme@deneme.com’un verileri ele geçirilebilir.Peki burda post kullanmak sorunu tamamen çözüyor mu?Hayır çözmüyor.Bu tür durumların önüne geçmek için sayfalar arasında iletişimi sağlarken özel kriptolar kullanmalıyız.Gelen verileri filtrelerden geçirmeliyiz.Yukardaki sadece basit bir örneğiydi.Daha farklı açıklarda olabilir.
Şimdi sayfalar arası işlemler için basit bir şifreleme yapalım.
Bir güvenlik kodu oluşturup bunu oturum’u başlatarak güvenlik_uygulaması_kodu’na atadık.
Başka bir sayfadan oturumu başlatıp gelen kodun elimizdeki kodla uyuşup uyuşmadığını kontrol ettik.Eğer uyuşursa işlemi yaptık,uyuşmazsa işlemi yapmadık.Yukardaki basit bir örnektir.Siz daha da geliştirip kendinize ait metodlar oluşturabilirsiniz.İyi Kodlamalar.
Makale Tunahan Şenel Tarafından Hazırlanmıştır.İzinsiz alıntı yapılmaması dileğiyle.