Php Sql Injection Engelleme Kesin Çözüm

Php Sql injection engelleme için kesin bir çözüm var. htmlspecialchars, stripslashes, mysql_escape_string, strip_tags sizi her zaman doğru biçimde korumaz. Yaratıcı injection girişimlerine karşı özelleştirilebilir ve aynı zamanda genel-geçer bir güvenlik kalkanı oluşturmalıyız.

Mysql injection ile uğraşmış herkes, bu işlemin temelde get veya post yöntemiyle yapıldığını bilir. Site üzerinde gerçekleştirilecek bu veri giriş çıkışı, adres satırı işlemleriyle tablo yapısı hakkında bilgiye ulaşıldıktan sonra, tabloya ilgili SQL komutları gönderilir. Bunu engellemenin, sitenizi hackerlardan uzak tutmanın (site bazında) tarafımca denenmiş ve başarılı bir yöntemi var. Bu çözümü WordPress dahil tüm Php tabanlı yazılımlarınızda kullanmanızı tavsiye ederim. Böylece Sql saldırılarından kurtulabileceksiniz.

Atmamız gereken ilk adım “guvenlik.php” adlı bir Php dosyası oluşturarak bu dosyayı tüm PHP dosyalarınızın en üst kısmına include etmek.

Bu include içeren kod satırının Php dosyalarınızın en üstünde olması elzemdir. Eğer bu satırdan önce  Mysql bağlantısı gibi bir kod satırı kullanmışsanız güvenlik kodlamamızın yararsız olabileceğini unutmayın. Ayrıca Mysql içeren (bağlantı/sorgu vb.) her Php dosyası için bu satırın en tepede olması gerekiyor. Şimdi guvenlik.php dosyanızı açıp aşağıdaki adımlara geçebilirsiniz.

GET SQL Injection Saldırıları İçin Güvenlik Sağlayalım

Adres satırından yapılan saldırılar en bilindik ve yaygın olanları. Adres satırından hiçbir veri okutmuyorum diye avunmanız doğru değil. Ortalama bir hacker Mysql işlemlerini adres satırından kolayca yapabilir. Üstelik ?id=12, ?ara=beybut şeklinde okutmalar kullanıyorsanız kesinlikle risk altındasınız. Bu hacking girişimlerini engellemek için Get yöntemine özel bir çözüm üretelim.

Burada $yasaklar karşısında, ¿¿ ile ayırarak belirttiğimiz girdilerden biri adres satırında mevcutsa kişiyi bir resme yönlendirdik. $yasaklar bölümünü tablo, kolon adlarınızı da yazarak güçlendirebilirsiniz. Bu yöntemle ?ref türü, adres satırıyla ilişkili tüm saldırılardan kurtulabilirsiniz. Eğer ayracı (¿¿) beğenmediyseniz bunu değiştirmeniz mümkün.

Hacker, sql injection denediğinde karşısına aşağıdaki resim gelecek.

Hacker Bey
Hacker Bey

Aynı yöntemi POST için de uygulayalım.

POST ile SQL Injection Saldırıları İçin Güvenlik Sağlayalım

Post güvenliği için en elzem konu bütün tablolarınızı aşağıdaki biçimde belirtmenizdir. Çünkü post verilerinde <, >, ‘ gibi karakterler sıkça kullanılır. Bunları engellemek doğru bir yöntem değildir. Bunun yerine hackerın ihtiyacı olan veya tahmin edeceği tüm tablo adlarımızı kontrole ekleyeceğiz. Tablo adı girilmemiş bir SQL sorgusunun çalışmayacağını söylemeliyim. Aşağıdaki örnekteki tablo adlarını Mysql yapınıza göre değiştirmelisiniz.

Her şey tamamsa artık GET veya POST Sql injection yöntemiyle hacklenemeyecek, verilerinizin değiştirilemeyeceği, silinemeyeceği bir web sitesine sahip oldunuz demektir.

Önemli noktalar:

  1. guvenlik.php her PHP dosyanızda (Sql içeren), en tepede include edilmeli.
  2. Tablo adlarınız mutlaka ilgili satırlarda bulunmalı.

 

SQL Injection Hack

Sql injection nedir? Sql Injection nasıl yapılır? Sql injection hack saldırılarının tehlike analizi, programlar, örnek hacking saldırısı ve bu saldırıları önleme, SQL injection’dan korunma yolları.

