SQL Injection, web formlarında kullanılan metin kutularından ya da URL ile gönderilen değişkenler üzerinden SQL sorgu cümleciğine direkt olarak müdahale edilmesi ile gerçekleştirilen bir ‘deface’ yöntemidir. Bu yöntem lamer olarak adlandırılan kötü niyetli insanlar tarafından kullanılır.
Gerçek hayatta olduğu gibi, Internet ortamında da dünyaya karınağrısı yaratmak için gelmiş olan, ego tatmini ve adrenalinle beslenen bünyeler mevcuttur. Bu ezik insanlardan sitelerinizi korumanın yolu aslında çok basittir.
Önce bu sorunun nasıl oluştuğunu örnek üzerinde inceleyelim;
/* Gelen POST verilerine göre veritabanından belirtilen
kullanıcı adı ve parolaya sahip olan kullanıcı isteniyor */
$sorgu = “SELECT * FROM kullanicilar WHERE kullanici=’{$_POST[’kullanici’]}’ AND parola=’{$_POST[’parola’]}’”;
mysql_query($sorgu);
/* Yukarida $_POST[’parola’]'yı kontrol etmeyi ‘unuttuk’.
Bunu kodu inceleyerek ya da deneme yoluyla öğrenen bir lamer
Aşağıdakine benzer bir giriş yapacaktır. */
$_POST[’kullanici’] = ‘EAN’;
$_POST[’parola’] = “‘ OR ”=’”;
Burada yürüyecek sorgu şu olacaktır;
SELECT * FROM kullanicilar WHERE kullanici=’EAN’ AND parola=” OR ” = ”
Bunu önlemenin çeşitli yolları var, buna karşı sunucuda alınabilecek önlem; php.ini’yi düzenlerken magic-quotes değerini “on” yapmaktır.
İkinci önlem sunucudaki magic-quotes değerini dikkate almadan PHP’nin sihirli işlevlerinden mysql_real_escape_string() işlevini kullanmaktır.
Şöyle;
$sorgu = sprintf(”SELECT * FROM kullanicilar WHERE kullanici=%s AND parola=%s”,
mysql_real_escape_string($_POST[’kullanici’]),
mysql_real_escape_string($_POST[’parola’]));
Üçüncü ve kesin önlem, temizleyici bir işlev yazmak ve tüm uygulamalarda işlev kütüphanemizden bu işlevi çağırarak çalışmaktır.
Şimdi bunu görelim;
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
Evet hepsi bu!
Çok yararlı olmuş.
Bu arada deface=bozmak
hack ile alakalı sitelerin çoğunda injection ile deface anlatılıyor, bu açığı insanlara göstermen takdire şayan ersin saolasın
Web tasarımını yeni öğrenmeye başladığım şu sıralarda, çok merak ettiğim bir konuda bizleri uyarıp aydınlattınız.Keşke bu kötü ruhlu insanlar olnmasa. Takdire şayan davranışınızdan ötürü sizi kutluyor ve teşekkürlerimi sunuyorum.
Merhaba;
Oncelikli olarak, string bir alana yapilabilecek injection nasil kesilir cok guzel sekilde aciklamissiniz,tebrik etmek istedim.
Lakin deginmemiz gereken belki de en onemli nokta,SQL Injection anlatirken bu zayifligi kullanabilecek insanlar uzerine tespitlerde bulunmaktansa, SQL Injection nedir, nasil calisir, nasil calismaz,alinabilecek onlemler vs ‘den bahsetmek daha mantiklidir.Zira SQL Injection web uygulamasi guvenligi alanindaki en ciddi konu basliklarindan biri ve belki de en ciddisidir!
Yazdiginiz e-ticaret scriptindeki SQL Injection exploit edildikten sonra bunu yapan insanin karakteri, ezik , “lamer” vb olmasi onemli degildir, onemli olan calinan kredi karti bilgileri, ele gecirilen SQL sunucular, tum veritabaninin dump’inin alinmis olmasi vb konulardir.Onemli olan kod yazarken SQL Injection denen seyden haberdar olup onlemini almaktir ve bu web uygulama programcilari icin bir zorunluluktur.
Selamlar,
Bu yazı php programcılarına bu konuda bir tavsiye niteliğinde kenara alınmış bir not niteliğinde değerlendirilse daha sağlıklı olacaktır.
Bu konuda takip ettiğim kadarıyla Ferruh Mavituna’nın ve webgüvenliği grubunun ciddi dökümantasyon çalışmaları vardı.
Sizin web sitenizi de şimdi ziyaret edebilme fırsatı yakaladım.
http://www.h-labs.org/blog/2007/11/25/sqli_104_magic_quotes.html
Şu yazıyı beğendim. Net ve açıklayıcı olmuş, tebrik ederim. Bu arada http://ean.btturk.net/?p=105 şu yazı da dikkatinizi çekebilir.
Çalışmalarınızda başarılar..
O yaziyi dun gordum,hatta ben de bir iki deneme yaptim fakat exploit edemedim, acikcasi cok da vakit harcamadim.
OWASP-TR/WGT’yi yakindan takip ediyor ve destekliyorum. Ferruh Bey’in de calismalari gercekten cok kaliteli, hele SQL Injection Cheat Sheet’i, nette gordugum en basarili ve kapsamli cheat sheet.
Aslinda Magic Quotes ile ilgili yorumunuzu bloga beklerdim:-)
Size de iyi calismalar, basarilar.