SQL Injection Nedir? Kullanımı Nasıldır? Örneklerle Anlatım
08.02.2021 10:26 2.359 Görüntülendi

SQL Injection Nedir? Kullanımı Nasıldır? Örneklerle Anlatım

SQL Injektion, veritabanınızı yok edebilecek bir kötü amaçlı kod yerleştirme tekniğidir. SQL dilinin yaratmış olduğu açıklardan yararlanarak saldırganlar kullanıcı bilgilerine, mevcut verilere, gizlenmiş bilgilere erişebilir veya veritabanını komple silebilir.

Web Sayfalarında SQL

SQL Injektion genellikle bir kullanıcı adı/kullanıcı kimliği gibi giriş istediğinizde oluşur ve kullanıcı adı/kimliği yerine, bilmeden veritabanınızda çalıştığınız bir SQL ifadesi verir.

Seçili dizeye bir değişken (txtKullaniciID) ekleyerek bir SELECT ifadesi oluşturan aşağıdaki örneğe bakın. Değişken, kullanıcı girdisinden getirilir:

txtKullaniciID = getRequestString("KullaniciIDId");
txtSQL = "SELECT * FROM Kullaniciler WHERE KullaniciID = " + txtKullaniciID;

Bu noktadan itibaren, SQL deyimlerinde kullanıcı girdisini kullanmanın olası tehlikeleri açıklanmaktadır.

1 = 1'e Dayalı SQL Injektion Her Zaman Doğrudur

Yukarıdaki kodda asıl amaç belirli bir kullanıcı kimliğiyle bir kullanıcıyı seçmek için bir SQL ifadesi oluşturmaktır.

Bir kullanıcının "yanlış" giriş girmesini engelleyecek hiçbir şey yoksa kullanıcı aşağıdaki gibi bazı "akıllı" girişler girebilir:

Kullanıcı kimliği:      105 OR 1=1

Ardından, SQL ifadesi şöyle görünecektir:

SELECT * FROM Kullaniciler WHERE KullaniciID = 105 OR 1=1;

OR 1=1 her zaman DOĞRU olduğundan “Kullanicilar” tablosunda ki tüm satırlar çağırılır.

Yukarıdaki SQL ifadesi şununla büyük ölçüde aynıdır:

SELECT KullaniciID, Ad, Parola 
FROM Kullaniciler WHERE KullaniciID = 105 OR 1=1;

Bir bilgisayar korsanı, yalnızca giriş alanına 105 OR 1=1 yazarak veritabanında ki tüm kullanıcı adlarına ve şifrelerine ulaşabilir.

"" = "" Tabanlı SQL Injektion Her Zaman Doğrudur

Aşağıdaki SQL kod dizesinde bir web sitesine girişte sunucuya gönderilen istek bulunur.

SELECT * FROM Kullaniciler WHERE Name ="John Doe" AND Pass ="myPass"

Bir bilgisayar korsanı, bir veritabanında ki kullanıcı adlarına ve şifrelerine, adına veya şifre metin kutusuna “VEYA” “=” yazarak erişebilir:

Kullanıcı Adı, ve Parola kısımlarına “Or””=” yazarak sunucuya Aşağıdaki gibi bir SQl ifadesi gönderir.

SELECT * FROM Kullaniciler WHERE Name ="”or” ”=” " AND Pass ="”or” ”=”"

OR ”=” her zaman doğru olduğu için “Kullanici” tablosundaki tüm satırları çağırır.

 

Toplu SQL İfadelerine Dayalı SQL Injektion

 Çoğu veritabanı toplu SQL ifadesini destekler. Bir grup SQL deyimi, noktalı virgülle ayrılmış iki veya daha fazla SQL deyiminden oluşan bir gruptur.

Aşağıdaki SQL ifadesi "Kullanıcılar" tablosundaki tüm satırları döndürecek ve ardından "Tedarikçiler" tablosunu silecektir.

SELECT * FROM Kullaniciler; DROP TABLE Tedarikciler;

Bir web sitesinde giriş paneline “105; DROP TABLE Suppliers” yazılırsa sunucuya şu SQL ifadesi gönderilir.

SELECT * FROM Kullaniciler WHERE KullaniciID = 105; DROP TABLE Tedarikciler;

Koruma için SQL Parametrelerini Kullanın

Bir web sitesini SQL Injektion ‘dan korumak için SQL parametrelerini kullanabilirsiniz. SQL parametreleri, yürütme zamanında bir SQL sorgusuna kontrollü bir şekilde eklenen değerlerdir.

ASP.NET Razor Örneği

txtKullaniciID = getRequestString("KullaniciID ");
txtSQL = "SELECT * FROM Kullaniciler WHERE KullaniciID = @0";
db.Execute(txtSQL,txtKullaniciID);

Parametrelerin SQL deyiminde bir @ işaretçisi ile temsil edildiğine dikkat edin.

Sunucuya gönderilen SQL komutunun bir parçasının değil, harfi harfine doğru olduğuna emin olmak için her parametreyi kontrol eder.

txtMus = getRequestString("MusteriAd");
txtAdr = getRequestString("Adres");
txtSeh = getRequestString("Sehir");
txtSQL = "INSERT INTO Musteriler (MusteriAd, Adres, Sehir) Values(@0,@1,@2)";
db.Execute(txtSQL,txtMus,txtAdr,txtSeh);

ASP.NET 'DE BİLDİRİM SEÇİN:

txtKullaniciID = getRequestString("KullaniciID ");
sql = "SELECT * FROM Musteriler WHERE MusteriID = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtKullaniciID);
command.ExecuteReader();

ASP.NET 'DEKİ BEYANNAMESİNE EKLEYİN:

txtMus = getRequestString("MusteriAd ");
txtAdr = getRequestString("Adres ");
txtSeh = getRequestString("Sehir ");
txtSQL = "INSERT INTO Musteriler (MusteriAd, Adres, Sehir) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtMus);
command.Parameters.AddWithValue("@1",txtAdr);
command.Parameters.AddWithValue("@2",txtSeh);
command.ExecuteNonQuery();

 

 

İçerik: YUSUF ERDOĞAN