SQL İnjection Açığı Nedir ?
Merhaba Arkadaşlar,
Sql injection saldırıları , veri tabanına dayalı uygulamalara saldırmak için kullanılır. SQL cümlecikleri oluşturulurken araya herhangi bir meta-karakter koyarsak SQL İnjection(enjeksiyon)’a sebep olabilir.
Meta-karakter nedir diye soracak olursanız , herhangi bir programlama diline ait özel anlamı olan karakterlerdir.Daha açıklayıcı olması için örnek vereyim.Mesela SQL için kritik karakterler tek tırnak(‘) , noktalı virgül (;) olabilir.Çünkü SQL’de iki tek tırnak arası string olarak algılanır.Noktalı virgül ise satırın bitişini göstermektedir.C veya PHP dillerinde bu “\” backslash karakteri bir meta-karakterdir.
SQL injection ile SQL sorgusunun amacına müdahale(meta-karakter ekleyerek) ederek farklı bilgileri elde edebiliriz.
SQL İnjection Nasıl yapılır ?
SQL kullanan bir sisteme login olacağız ve username kısmına “Mutarrif” , password kısmına “6526” yazdığımızı varsayalım.
SQL cümleciğimiz aşağıdaki gibi olacaktır.
select * from users where username=’Mutarrif’ and password=’6526′
Veritabanında girilen username ve password kontrolu sağlanır.
Kontrol doğru olursa login olumlu olacaktır , kontrol yanlış olursa login olumsuz olacaktır.
Fakat biz username ve password bölümüne ‘ OR=1=1–“ yazdığımızda sql cümleciğinin yeni haline bakalım.
select * from users where username=” OR 1=1–‘ and password =” OR 1=1–‘
Eğer sistemi kodlayan yazılımcı SQL İnjection’a sebebiyet verecek meta-karakterleri filtrelemiyorsa yukarıda SQL cümleciği ile username ve passoword’u bilmeden sisteme login olmuş olacak.
‘OR1=1– sql dilinde her zaman olumlu sonuç döndürür(True).Bu ifade , önceki koşulların gerçekleşip gerçekleşmediğine bakmadan 1=1 gerçekleşiyorsa olumlu döndür ve sorgunun geri kalanını boşver diyecek.Bunun sebebide ifadenin sonuna koymuş olduğumuz “–“ işaretlerinden kaynaklıdır.Çünkü SQL sorgu dilinde “–“ yorum satırı demektir.Bu sebepten bu ifadeden sonrasını yorum olarak algılayacaktır.Bir örnek daha verelim.
Mesela bir haber sitesindeyiz.Diyelim ki haberler adres çubuğundaki İD’ değere göre yayınlanıyor.
site.com.tr/news.php?id=180
Sitede SQL İnjection açığı var mı onun kontrolünü yapmak için sondaki 180 sayısın sonuna bir tırnak işareti koyuyoruz.
id=180‘
Eğer sitede SQL injection açığı varsa SQL(Veritabanı) hatası verecektir.Fakat şunu unutmayalım her SQL(Veritabanı) hatası sitede SQL İnjection açığı var anlamına gelmez.Başka sebeplerden dolayıda SQL(Veritabanı) hatası alabilirsiniz.Aşağıdaki sorgu çalışırsa SQL injection açığı vardır demektir.
site.com.tr/news.php?id=180’union select * from users
kodu çalıştırdığımızda veritabanındaki tüm users tablosu listelenmiş olacak.
Bir sonraki makalemde SQL İNJECTİON’dan nasıl korunabileceğimizi anlatacağım.İyi günler dilerim.
Yorum Gönder