SQL Injection Saldırısı Nedir?

SQL Injection, çoğunluklu dışarıdan (remote) SQL komutları çalıştırılması yoluyla gerçekleştirilen veritabanına yönelik bir saldırı türüdür. Günümüzde, hemen herkesin ulaşabileceği programlarla, eklentilerle veya tarayıcının adres satırından, GET veya POST metodlarıyla SQL injection açıkları taranabilir ve bu açıklar suistimal edilebilir.

SQL Injection Saldırısı Tehlikeli Midir?

  1. Saldırgan, veritabanınızın ismini, SQL içindeki tabloları ve verileri görebilir.
  2. Veritabanınızdaki kullanıcı adları, emailler, şifreler, kart numaraları vb. ele geçirilebilir. Hatırlatma: Şifrelerinizi MD5 veya Sha512 gibi şifreleyicilerle kriptolasanız dahi bunları çözmek birkaç saniye içinde olanaklıdır.
  3. Veritabanınızdaki bilgilerden yola çıkarak yönetici veya kullanıcı panelinize ulaşılabilir.
  4. Dosya yükleme, veritabanından kod işletme olanağı varsa sitenizin bulunduğu tüm sunucu shell adı verilen araçlarla hacklenebilir. Yalnızca kendi sitenizi değil sunucudaki tüm siteleri büyük bir tehlikeyle karşı karşıya bırakabilirsiniz.

“Benim Sitemle Kim Uğraşır?” Yanılgısı

Sitenizle uğraşılması için özel olarak hedef alınmanız gerekmez. Arama motorlarında uygun terimlerle (“Dork” adı veriliyor) yapılacak aramalar sonucunda veya bu amaca yönelik programlar yardımıyla sitenizin içinde bulunduğu bir listeye ulaşılabilir. Eğer “önemsiz”, “küçük” sitenizde SQL Injection açığı varsa birkaç gün içinde size de uğrayacaklarına emin olabilirsiniz. Hergün on binlerce kişi bu tür açıkları harıl harıl tarıyor.

SQL Injection Açığı Olan Siteler Nasıl Bulunur?

Arama motorlarında belirli terimler aratılarak yapılan aramalar yoluyla veya hazır listelerle açık olabilecek sitelere ulaşılır. Örneğin; “inurl:musteriler.php?id=” gibi bir arama sonucunda adresi içerisinde musteriler.php?id= geçen siteler listelenir. Ardından siteye giren saldırgan bu adresin sonuna tek tırnak işareti ekleyerek veya %27 (tek tırnağın url encode biçimi) yazarak sayfada hata mesajı olup olmadığını kontrol eder. Eğer SQL ile ilişkili bir hata mesajıyla karşılaşılıyorsa adres satırından, bir tarayıcı eklentisi ile veya Havij benzeri bir programla veritabanı adı, tablo yapısı ve verilere ulaşmaya çalışır. Bir sonraki başlıkta saldırganların sıkça kullandığı basit eklenti ve programları tanıyabilirsiniz.

SQL Injection Araçları, Programları

Gr3eNoX Exploit Scanner, Google üzerinden belirli terimlerle (dork) sonuçları tarayan, bu sonuçlar içerisinde açık bulunabilecek adresleri listeleyen bir programdır.

gr3enox exploit scanner

Aşağıda bir Firefox eklentisi olan Hackbar‘ı görüyorsunuz. Bu eklenti yardımıyla SQL injection açığı tespit edilen sitelerde SQL komutları kolayca denenebiliyor.

Hackbar Firefox Eklentisi

Komutlarla içli dışlı olmak istemeyen saldırganların gözdesi ise açık tespit edilen siteyi, SQL açıklarından faydalanarak tarayan Havij programıdır. Örnek taramada dünyaca ünlü, on binlerce kullanıcıya sahip bir yazılım sitesinin Havij ile elde edilen verileri görülmektedir.

Havij

Havij ile veritabanı bilgileri, tablo yapısı ve veriler elde edildikten sonra tüm kullanıcıların kullanıcı adlarına, şifrelerine (md5’li), e-mail adreslerine ulaşmak mümkün oluyor. Şifre Md5’li olsa bile büyük çoğunluğu program içinden kolayca kırılabiliyor. Örnekte bir kullanıcının decrypt edilmiş şifresinin “abhilash” olduğu görülüyor. Bu kullanıcı adı ve şifreyle siteye giriş yapılabiliyor.

