• genel olarak ' karakteri '' ile replace edilerek kapatılabilecek açık.
    eğer veritabanı sql server ise '' yerine chr(146) ile replace edilmesi daha mantıklı olacaktır zira bu sorgu bir arama sorgusuysa kullanıcının girdiği yazıdaki ' karakteri gümbürtüye gitmeyecektir.
    ama en güzel çözüm her zaman stored procedure kullanmaktır.
  • acemilerin elinden çıkan dinamik sitelerin hack edilebilme sebeplerinden biri...
    http://kk-dev.blogspot.com/…4/05/sql-injection.html adresinden ayrıntıları öğrenilebilir...
  • veri kontrolü yapılmayan bir formda metin girme alanları direkt database'e yansıyacağından bu alanalra hin kodlar ekleyerek database'i hacamat etme yöntemleri...
  • php için, php.ini'yi düzenlerken magic-quotes'u "on" yapmak suretiyle birçok türünden yırtılabilecek çakallık.
  • eger scripte gönderilen request de içerikler quote edilmezse kullanılabilecek açık.
    mesela;
    bu adresin normal login formu:
    www.asd.com/login.php?username=test&password=123456
    sql injection ile girilme metodu:
    www.asd.com/login.php?username=test&password=' or 1=1 '
    gibi...
    mantık ortalama bu şekildedir, üzerinde çalışmak gerekir.. eğer query bir update veya insert yapıyorsa çok daha sakkattır dikkat edilmesi gerekir.
  • sadece web değil, windows uygulamaları içinde geçerli olabilecek, sadece risk unsuru karakter veya keywordleri (', union, delete, drop, -- vb..) replace etmekle kurtulmak yerine çok katmanlı bir güvenlik yapısı ile önlem alınması daha doğru olan, riskin oranı sql dilinin gücü ile doğru orantılı olarak artan tehdit.

    tüm kullanıcı girişlerinin potansiyel tehdit olarak varsayılıp en az iki defa doğrulanması
    dinamik sql ifadeleri oluşturup bunları execute etmek yerine parameterized sql ifadeleri kullanılması daha da iyisi stored procedure lerin kullanılması
    her işi sa veya yüksek yetkilere sahip user accountlar ile değil, mümkün olan en düşük yetki ile gerçekleştirilmesi (örneğin presentation layer için sadece datareader hakkı olan bir account iyi bir tercih olacaktır)
    gizli verilerin (kullanıcı account bilgileri, connectionstring ler vb.) sürekli şifrelenerek saklanması

    ve daha sayılabilecek pek çok önlem bu basit saldırı karşısında sorun yaşanmamasını sağlayabilir.
  • türkçe bir yazılım geliştirme sitesinde bu kavrama türkçe karşılık olarak "sql aşılama" diye bir şey layık görülmüş. sanki daha çok "sql'i öğretme ve yaygınlaştırma" olarak gözüküyor böyle söyleyince. ama halbuki aksi yönde "sql kullanarak sitelerin anasını belleme yöntemi" olarak türkçeleştirebiliriz.
  • türkçesi "sql gömme" olabilir.
  • site uzerinde bu açığı kullanmak için ilk dikkat etmeniz gereken şey hangi formu submit ettiğinizde veritabanı sorgusu sonucu size ordan bazı verileri gösterecektir. örnek olarak search formları veya çoklu dataları kısaltan veri giriş noktaları verilebilir.
    bizim amacımız genelde bu form submitlerinden sonra o tabloların ustune yeni tablolar çekmektir. formları nasıl bulucam diye düşünenlere firefox kullanmaları ve sayfaya sağ tıklayıp view page info dedikten sonra forms kısmına bakmalarıdır. ordan hangi adresin hangi değişkeni aldığı görülebilir.
    mesela www.hedehede.com/uyelistesi.asp?sehir=istanbul&ilce=adalar
    şimdi biz burda bu tablonun altına yeni bir tablo almaya çalışıcaz
    www.hedehede.com/uyelistesi.asp?sehir=istanbul&ilce=adalar ' union select table_name from information_schema.tables--
    bu bize serverdaki tabloların isimlerini verir. ancak union operatoru gereği bizim istediğimiz tablonun kolon sayısı ile üstteki tablonun kolon sayısı aynı olmak zorundadır. bu nedenle o tip bir mesaj alırsanız table_name, table_name şeklinde arttırarak denemelerinize devam edebilirsiniz.
    eğer tablo isimlerini çekebildiyseniz istediğiniz tabloyu gözünüze kesitebilir ' union select column_name from information_schema.columns where table_name='tablename'-- şeklinde o tablonunun column namelerini çekebilirsiniz. ondan sonra istediğiniz bilgiye hangi tablodan ulaşabileceğinizi tahmin edip sorgu çekmektir.
    sql injection yeme potansiyeli yuksek olan formlar değişkenini bir linkten okuyan formlardır.
    bu sql injection yöntemi ozellikle forumlarda çok yoğun bir şekilde kullanılabilir.
  • herhangi bir sorguya dışarıdan yeni koşullar enjekte etme işlemidir.

    post kullanan bir login formumuz olduğunu düşünelim.

    bu formdan gelen değerler:

    $_post["username"]
    $_post["passwd"]

    olsun. eğer bu değişkenleri aşağıdaki gibi sql sorgusuna direkt olarak uygularsak

    $sql='select * from kullanicilar where username='.$_post["username"].' and password='.$_post["passwd"].'';

    sql injectiona davetiye çıkarmış oluruz.

    enjektör arkadaşımızın password field'ına ' or ''=' yazdığı düşünülürse sorgu şöyle olacaktır.

    select * from kullanicilar where username='admin' and password='' or ''=''

    doğal olarak bu sorgu bize admin kullanıcısına ait tüm field değerlerini döndürecektir. bu da login olabileceğimiz anlamına gelir.

    engellemek adına tüm kullanıcıların passwordleri md5 gibi bir yöntemle kaydedilir. bu durumda formdan gelen data önce md5lenir daha sonra da database deki ile karşılaştırılır. örneğin

    $sql='select * from kullanicilar where username='.$_post["username"].' and password='.md5($_post["passwd"]).'';

    bu tarz bir sorguda akıllı arkadaşımız password olarak ' or ''=' girdiğinde sorgu şu şekilde olacaktır.

    select * from kullanicilar where username='admin' and password='6d0212caf1488446bc079f6e150db606'

    eğer adminimiz şifre olarak ' or ''=' seçmediyse bu sorgu babayı döndürür. sistemimiz bir nebze daha güvenli olur.

    ' or ''=' dan da güzel admin şifresi olurmuş bak.
hesabın var mı? giriş yap