lostyazilim
tr.link

Phpde Temel Güvenlik // Tunahan Şenel

12 Mesajlar 2.498 Okunma
acebozum
tr.link

Tunahansenel Tunahansenel Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 28.10.2013
  • Yaş/Cinsiyet 26 / E
  • Meslek Öğrenci
  • Konum İstanbul Avrupa
  • Ad Soyad T** Ş**
  • Mesajlar 128
  • Beğeniler 7 / 26
  • Ticaret 0, (%0)
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.
brk soulmy schizoid

kişi bu mesajı beğendi.

elektronikssl
webimgo

w3place w3place WM Aracı Kullanıcı
  • Üyelik 16.01.2014
  • Yaş/Cinsiyet 35 / E
  • Meslek Yazılım
  • Konum İstanbul Avrupa
  • Ad Soyad U** K**
  • Mesajlar 57
  • Beğeniler 17 / 8
  • Ticaret 0, (%0)
direk pdo ve prepare kullanırsanız bu kadar çabalamıza gerek kalmaz, paylaşımınız için teşekkürler yine de incelemenizi tavsiye ederim pdo'yu
smhayhan

kişi bu mesajı beğendi.

w3place

Vixo Vixo vpnscript.net Kullanıcı
  • Üyelik 09.02.2014
  • Yaş/Cinsiyet 29 / E
  • Meslek Web Yazılım
  • Konum Düzce
  • Ad Soyad M** K**
  • Mesajlar 237
  • Beğeniler 29 / 57
  • Ticaret 1, (%100)
Bende pdo kullanıyorum fakat konu çok açıklayıcı ve güzel yazılmış, bir bir okudum :) Teşekkürler.
 

 

smhayhan smhayhan WM Aracı Kullanıcı
  • Üyelik 25.12.2011
  • Yaş/Cinsiyet 30 / E
  • Meslek Front/Back-end Developer
  • Konum Ankara
  • Ad Soyad ** **
  • Mesajlar 96
  • Beğeniler 21 / 35
  • Ticaret 0, (%0)
mysql fonkisyonları php tarafından bile önerilmezken, onun açıklarını kapatmaya çalışmak artık amelelelik oluyor. pdo veya mysql kullanmak çok daha mantıklı.
 

 

wmaraci
wmaraci

soulmy soulmy WM Aracı Kullanıcı
  • Üyelik 12.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Öğretmen
  • Konum Samsun
  • Ad Soyad O** Y**
  • Mesajlar 1722
  • Beğeniler 398 / 400
  • Ticaret 20, (%100)
PDO konusunda ben de aynı fikirdeyim. Fakat sql injection açığının nasıl oluştuğunun mantığını anlatan yazılar pek nadir yazılıyor. Bu yüzden beğendim yazınızı. Elinize kolunuza sağlık :)
Tunahansenel

kişi bu mesajı beğendi.

.

Onur89TR Onur89TR Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 04.12.2011
  • Yaş/Cinsiyet 35 / E
  • Meslek .
  • Konum İzmir
  • Ad Soyad ** **
  • Mesajlar 2376
  • Beğeniler 704 / 791
  • Ticaret 1, (%100)
Ben başka bir konuya değineceğim. Kaç yaşındasın bilmiyorum ama, nickinin altına yazdığın "I am king" kralım, şöyleyim, böyleyim tarzı yazılar, bu foruma yakışmıyor. Alçakgönüllülük her zaman kazandırır. Bunun altını çizmek istedim.
 

 

Gandak Gandak Web Master & Yazar Kullanıcı
  • Üyelik 25.08.2013
  • Yaş/Cinsiyet 33 / E
  • Meslek Web Master & Yazar
  • Konum Balıkesir
  • Ad Soyad M** K**
  • Mesajlar 230
  • Beğeniler 36 / 49
  • Ticaret 25, (%100)

Onur89TR adlı üyeden alıntı

Ben başka bir konuya değineceğim. Kaç yaşındasın bilmiyorum ama, nickinin altına yazdığın "I am king" kralım, şöyleyim, böyleyim tarzı yazılar, bu foruma yakışmıyor. Alçakgönüllülük her zaman kazandırır. Bunun altını çizmek istedim.


Kıskançlık sezdim gibi eğer değilse saçmalık sezdim o da değilse eğer arkadaşa gerçekten uyarmak istersen herkesin arasında uyarmak yerine, özel mesaj ile uyarırsın.
 

 

Onur89TR Onur89TR Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 04.12.2011
  • Yaş/Cinsiyet 35 / E
  • Meslek .
  • Konum İzmir
  • Ad Soyad ** **
  • Mesajlar 2376
  • Beğeniler 704 / 791
  • Ticaret 1, (%100)

Gandak adlı üyeden alıntı

Kıskançlık sezdim gibi eğer değilse saçmalık sezdim o da değilse eğer arkadaşa gerçekten uyarmak istersen herkesin arasında uyarmak yerine, özel mesaj ile uyarırsın.

Sezgilerin pek güvenilir değilmiş. :o
 

 

Tunahansenel Tunahansenel Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 28.10.2013
  • Yaş/Cinsiyet 26 / E
  • Meslek Öğrenci
  • Konum İstanbul Avrupa
  • Ad Soyad T** Ş**
  • Mesajlar 128
  • Beğeniler 7 / 26
  • Ticaret 0, (%0)

Onur89TR adlı üyeden alıntı

Sezgilerin pek güvenilir değilmiş. :o


Vallaha daha konu açmayacağım ya "biri şu de biri bu der" bıktım illallah.
 

 

Onur89TR Onur89TR Üyeliği Durdurulmuş Banlı Kullanıcı
  • Üyelik 04.12.2011
  • Yaş/Cinsiyet 35 / E
  • Meslek .
  • Konum İzmir
  • Ad Soyad ** **
  • Mesajlar 2376
  • Beğeniler 704 / 791
  • Ticaret 1, (%100)

Tunahan Şenel adlı üyeden alıntı

Vallaha daha konu açmayacağım ya "biri şu de biri bu der" bıktım illallah.

Eleştirilere kapalı olup, kendini kusursuz bir şey gibi görüyorsan zaten konu açma dostum. Burada herkes birbirinin bilgisini ölçme, tartma, gördüğü eksiklikleri söyleme hakkına sahip.
 

 

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al