Havij Md5

 

SQL Injection Saldırılarından Kurtulmak İçin En Etkili Yöntemler

Artık SQL injection açığı kullanan hackerların nasıl çalıştığını bildiğimize göre önlem de alabiliriz. Aşağıdaki sıralayacağım güvenlik önemleri Mysql kullanan tüm PHP yazılımları için (WordPress, Vbulletin, Smf, Xenforo, özel php scripti) geçerlidir.

  1. Mysql bağlantısı yaptığınız dosyaya veya kod satırına (Mysql bağlantılı tüm dosyalara) gelerek, sayfanın en üstüne şunu ekleyin:

    Bu Php kodu, hata raporlarının gösterilmesini engelleyecektir. Böylece hata mesajı tarayarak veritabanı bilgilerine ulaşmak isteyen hacker bunu gerçekleştiremeyecektir.
  2. PHP sayfanız veritabanına GET/POST yöntemiyle bir sorgu gönderiyorsa dışarıdan alınan bu verinin güvenli olup olmadığını kontrol etmeli ve bu veriyi uygunlaştırmalısınız. beybut.com/makale.php?id=5 şeklindeki bir urlnin Php dosyamızca veritabanındaki 5 id numaralı makaleyi çağırdığını düşünelim. Burada SQL query (sorgu) içine direkt olarak id değerini girmeniz bir faciaya neden olabilir. Bu id değerini önce bir değişkene atamalı ardından bu değişkeni ayıklamalısınız.

    Burada url’den aldığımız id’yi sırasıyla şu işlemlerden geçirdik: id’yi url decode işlemiyle okunaklı hale getir (%27 gibi ifadeleri kaldır), özel html karakterlerini kaldır (htmlspecialchars), html etiketlerini kaldır (strip_tags), tırnakları kaldır (str_replace içinde), boşlukları sil (trim), preg_replace ile sayı olmayan tüm değerleri (örn. harf, özel işaretler) sil. En son olarak elde kalan değer bir sayı değilse exit; ile çıkış yap dedik. Artık $makaleid değişkenini Mysql Query içinde rahatlıkla kullanabiliriz. Burada bir noktayı hatırlatmak gerekir ki; Sql içindeki tüm sorgularınızı (örneğin arama için post edilen veri) bu tür bir filtreye tabi tutmalısınız.
  3. Phpmyadmin ve admin panelinizi .htaccess yardımıyla şifreleyin. Bu, aynı zamanda brute force (deneme yanılma) saldırılarının da önüne geçecektir.
  4. http://tr.0day.today/ gibi sitelerde yeni açıkları takip ederek; scriptinizle ilgili bir açık varsa derhal önlem almalısınız. Bu 4 madde Sql Injection saldırılarından korunmak için site bazında alabileceğiniz en temel ve etkili önlemlerdir.
  5. Sunucu temelinde: Eğer kendinize ait bir sunucu kullanıyorsanız; mod_security, CSF (ayarları doğru yapılmak kaydıyla) gibi yazılımsal firewall’ler ve sorguçlar kullanın. Böylece saldırıyı daha sitenize ulaşmadan veya sorgu aşamasında engelleyebilirsiniz. PHP’nin, MYSQL ve web sunucusunun (örn. Apache, Nginx, Litespeed), Kernel’inizin güncel ve stabil olduğundan emin olun. Mysql ayar dosyası olan my.cnf içerisine

    satırlarını ekleyin. Php’nin engelli fonksiyonlarına (php.ini disabled_functions bölümüne) “exec”, “shell_exec”, “cat” gibi tehlikeli olabilecek komutları ekleyin. Sunucunuzda Perl, CGI, C kodlarının derlenip çalıştırılabilmesine yalnızca root’tan izin verin.  Dosya ve klasör izinlerinin (Chmod) doğru ayarlandığına emin olun.
  6. Eğer siteniz veya sunucunuz için güvenlik kaygılarınız varsa bu yazı altına yorum bırakarak Beybut’tan destek isteyebilir; yorum bölümüne ulaşılabilir bir e-mail bırakarak sizinle iletişim kurmamı sağlayabilirsiniz.