Php de Sql İnjection Açığı Nedir? Nasıl Korunulur?

Tarih: Eylül 7th, 2008 | Yazar: | Kategori: Php | Etiketler: , , , , , , , , , , , , , , , | 1 Yorum »

Bu yazıda Sql İnjection açığından bahsedeceğiz.

Sql Injection Nedir?

Her webmaster, coder sitesini yazarken belirli bir şifreleme kullanır. Genellikle bu md5 tir. Şifreler db ye md5 lenmiş halde gider. Böylece db ye yönelik bir saldırıda şifreler hala güvende kalır. Fakat şunu atlıyoruz. Yani şifreler yolda giderken saldırıya uğrarsa?

Hiçbirimiz şunu unutmamalıyız ki zırhlı bir aracın en güvensiz olduğu yer yol üstünde giderken ki halidir. Çünkü bir eylem içinde ve etrafını kontrol edemiyor. İşte sql injection ( ben kısaca sj diyeyim ) böyle bir saldırıdır. Bizim html veya php olan giriş sayfamıza yapılır. Bir diğer yazımda hatırlarsanız php tamamen dinamiktir demiştim. Sj de bu dinamiklikten yararlanır ve bizi aynı kodlarla hataya düşürür. Sj direk bir hack yöntemi değildir.

Şöyle örnek vereyim maçlarda oyuncu pres yaparsa karşısındaki hataya zorlanır ve genelde hata yapar. İşte sj de böyledir.

Kısaca Sj nin mantığını öğrendik. Birde bunu php dilinde anlatalım…

uyegirisislem.php kısaca şöyledir:

<?
$kullanici=$_POST["nick"];
$sifre=$_POST["sifre"];
İşte en kısa hali bu. Bunlar db den onaylanıyor değil mi? Evet gerçektende öyle:
1
$sifremd5=md5($sifre);
select * from uyelik where nick='$kullanici' and sifre='$sifremd5'
?>

Tamam buraya kadar php bilgisi olmayan bile anlar bunları. Fakat ben üye girişte adamın yerine // karakterleri eklersem ne olur?

select * from uyelik where nick='//' and sifre='$sifremd5'

gerisi tamamen uçtu gitti... Gördüğünüz gibi veriler yolda saldırıya uğradı. Sj nümerik olmayan veya olan karakterleri bize karşı kullanır. Asp de de yanılmıyosam /* şeklinde. Kişi // karakterlerini kullanıp şifreyi kafadan sallasa geri kalan db nin işi. Eğer herhangi bir aksilik olmasa direkt olarak içeriye sızar. İşin kötü yani admin hesabının id sini biliyorsa:

select * from uyelik where nick='admin//' and sifre='$sifremd5'

şeklinde direk ona da dalabilir. Bu yöntem genelde kullanılmaz. Nedeni nümerik karakterler db tarafından fark edilme olasılığı yüksektir. Bu gibi bir durumda eğer biz nick ile şifreyi daha önceden de db de aratıyorsak ne yaparsanız yapın sj işe yaramaz.

Bundan başka bir nümerik karakterleri db de çalıştırma yöntemi vardır.
OR ” = ” gibi acayip görünen yanlız nick= VEYA Boş Eşittir Boş şeklinde nick i de iptal edebilir. Böylece nick= veya durumunda boş görünecek ve Boşluk içerisinde Admin hesabı daha doğrusu db de ilk kim varsa o hacklenecek.

Korunma Yöntemleri

Size 3 tarz yöntem vereceğim, içinden size en uygun olanını seçin...

SJ anlattığım gibi from işlemlerine veya daha farklı yollara direk olarak müdahale eder. Veri yoldayken hasar görür. Buna hackerlar "deface" yani "bozmak" derler.

Sunucu olarak yani bütün heryeri korumak istiyorsanız php.ini de ki
magic-quotes değerini on yapın. Her ne kadar bu da bir yerde işe yaramasada lamer denilen ilk bölüğü durduracak kuvettedir.

Bir diğer yöntem ise benimde kullandığım mysql_real_escape_string() kodudur.

Örnek:

<? mysql_real_escape_string($_POST[’kullanici’]); ?>

Son yöntem ve bu en kesinidir // gibi karakterleri veri yolunda değiştirmektir

Örnek:

<? function duzelt($deger)
{
// /’ yerine ‘ bırakıyoruz.
if (get_magic_quotes_gpc()) {
$deger = stripslashes($deger);
}
// sayısal değer değilse mysql_real_escape_string() işlevini uyguluyoruz
if (!is_numeric($deger)) {
$deger = “‘” . mysql_real_escape_string($deger) . “‘”;
}
return $deger;
}
$sorgu = sprintf(”SELECT * FROM kullanicilar WHERE kullanici=%s AND parola=%s”,
duzelt($_POST[’kullanici’]),
duzelt($_POST[’parola’]));
mysql_query($sorgu); // temiz bir sorgu ?>

Herkese iyi günler.




Benzer Yazılar;

coded by nessus

“Php de Sql İnjection Açığı Nedir? Nasıl Korunulur?” yazısında 1 Ahkam var.

  1. 1 hayrullah 18:58 on Ocak 6th, 2011 anında kesmiş:

    Ben bir örnekle soru sorayım. Sitemizde URL Rewrite yapıyoruz. Yani kullanıcıya get ile gönderilen bilgileri göstermiyoruz. Kullanıcıdan ise sadece yorum ve iletişim için formdan bilgi alıyoruz. Hiç bir şekilde kullanıcıdan alınan bir bilgiyle hiç bir alakası olmayan iki tablodan birinde sadece ilk kayıt silinmiş, diğerinde ise kayıtlar bozulmuş. Anlamadığım şey şu sadece okunan bir tablodan kayıtlar neden silinsin, neden bozulsun? Bir diğeri php.ini dosyasında get_magic_quotes_gpc true olduğu için post ile gelen bilgilerdeki tırnakları önceliyor. Dolayısıyla bu özellik true ise addslashes işlevini kullanmayınız diyor ve kullanmıyorum. Aynı mantıkla mysql_real_escape_string fonksiyonunu da kullanmıyorum. Bu konuyla ilgili bir açıktan dolayımı acaba saldırı oluyor? Teşekkürler. Tavsiyelerinizi bekliyorum. (http://www.php.net/manual/tr/function.addslashes.php)


Ahkam Kesme Aparatı

  • *