• 28-06-2013, 16:36:08
    #1
    Arkadaşlar merhaba,

    SQL Injection hakkında kafama takılan bir soru var. Yardımlarınızı rica ediyorum.
    Bu saldırı şekli sadece sorgulama yaparken mi etkin oluyor acaba?

    Hani en basit haliyle: ' or '1' ='1 şeklinde yapılan saldırı sadece arama yaparken mi etkili olur.

    Yani hiç bir arama olmayacak normal bir form alanına kayıt girerken de zararlı bu tarz kodlar?

    Mesela; Rehber yaptığımızı düşünelim. Hiç bir sorguda kullanılmayan Adı yazan form alanına kullanıcı zararlı bir kod yazıp kaydetse ne olur?

    umarım anlatabilmişimdir.

    teşekkürler,
  • 30-06-2013, 00:21:58
    #2
    Üyeliği durduruldu
    Örnek vereyim;
    1. login formu düşün. kullanıcı adı ve şifre isteniyor. eğer formun post edildiği kod betiğinde bu iki alan için kontrol yapılmamışsa kontrol sorguna inject olunabilir.
    mesela formunda kullanici_adi ve sifre inputların olsun. kod betiğinde de sql sorgun şöyle:
    sql = " SELECT * FROM uyeler WHERE kullanici_adi='"&Request.Form("kullanici_adi")&"' AND sifre='"&Request.Form("sifre")&"' "

    sql de tek tırnak --> ' özeldir, stringler için belirteçtir. eğer sen kullanıcı adı alanına ' 1 or 1=1 -- yazarak gönderirsen tırnaklar sayesinde sorguya ek parametreler eklemiş olursun. 1=1 dediğin için de cevap otomatikman olumu dönecek ve login gerçekleşecek.

    2. querystring'den de aynı şekilde. sayfan mesela haberoku.asp?ID=1 olsun.
    sen sorgunun içine bu ID parametresinin karşılığı olan 1'i alacaksın.
    sql = " SELECT * FROM haberler WHERE id = "&Request.Querystring("ID")&" "
    1 olan kayıt gelir. eğer haberoku.asp?ID=1 UNION SELECT 0 FROM admin .... diye devam edip koda müdahale edebilirsin ve admin bilgilerine ulaşabilirsin. iyi sql bilmek gerekir.

    umarım demek istediğimi anlamışsındır.

    sql açıklarından nasıl korunurum diyorsan:
    1. formdan ve query den gelen verileri filtreleyeceksin, tırnak işaretini &39a;ya çevireceksin.
    2. queryden aldığın verilerde de aynı şekilde filtre yapacaksın, eğer sayı alıyorsan gelenin sayı olup olmadığını da kontrol edeceksin. mesela haberoku.asp?ID=1
    If NOT IsNumeric(Request.Querystring("ID")) Then
    Response.Write "DURRR"
    Response.End
    End If

    bu şekilde ID nin sayı olup olmadığını kontrol edersin.

    googleda araştır bu işi. hadi kolay gele.
  • 30-06-2013, 04:41:37
    #3
    Kimlik doğrulama veya yönetimden onay bekliyor.
    replace ile bunu engelleyebilirsiniz
  • 01-07-2013, 17:15:40
    #4
    ShekerChi detaylı bilgi için teşekkür ederim.
    Ancak benim sorum bu değildi.
    Injection nedir ve nasıl yapılır bunu öğrendim.

    Ancak benim merak ettiğim kısmı, hiç bir sorguda yer almayacak ilave bilgi niteliğindeki form alanlarında da kontrol gerekli mi? Buradan da saldırı alınabilir mi?

    Yani sorgu olsun olmasın, kaydedilen bütün alanları tek tek kontrol etmeli miyim, bunu merak ediyorum. Yoksa sadece sorgularda kullanılan alanları kontrol etsem yeterli mi?

    tekrar teşekkürler,
  • 02-07-2013, 11:53:05
    #5
    aset0n adlı üyeden alıntı: mesajı görüntüle
    ShekerChi detaylı bilgi için teşekkür ederim.
    Ancak benim sorum bu değildi.
    Injection nedir ve nasıl yapılır bunu öğrendim.

    Ancak benim merak ettiğim kısmı, hiç bir sorguda yer almayacak ilave bilgi niteliğindeki form alanlarında da kontrol gerekli mi? Buradan da saldırı alınabilir mi?

    Yani sorgu olsun olmasın, kaydedilen bütün alanları tek tek kontrol etmeli miyim, bunu merak ediyorum. Yoksa sadece sorgularda kullanılan alanları kontrol etsem yeterli mi?

    tekrar teşekkürler,
    SQL injection olmaz başka bir bug oluşur onu kullanırlar sistemine zarar verebilebilir.
    Daima kontrolleri yapınız. Eğer bir sayı çekiyorsanız sayı olup olmadıgını, eğer 5 karakterli bir yazı gelecekse 5 karakter uzunluğunda olup olmadığına kadar kontrolleri yapmanız sizin yazılımınızı güçlendirecektir.
    İyi bir yazılımcı hatayı minimuma indirgemelidir.
  • 02-07-2013, 13:31:48
    #6
    en garanti metod sorgularda parametre kullanmaktır. ShekerChi arkadaşımız çok güzel açıklamış durumu.
  • 02-07-2013, 17:53:30
    #7
    ya bu hata acık kendi hazırladğıdım sistemde bi türlü çalıştıramadım,normal şekilde şifre hatalı diyor sadece.
    request alırken herhengibi bir filtrelemem işmide yapmıyorum.acaba acık tüm iis lerde yok mu ki
  • 02-07-2013, 23:12:25
    #8
    Üyeliği durduruldu
    oktayman adlı üyeden alıntı: mesajı görüntüle
    ya bu hata acık kendi hazırladğıdım sistemde bi türlü çalıştıramadım,normal şekilde şifre hatalı diyor sadece.
    request alırken herhengibi bir filtrelemem işmide yapmıyorum.acaba acık tüm iis lerde yok mu ki
    açık senin kodlaman yüzünden oluşur, IIS ile alakası yok, üstte yazdığım cevabı anlayarak okumalısın
  • 02-07-2013, 23:26:07
    #9
    ShekerChi adlı üyeden alıntı: mesajı görüntüle
    açık senin kodlaman yüzünden oluşur, IIS ile alakası yok, üstte yazdığım cevabı anlayarak okumalısın
    hımm anladım,ben konuyu farklı biliyormuşum if döngülerini de aynı şekilde etkiliyor sanıyordum

    <%
    if request.form("B1")<>"" then
    
    	if request.form("T1")="12345" then response.write "dogru"
    
    end if
    
    
    %>
    <form method="POST" >
    	<p><input type="text" name="T1" size="20">
    	<input type="submit" value="Gönder" name="B1">
    	<input type="reset" value="Sıfırla" name="B2"></p>
    </form>
    bu kodlarda ' or 1=1 yazıyom neden olmuyor diyordum.
    sadece sql için değil mi bu