SQL Injection Açıklarından Kurtulma Yolları

Bu başlığı yazdığımda, içeriğin tam olarak nasıl oluşacağını düşünmeden önce bir tebessüm ile "Ney? Kurtulma Yolları mı?" diye kendime sordum. Maalesef ki ne yaparsak yapalım sistemi tam olarak koruyamayacağız. Fakat amatör ruhlu, forumda paylaşılan php dosyaları yada kodları ile kendini hacker zanneden ufaklıkları nasıl önleriz bunu anlatmaya çalışacağım. (Bu cümleden sonra hackliyorlarmış bide :/ )

SQL Injection Nedir?

SQL Injection; veri tabanından veri çekme, silme, düzenleme gibi müdahalelerin yapılmasını sağlayan bir açıktır. Bu açığın kullanım alanı $_GET ile yollanan veriler ve link yapıları üzerinden gerçekleştirilen işlemler ile yapılmaktadır. Bu tarz açıkların kullanılmasını sağlayan meta karakterler bulunmaktadır. Bu meta karakterler ile önlemi alınmayan bir SQL sorgusu, rahatlıkla kararsız bir çalışmaya sevk edilip müdahaleyi yapan kişi tarafından kötü amaçlı kullanılmasına neden olabilir.

Zararlı Meta Karakterleri Nelerdir?

