SQL enjeksiyonunun yöntemine ve amacına bağlı olarak çeşitli türleri vardır ve siber saldırganların bakış açısından bunlar bilgi çalmaktan, verileri tahrif etmeye ve güvenlik açıklarını araştırmaya kadar uzanır. Eski bir saldırı türü olmasına rağmen, günümüzde hala büyük hasara yol açmaktadır, bu nedenle kurumsal kuruluşların özellikle dikkat etmesi gereken saldırılardan biridir.
SQL, ilişkisel veritabanlarında işlem yapmak için kullanılan bir dildir (veritabanı dili). İşlemler genel olarak üç kategoriye ayrılır:
Şekil 1: Siber saldırganlar tarafından kullanılan girdilere örnek
Şekil 2: Şekil 1'deki girdiden oluşturulan SQL ifadesi
İlişkisel veritabanı bu SQL ifadesini aldığında, öncelikle USERS tablosunda USER NAME'i "Ken Sato" olan bir satır arar. "Ken Sato" kullanıcı adı zaten mevcut olduğundan, ilişkisel veritabanı bir sonraki arama koşuluna geçer. Sorun da burada başlıyor.
Arama koşuluna göre, ilişkisel veritabanı, kullanıcı adı "Ken Sato" ve şifresi "boş" veya "'1' = '1'" olan bir kullanıcı arar. Birçok uygulamada şifre gerekli olduğundan, bu sefer "boş" şifreli bir kullanıcı bulunamadığını varsayalım. Peki ya "'1' = '1'"? Bu, "1" ve "1"in aynı olup olmadığını karşılaştıran bir formüldür. Doğal olarak, bu sonuç her zaman doğrudur. Bu nedenle, ilişkisel veritabanı, KULLANICI ADI "Ken Sato" ve ŞİFRESİ "boş" veya "'1' = '1'" olan bir kullanıcının var olduğunu kabul eder. Sonuç olarak, veritabanı sunucusu, bu kullanıcı adı için şifreyi kontrol etmeden, "Ken Sato" kullanıcı adıyla ilişkili bilgileri uygulama sunucusuna gönderir. Uygulama sunucusu, bu bilgilere dayanarak bir giriş başarı ekranı oluşturur ve bunu siber saldırganın tarayıcısına yanıt olarak gönderir.
Bu, SQL enjeksiyonunun temel mekanizmasıdır. Anlaşılması kolay bir örnek olarak web uygulaması giriş ekranını verdik, ancak SQL ifadeleri kullanılarak yapılan veritabanı işlemleri birçok uygulama fonksiyonunda kullanılmaktadır. Bu nedenle, bu saldırı yalnızca giriş ekranında değil, uygulamanın çeşitli durumlarında da başarılı olabilir.
Bunlar, SQL enjeksiyonunun neden olduğu zararı önlemek için alınacak başlıca önlemlerdir.
İlişkisel Veritabanları ve SQL
SQL enjeksiyonunun açıklamasına geçmeden önce, öncelikle ilişkisel veritabanlarını ve SQL'i açıklayalım. İlişkisel veritabanı, uygulama verilerini tablo formatında yöneten bir veritabanı türüdür. İşlemlerin (her bir sürecin) yüksek güvenilirliği nedeniyle birçok iş uygulamasında kullanılır.SQL, ilişkisel veritabanlarında işlem yapmak için kullanılan bir dildir (veritabanı dili). İşlemler genel olarak üç kategoriye ayrılır:
- Veritabanını yapılandırmak için kullanılan Veri Tanımlama Dili (DDL).
- Veri okuma ve güncelleme için Veri İşleme Dili (DML)
- Yetki gibi çeşitli kontroller için Veri Kontrol Dili (DCL).
SQL Enjeksiyon Örnekleri
Bir gün, bir siber saldırgan bir uygulamayı keşfeder ve onu saldırının hedefi haline getirir. Siber saldırganın, bu web uygulamasında "Ken Sato" adlı meşru bir kullanıcının zaten var olduğunu bildiğini varsayıyoruz. Siber saldırgan, "Ken Sato" kullanıcısı gibi davranarak yasa dışı bir şekilde giriş yapmaya çalışır. Giriş formunda, siber saldırgan Şekil 1'de gösterilen dizeyi girer. Uygulamanın bakış açısından bakıldığında, Şekil 2'de gösterilen SQL ifadesi oluşturulur. Bu SQL ifadesi ilişkisel bir veritabanında nasıl yorumlanır?Şekil 1: Siber saldırganlar tarafından kullanılan girdilere örnek
Şekil 2: Şekil 1'deki girdiden oluşturulan SQL ifadesi
İlişkisel veritabanı bu SQL ifadesini aldığında, öncelikle USERS tablosunda USER NAME'i "Ken Sato" olan bir satır arar. "Ken Sato" kullanıcı adı zaten mevcut olduğundan, ilişkisel veritabanı bir sonraki arama koşuluna geçer. Sorun da burada başlıyor.
Arama koşuluna göre, ilişkisel veritabanı, kullanıcı adı "Ken Sato" ve şifresi "boş" veya "'1' = '1'" olan bir kullanıcı arar. Birçok uygulamada şifre gerekli olduğundan, bu sefer "boş" şifreli bir kullanıcı bulunamadığını varsayalım. Peki ya "'1' = '1'"? Bu, "1" ve "1"in aynı olup olmadığını karşılaştıran bir formüldür. Doğal olarak, bu sonuç her zaman doğrudur. Bu nedenle, ilişkisel veritabanı, KULLANICI ADI "Ken Sato" ve ŞİFRESİ "boş" veya "'1' = '1'" olan bir kullanıcının var olduğunu kabul eder. Sonuç olarak, veritabanı sunucusu, bu kullanıcı adı için şifreyi kontrol etmeden, "Ken Sato" kullanıcı adıyla ilişkili bilgileri uygulama sunucusuna gönderir. Uygulama sunucusu, bu bilgilere dayanarak bir giriş başarı ekranı oluşturur ve bunu siber saldırganın tarayıcısına yanıt olarak gönderir.
Bu, SQL enjeksiyonunun temel mekanizmasıdır. Anlaşılması kolay bir örnek olarak web uygulaması giriş ekranını verdik, ancak SQL ifadeleri kullanılarak yapılan veritabanı işlemleri birçok uygulama fonksiyonunda kullanılmaktadır. Bu nedenle, bu saldırı yalnızca giriş ekranında değil, uygulamanın çeşitli durumlarında da başarılı olabilir.
SQL Enjeksiyon Saldırı Türleri
SQL enjeksiyonunun amacı ve yöntemine bağlı olarak çeşitli türleri vardır.Hata Tabanlı SQL Enjeksiyonu
Bu, uygulama yapılandırmalarını ve güvenlik açıklarını keşfetmek için kullanılan bir SQL enjeksiyon tekniğidir. Uygulamaya kasıtlı olarak geçersiz girdi girilerek bir hata oluşturulur ve hedef sistemin ayrıntıları hata mesajına göre incelenir. Bu teknik kullanılarak doğrudan veri tahrif etme veya sızdırma olasılığı düşük olsa da, siber saldırganlar bu teknikle elde edilen bilgileri, aşağıda açıklanan güvenlik açıklarını veya diğer SQL enjeksiyon saldırılarını hedef alan saldırılar başlatmak için kullanabilirler.UNION Enjeksiyonu
Bu, rastgele verilere erişmek için SQL'in bir türü olan UNION operatörünü kullanan bir SQL enjeksiyon tekniğidir. UNION operatörü, birden fazla SELECT ifadesinin sonuçlarını birleştiren bir operatördür. Bir siber saldırgan, bir uygulama tarafından verilen bir SELECT ifadesine UNION operatörüyle başlayan yeni bir SELECT ifadesi eklerse, uygulamanın amaçlamadığı verileri elde etmesi mümkün hale gelir. Saldırı başarılı olursa, siber saldırgan veritabanı tablosu düzeyinde rastgele veriler elde edebilir. Bu nedenle, SQL enjeksiyonları arasında özellikle büyük hasara yol açabilecek bir yöntemdir.Kör SQL Enjeksiyonu
Bu, bir uygulamaya SQL sorgusu gönderen ve doğrudan sonuçlar yerine davranış farklılıklarını gözlemleyerek uygulamanın yapısını inceleyen bir SQL enjeksiyon tekniğidir. Hata tabanlı SQL enjeksiyonunda olduğu gibi, bu teknik kullanılarak doğrudan veri tahrif etme veya sızdırma olasılığı düşüktür, ancak siber saldırganlar bu teknik kullanılarak elde edilen bilgileri güvenlik açıklarını hedef alan saldırılar veya diğer SQL enjeksiyon saldırıları başlatmak için kullanabilirler.İkinci Derece SQL Enjeksiyonu
Bu, siber saldırganın, yürütülme anında etkisiz olan özel olarak hazırlanmış bir SQL sorgusunu bir uygulamaya gönderip daha sonra çalıştırdığı bir SQL enjeksiyon tekniğidir. Bu teknik, doğrudan kullanıcı erişiminin beklenmediği bir ortamda yürütüldüğü için, en kötü senaryoda, veritabanı ayarlarında ve izinlerinde değişiklikler gibi veritabanı düzeyinde ihlallere yol açabilir.SQL Enjeksiyon Saldırılarını Nasıl Önleyebiliriz?
Günümüz uygulamaları çeşitli unsurlardan oluşmaktadır. Bu nedenle, her bir unsur için uygun önlemler, yani çok katmanlı bir savunma gereklidir.Bunlar, SQL enjeksiyonunun neden olduğu zararı önlemek için alınacak başlıca önlemlerdir.
Veritabanı düzeyindeki ölçümler
Veritabanı düzeyinde alınabilecek önlemlerden biri, veritabanındaki kullanıcı ayrıcalıklarını optimize etmektir. Yukarıda belirtildiği gibi, ilişkisel veritabanı işlemleri genel olarak üç kategoriye ayrılır: Veritabanını yapılandıran Veri Tanımlama Dili (DDL); verileri okuyan ve güncelleyen Veri İşleme Dili (DML); ve ayrıcalıklar gibi çeşitli kontrolleri yöneten Veri Kontrol Dili (DCL). Ancak, birçok durumda, çoğu uygulama normalde SELECT sorguları gibi DML ifadelerini kullanır. Diğer işlemler için ayrıcalıkları kısıtlayarak, istenmeyen veri silme ve ayar değişikliklerini önlemek mümkündür.Uygulama düzeyindeki önlemler
Uygulama düzeyinde çeşitli karşı önlemler mevcuttur.- Yer tutucuları kullanma
- Giriş değerlerinin doğru şekilde kaçış karakterleriyle işlenmesi
- Hataları gizle
- Paket sistemlerine yama programları uygulama
