SQL injection; veritabanına dayalı uygulamalara veya sitelere saldırmak için kullanılan bir saldırı tekniğidir. Burada saldırgan, standart uygulama ekranındaki ilgili alanlara yeni SQL ifadeleri eklemek için SQL dil özelliklerini kullanır. Sistem içerisinde erişilmek istenilen herhangi bir veri içerisine SQL sorguları gömülür ve bu gömülen sorgular çalışmayı devam ettirebilirse sisteme sızılmış olur ve SQL injection açığı bulunur. Örneğin kendisini de uygulamanın içerisindeki bir kullanıcı olarak gösterip sisteme sızabilir. SQL injection uygulamalardaki güvenlik açıklarından beslenir. Çoğunlukla web sitelerini ele geçirmek için kullanılsa da SQL injection ile SQL veritabanlarına da saldırı gerçekleştirilebilir.
SQL injection saldırıları, kullanıcı bilgilerini ele geçirip üzerinden işlemler yapmaya, mevcut verilere ulaşıp üzerinde değişiklikler yapmaya, verileri ifşa etmeye , verileri yok etmeye, sunucu üzerinde sistem yöneticisi olmaya olanak sağlayan bir saldırı biçimidir.
SQL injection temelde 2 sınıfa ayrılarak ele alınmaktadır. Bunlar;
- Hata Tabanlı SQL İnjection
Hata tabanlı SQL injectionın temelinde siteyi hataya zorlayıp açık aramak vardır. Bu açıklığın kendi arasında 2 alt sınıfı bulunmaktadır bunlar; Union ve Double dır. Site hataya zorlanır ve hata bulunursa SQL injection açıklığı bulunmuş olur.
- Blind SQL İnjection
Blind SQL injection, kör atış SQL saldırılarıdır. Veritabanına direk olarak ulaşılıp üzerinde işlem yapılamaz fakat alınmak istenen veriye göre harf harf işlem yaparak doğru sonuçlara ulaşır. Manuel olarak yapılması epey uğraştırıcıdır. Blind SQL injection da 2 alt başlığa ayrılmaktadır bunlar; Boolean ve Zaman tabanlıdır.
Boolean SQL injection içerisinde mantıksal ifadenin sonucuna göre True veya False olarak döner. Zaman tabanlı SQL injection da ise, sisteme gönderilen sorgunun çalışıp çalışmadığı soru yöntemiyle tespit edilemediğinden sorgu içerisine sleep() ve benzeri fonksiyonlar eklenerek sistemin vereceği cevabın gecikip gecikmediğine odaklanarak saldırı işlemini gerçekleştirir.
SQL Sorgusu Nedir?
SQL sorguları ile her kullanıcıya özel veri görünümleri oluşturmak üzere veritabanları oluşturup bunları yönetmek için kullanılan standartlaşmış bir dildir. SQL sorguları ile, kayıtlar yapabilir, kayıt silebilir, kayıt güncelleyebilir, veriler alabilirsiniz.
SQL İnjection Nasıl Yapılır?
Sql injection pek çok güvenlik açığından faydalanarak sistemi ele geçirebilir. Örneğin, bir siteye giriş yapıyoruz. Kullanıcı adımız “kullanici” şifremiz ise “123” olsun. Giriş butonuna tıkladığımızda yapılan yazılım veritabanına şöyle bir sorgu gönderecektir:
SELECT*FROM kullanicilar Where ad=’kullanici’ AND sifre=’123’
Bu sorgu sonucunda böyle bir kullanıcı bulunursa sistem girişinize izin verecektir, yanlış ise de izin vermeyecektir. Bir de kullanıcı ve şifre alanlarını ‘OR 1=1 ifadesi yazdığımızda ortaya çıkan sorguyu inceleyelim.
SELECT*FROM kullanicilar Where ad=’ ’OR 1=1 – – ‘ AND sifre=’ ’OR 1=1 – -‘
gibi bir sorgu çalışacaktır.
Eğer sitede yapılan yazılım SQL injectionu algılayıp filtreleyebilir bir yazılım ise girişinizi engelleyecektir, filtrelemiyor ise güvenlik açığı bulunmakta ve bundan dolayı da girişinize izin verecektir.
OR 1=1 – – ifadesi SQL dilinde her zaman true döndüren bir ifadedir. Bu yüzden giriş doğru yapıldı zannedip girişe izin verecektir.
Başka bir örnek daha verecek olursak; makale sitemiz olsun ve bu makaleler id’lerine göre listelensin. Örneğin, makale.php?id=2. Burada saldırgan ilk olarak id’ye göre hareket edecek ve id kısmına yani bizim 2 olarak yazdığımız kısma tek tırnak işareti (‘) koyarak işe başlayacaktır. SQL açığı var ise burada veritabanı hata verecektir. Bu hata ile de istediğimiz veriye ulaşmamız mümkün. Bu gibi saldırıları engellemek için sitemiz yazılımında EROR-404 sayfası oluşturarak webconfig ayarlarında tanımlamamız hataları saldırgana ve kullanıcıya göstermeyecektir.
SQL İnjection Saldırısından Nasıl Korunur?
Veritabanlarımızı oluştururken kullanıcıdan alacağımız her bilgiye tek tırnak (‘) ve çift tırnak (“) karakterleri getirilerek saldırıdan korunabiliriz. Bu karakterleri ister karakter koduna çevirerek yapmalıyız ister karakterin başına kaçırma karakteri () ekleyerek kullanmalıyız. Bu durumda SQL girilen karakterleri komut olarak algılamayacaktır.
Bir başka korunma yöntemi ise kesinlikle SQL sorgularınızı basite indirgememeniz olacaktır. Store Procedure ve Parametreler kullanarak yapmanız sizi daha güvenli tutacaktır.
SQL injection saldırılarına karşı kod yazarak da potansiyel saldırılara karşı korunabilmek mümkün. Sitenizde yapılan her işlemi kontrol altında tutacak, tehlikeli gördüğü karakterleri kontrol altına alıp işlem yapılmasını engelleyen bir kod ile de korunabilirsiniz.