SQL için kritik meta karakter (') tek tırnaktır. Çünkü iki tek tırnağın arası string olarak algılanır. Diğer bir önemli meta karakter ise (;) noktalı virgüldür, satırın bittiğini ve yeni satır başladığını bildirir.

Bir Örnekle SQL Injection'ı Daha İyi Tanımlayalım

SQL sorgularına enjekte yapabilmek için sorguya ulaşmamız gerekmektedir. Bundan dolayı $_GET methodu kullanılarak oluşturulmuş bir sorgu oluşturalım. Örneğin; id değerinin 1 olduğu üyeler tablosundan bir üyenin bilgilerini çeken sorgu oluşturup açıktan yararlanmaya çalışalım.

$sorgu  = mysql_query("select * from uyeler where id=".$_GET['id']);

Yukarıdaki kod kullanılarak get verisine gelen değere ait id ile kullanıcının bilgilerine ulaşılacaktır. Şimdi bu sorgunun bir sayfada yer aldığını düşünelim. Veri iletişimini sağlamak için şöyle bir link ifadesi kullanılacaktır; index.php?id=1 gibi.

Şimdi bu link yapısını SQL Injection denilen açık ile nasıl müdahale edildiğini görelim.

Get methodu ile aldığımız ve işlem yaptığımız bu sorguyu link yapısı ile nasıl çalıştığını göstermiştim. Şimdi bu link yapısını aşağıdaki şekilde girelim.

index.php?id=' or '1'='1' 

Yollamış olduğumuz bu get parametresinde eşitlik önergesi belirtmiş oluyoruz. Daha açık bir ifade ile her zaman doğru olan sonucu işle demiş oluyoruz. Bu kod ile sorgu bizim belirlediğimiz tipte çalışmaya başlayacaktır.

Aslında bu göndermiş olduğumuz sorguda bütün işi yapan değer (')tek tırnaktır. Bu tek tırnak bütün sorgunun çalışmasını etkilemektedir. Yukarıdaki yapı ile id değerinin boş olduğunu fakat id değerinin ne olursa olsun or değeri ile doğru çalışan bir işlemi gerçekleştir demiş oluyoruz. Bu en basit Injection yapısıdır.

SQL Injection Korunma Yöntemleri Nelerdir?

SQL Injection açıkları GET başta olmak üzere POST işlemlerinde de görülmektedir. Bundan dolayı verileri sorgu içerisinde bir işleme tabi tutmadan önce doğrulama ve filtreleme işlemleri yapılmalıdır.

Filtreleme işleminden zararlı olabilecek karakterleri zararlı meta karakterlerinde anlatmıştım. Burada yer alan değerleri kontrol ederek kullanıcının bu değerleri kullanmamasını sağlamalıyız. Bu karakterler; (;)noktalı virgül, (')tek tırnak, (--) ve (\*) yorumlama satırları.

Bu tarz karakterlerden kurtulmak için gelen değerlerde şöyle bir kontrol yapabiliriz.

if (preg_match("/[\-]{2,}|[;]|[']|[\\\*]/", $veri)){
echo "Saldırı amaçlı karakterler içermektedir.";
}else{
echo "Kullanıma Uygundur";
}

Tabi bu şekilde tespit ediliyor diye bunu bu şekilde kullanmak anlamsızca olabilir. Onun yerine bu sorguyu bir fonksiyon ile yazarsak o zaman daha kullanışlı olacaktır.

Bunu dışında eğer verileriniz sayısal, harf veya karakter olarak ayrı işlemler yapılıyor ise o zaman gelen değerin içeriğinin bilgisini tanımlayarak filtreleme yapabilirsiniz. Yani, id değerini get ile alıyorsanız o zaman gelen değerin sayısal bir veri mi değil mi onu kontrol etmek gerekmektedir. Bu yöntem açıkları kapatmanızı sağlayacaktır.

Bu tarz yapılardan hiç etkilenmeden işlemleri gerçekleştirmek, başınızın ağrımamasını sağlamak için prepare kullanılmadır. SQL Injection açıkları için en etkili yoldur.

Prepare methodu ile yapacağımız işlemlerde kullanıcıdan gelen değerler daha güvenli bir sistem filtresinden geçtiğinden ve direkt olarak bir erişim izni vermediğinden dolayı bu tarz saldırılarda sistemi güvende tutmaktadır. Bu metotla sorguların nasıl oluşturulduğunu görmek için PDO derslerine bakabilirsiniz. Bir örnek vermek gerekirse silme işlemi için şu yapıyı kullanmak bize herhangi bir sorun yaşatmayacaktır.

<?php
$Sil = $vt->prepare("delete from uyeler where id=?");
$Sil->execute(array($_GET["id"]));
?>

PDO kullanılmayan bir sistem varsa o zaman mysql_real_escape_string fonksiyonu kullanılır. Bunun dışında temizleme işlemleri için trim de kullanılır.

Bu fonksiyon ile tüm zararlı karakterleri escape edebilirsiniz. Bunun dışında trim ile gelen değerlerde bulunan boşlukları temizleyerek güvenlik seviyesi oluşturabilirsiniz. Örnek bir kullanım yapmak gerekirse şöyle bir fonksiyon çalışması işinizi görecektir.

$veri = trim(mysql_real_escape_string($_GET["veri"]));

Şeklinde bir kullanım yapılabilir. Tabi bunun kullanılması yerine sistemin PDO ile tekrardan kodlanması daha mantıklı olacaktır. Güvenlik söz konusu ise bu tarz yenileme düzenlemelerine öncelik verilmelidir.

Parametrelere müdahale dışında gerçekleşen dosya yükleme sırasında oluşacak açıklar.

Bu açıklar aslında en basit ve kontrol etme teşebbüsünde bulunmayan kişilerin başına gelecek bir açık türüdür. Sitenizde bir yükleme işlemi varsa(rar,resim dosyası veya herhangi bir şey) o zaman yükleme türüne göre kontrol sorguları oluşturulmalıdır. Resim tarzında bir yükleme varsa ve belirli uzantılara göre işlem yapacaksanız o zaman mime türüne, boyutuna öncelik verilerek kontroller yapılmalıdır.

Dosya yükleme sırasında kontrol yapmaktansa direk işlem yaparsanız o zaman kötü niyetli kişiler bu yükleme alanını kullanarak kendi hazırlamış oldukları php dosyalarını rahatlıkla sunucunuza yollayacaklardır. Yollamış oldukları bu php dosyası ile sisteminizin bağlantı bilgilerine kadar ulaşacaklarından dolayı sitenizin dosyalarına elveda diyebilirsiniz.

Tavisye : Sitenizi ziyaret eden hiç kimseye güvenmeyin. Çünkü bir açık yada bir ihmal bulduğunda hackerlık sevdası ve havasından dolayı sitenize zararverebilir. Aman çocuklar dikkatli olun.
- 25.07.2014 / 23:40:19 8

Sosyal Medya Paylaşım Alanı

Bunlarda İlginizi Çekebilir

Genel Makaleler

Atatürk'ün El Yazısı Font Oldu

Kategori: Genel Makaleler | 03.05.2013
8:13 Php Dersleri

Php ile Günün Sözü Uygulaması Yapma

Kategori: Php Dersleri | 03.05.2013
Php Dersleri

Php ile Excel Dosyasından Veri Çekmek ve Kayıt Etme

Kategori: Php Dersleri | 03.08.2015
Photoshop

Facebook Zaman Tüneli Resmi Yapma

Kategori: Photoshop | 03.05.2013
Web Tasarımları

Sevgiliye Site İndex Tasarımı [ Html&jQuery ]

Kategori: Web Tasarımları | 03.05.2013

Yorum Listesi (1) # YorumYap

  • BTN (04.07.2015 - 03:55:04)
    Merhaba,
    Çok güzel değinmişsiniz konuya fakat benim aklıma birşey takıldı ben verot.net in upload classını kullanıyorum ve aklımda hep soru kalıyor acaba bu class sayesinde sunucya shell yukleyebılırmı dıye. PDO yapısını kullanıyorum ve mime olarakta kontrol ettiriyorum hem html tarafında hemde vero.net in sundugu mime kontrol etme olayıyla. Verot.net in classında bir açık var mı bılmıyorum o yuzden supheliyim sizce ne yapmalıyım

Hadi Sende Yorum Yap!

Yorum Gönderilmiştir. Onaylandıktan Sonra Mesajınız Yayınlanacaktır.