Web hayatımıza girmeye başladığında, gördüğümüz, kullandığımız web sitelerini oluşturmak görece daha kolaydı. Ancak web siteleri popülerlik kazandıkça daha gelişmiş siteler ortaya çıktı. Gelişen web siteleri ise kullanıcı verilerini, site içeriklerini veritabanlarında depoladı. Depolarken de bir veri tabanı uygulaması olan Structured Query Language (SQL) adı verilen Yapılandırılmış Sorgu Dili kullanılmaya başlandı.
Dünya çapında birçok veri tabanı SQL ile ilişkili olmakla birlikte, siber tehdit aktörlerinin de gözünden hiç kaçmadı. SQL ortaya çıktığından beri siber tehdit aktörlerinin veri çalmak için en sık kullandığı saldırılardan biri SQL Injection oldu. Öyle ki, OWASP’ın (Açık Web Uygulama Güvenliği Projesi) günümüzün web uygulamalarına yönelik en ciddi tehditleri listelediği top 10 sıralamasında SQL Injection uzun yıllardır ilk on içerisinde yer almasının yanında 2021 yılında dahi bu sıralamadaki yerini koruyor.
Öyleyse bu yazıda SQL ve SQL Injection’a yakından bakmak, ne olduğunu, kısa tarihini, teknik ayrıntılarını, ne amaçla kullanıldığını ve nasıl önlenebileceğini anlatmaya çalışalım.
Kolay Erişim
KISA WEB TARİHİNDEN SQL’E ÇIKAN YOL
1980’li ve 90’lı yıllardan başlayarak dünya, webin ve kişisel bilgisayarların hayatımıza girişine tanıklık etti. AOL, CompuServe, Juno ve diğer birçok şirket bilgi portalları ve web ağ geçitleri sağlamaya başladı. Böylelikle bilgi çağı doğarken, bilgi güvenliği de hayatımıza girmiş oldu.
İnsanlar, interneti keşfederken, yavaş yavaş birçok web sitesi oluşmaya başladı. İlk web siteleri statik metin ve resimler içerirken, webin popülerleşmesiyle arkasındaki teknoloji de gelişerek dinamik webleri ortaya çıkardı. HTML, CSS ve JavaScript ile gelişen süreç, çeşitli programlama dilleriyle birlikte devam etti. Birçok “Yapılandırılmış Sorgu Dili” gidip gelse de ilk olarak ABD hükümetine ait proje olarak 1970’lerde ortaya çıkan SQL, kullanımının yaygınlaşmasıyla giderek popülerleşti.
SQL NEDİR? NE İŞE YARAR?
SQL, genel olarak veri tabanı yönetiminin mihenk taşlarından birisidir. Veri tabanlarında bulunan verileri yöneten, işleyen, kontrol eden, sorgulayan SQL, veri tabanına ihtiyaç duyulan hemen her sektörde kullanılabilir. Özellikle SQL, web sitesi geliştirmek isteyenlerin vazgeçilmezidir.
SQL’in temel hedefi, verilerin ve veri kümelerinin modellenmesidir. Büyük boyutlu verileri bile birkaç işlemle işleyen SQL ile, veri tabanında var olan verileri kaydedebilir, veri tabanına yeni veriler işleyebilir, verilerin tamamını güncelleyebilir, sorgulama ve arama yapabilir, verileri silebilir, veri kayıtlarını yeniden oluşturabilir, veri tabanına ait yeni tablolar yaratabilir, veri tabanlarına kimlerin ulaşabileceğini ayarlayabilirsiniz. Bu anlamda SQL, sistemi birçok işlemi mümkün kılar. Tabii aynı zamanda da ‘veri hırsızlığı’nın da vazgeçilmez unsuru olarak karşımıza çıkar.
SİBER TEHDİT AKTÖRLERİNİN GÖZ BEBEĞİ SQL Injection NEDİR?
OWASP’ın tanımlamasıyla Injection, “güvenilmeyen verinin bir yorumlayıcı programa komut veya sorgu olarak iletilmesi”dir. SQL Injection da bu anlamda siber tehdit aktörlerinin SQL sorgularına müdahale etmesiyle gerçekleşen bir güvenlik açığı olarak bilinir.
SQL Injection saldırılarında bilinen yaygın risk, oturum açma bilgilerinin, kimlik bilgilerinin, e-posta adreslerinin çalınmasıdır. Bu veriler ise dark web’de satışa çıkarılarak siber tehdit aktörlerinin bir kazanç biçimine dönüştürülür.
SQL Injection NASIL GERÇEKLEŞTİRİLİR?
Çok uzun bir süredir OWASP’ın top 10 listesinde yer alan, bununla birlikte en eski güvenlik açıklarından biri olan SQL Injection, istemciden uygulamaya giriş verileri aracılığıyla bir SQL sorgusunun eklenmesiyle gerçekleştirilir.
SQL komutları, önceden tanımlanmış SQL komutlarının yürütülmesini etkileyen veri düzlemi girişine bulaştırılır. Dikkat ve koordinasyon gerektiren DDoS saldırılarıyla karşılaştırıldığında SQL Injection saldırısı, daha çok sabır, deneme yanılma, yaratıcılık ve biraz da şans gerektirir. Çok fazla beceri gerektirmeyen SQL Injection saldırısı tek bir bilgisayarda gerçekleştirebilir.
Oracle, SQL Server veya MySQL gibi SQL veri tabanları bir web sitesi veya uygulamasında kullanılıyorsa, SQL Injection saldırısına karşı savunmasız kalabilir. SQL Injection zafiyetini istismar eden saldırganlar, SQL veri tabanının içeriğini ele geçirebilir, değiştirebilir veya silebilir. Üstelik saldırganlar bu açığı kullanarak uygulamanın veri tabanında yönetici yetkisine sahip olabilir.
SQL Injection YOLLARI
Bunların yanı sıra SQL Injection saldırısı gerçekleştirmek için farklı yollar bulunur. Bunlar arasında aşağıdaki yollar yer alır:
- Kullanıcı girişine dayalı SQL Injection
- Çerezlere dayalı SQL Injection
- HTTP başlıklarına dayalı SQL Injection
- İkinci dereceden SQL Injection
Kullanıcı girişine dayalı SQL Injection, genellikle web uygulamalarının kullanıcı girdilerini incelemediği durumlarda ortaya çıkar. Normalde uygulama, kullanıcı girdilerini formlar aracılığıyla incelenip kabul ederken, söz konusu durumda bu girdiler incelenmeyerek kabul edilir.
Çerezlere dayalı SQL Injection ise, siber tehdit aktörlerinin kullanıcı veya kullanıcının cihazına zararlı yazılım dağıtmasına denir.
Web uygulamasının HTTP başlıklarından girdileri kabul ettiği durumda, rastgele SQL içeren sahte başlıklar veri tabanına kod ekleyebilir. Böylece HTTP başlıklarına dayalı SQL Injection ortaya çıkmış olur.
İkinci dereceden SQL Injection ise hem iyi hem de kötü amaçla kullanılabilen ‘zehirli’ veriler sunmasıyla bilinir.
Geleneksel parola ele geçirme tekniği: Brute force nedir, nasıl gerçekleştirilir?
FARKLI SQL Injection GÜVENLİK AÇIĞI TÜRLERİ
Saldırganlar, SQL Injection güvenlik açıklarından çeşitli şekillerde yararlanarak sunuculardan veri sızdırabilir. Yaygın yöntemler arasında “Hata tabanlı (error-based), Boole tabanlı, Zamana dayalı (time-based) ve Bant dışı SQL Injection” bulunur.
Hata tabanlı SQL Injection:
Tehdit aktörleri, hata tabanlı bir SQL Injection zafiyetini istismar ederken, görünür veritabanı hatalarından tablo adları ve içerik gibi bilgileri alabilir. Üretim sistemlerinde hata mesajlarının devre dışı bırakılması, saldırganların bu tür bilgileri toplamasını önlemeye yardımcı olur.
Boole tabanlı SQL Injection:
Bazen bir SQL sorgusu başarısız olduğunda sayfada görünür bir hata mesajı olmaz. Bu durum saldırganın güvenlik açığı bulunan uygulamadan bilgi almasını zorlaştırır. Ancak yine de bilgi çıkarmanın bir yolu vardır.
Bir SQL sorgusu başarısız olduğunda, bazen web sayfasının bazı bölümleri kaybolur, değişir ya da web sitesinin tamamı yüklenemeyebilir. Bu göstergeler, saldırganların giriş parametresinin savunmasız olup olmadığını ve verilerin çıkarılmasına izin verip vermediğini belirlemesine olanak tanır.
Saldırganlar, bir SQL sorgusuna bir koşul ekleyerek bu durumu test edebilirler. Sayfa her zamanki gibi yüklenirse, bir SQL Injection’a karşı savunmasız olduğunu gösterebilir.
Zamana dayalı SQL Injection:
Bazı durumlarda güvenlik açığı bulunan bir SQL sorgusunun, sayfanın çıktısı üzerinde görünür bir etkisi olmamasına rağmen temeldeki bir veri tabanından bilgi çıkarmak mümkün olabilir.
Tehdit aktörleri bunu, veri tabanına yanıt vermeden (uyku) talimatı vererek belirler. Sayfa savunmasız değilse, hızlı bir şekilde yüklenir; savunmasızsa, yüklenmesi normalden daha uzun sürer. Bu, sayfada görünür bir değişiklik olmamasına rağmen saldırganların verileri çıkarmasını sağlar.
Bant dışı SQL Injection:
Bazen bir saldırganın bir veri tabanından bilgi alabilmesinin tek yolu bant dışı teknikleri kullanmaktır. Genellikle bu tür saldırılar, verilerin doğrudan veri tabanı sunucusundan saldırgan tarafından kontrol edilen bir makineye gönderilmesini içerir.
SQL Injection SALDIRILARINA NEDEN OLAN ETMENLER
SQL Injection saldırılarına olanak sağlayan çeşitli etmenler bulunur. Verileri savunmasız kılan bu yaklaşımların değişmesi, SQL Injection saldırılarından en az hasarla atlatmanın ön koşuludur.
Örneğin veri tabanları yöneticilerine verilen yetkiler veya ayrıcalıkların sınırlandırılmamış olması, SQL Injection saldırısı gerçekleştiren herhangi bir saldırganın yönetici yetkisine sahip olmasıyla sonuçlanabilir.
Tüm verilerin aynı veri tabanında depolanması da yine kötü bir şekilde sonuçlanabilir. Elinizdeki tüm parayı evinizde saklamak ne kadar mantıklı değilse, hassas bilgileri, finans bilgileri, kişisel bilgileri aynı veri tabanında bulundurmak da siber tehdit aktörlerinin eline yağ sürmektir.
SQL Injection SALDIRILARI NASIL ÖNLENİR?
SQL Injection saldırılarını engellemenin tek bir geçerli yolu vardır. Bu da giriş doğrulaması ve hazırlanmış ifadeleri içeren parametreli sorguları içerir. Tek tırnak gibi kötü amaçlı kod öğelerinin de kaldırılması gerekir. Bunların yanında hata görünürlüğünü kapatmak da yardımcı etmenlerdendir.
SQL zafiyetlerini engellemek pek kolay olmasa da atılabilecek önemli adımlar mevcuttur.
Özetleyecek olursak:
- Farkındalığınızı artırın
- Kullanıcı girdilerine güvenmeyin
- Katı beyaz listeler kullanıp filtreleyin
- Son teknolojileri ve doğrulanmış mekanizmalar kullanın
- Düzenli taramalar yapın