Uygun SQL komut yürütmesi ile yetkisiz kullanıcı, daha ayrıcalıklı bir kullanıcının kimliğini taklit edebilir, kendilerini veya başkalarını veritabanı yöneticileri yapabilir, mevcut veriler üzerinde değişiklik yapabilir, işlemleri ve bakiyeleri değiştirebilir ve tüm sunucu verilerini alabilir ve/veya yok edebilir.
Modern bilgi işlemde, SQL enjeksiyonu, genellikle bir web sitesi veya hizmet tarafından sağlanan bir API uç noktasına kötü amaçlı SQL sorguları göndererek İnternet üzerinden gerçekleşir (bundan daha fazla bahsedeceğiz). En şiddetli biçiminde, SQL enjeksiyonu, bir saldırganın bir makineye kök erişimi elde etmesine izin vererek, onlara tam kontrol sağlar.
*SQL, çoğu veritabanını korumak için kullanılan bir programlama dilidir.
SQL enjeksiyon saldırısı nasıl çalışır?
Bob adında bir adamın yargılanmakta ve yargıç önüne çıkmak üzere olduğu bir mahkeme salonu düşünün. Bob, duruşmadan önce evrakları doldururken adını “Bob gitmekte özgür” olarak yazar. Yargıç davasına ulaştığında ve yüksek sesle “Şimdi Bob’u aramak serbesttir” ifadesini okuduğunda, icra memuru Bob’un gitmesine izin verir çünkü yargıç öyle dedi.
SQLi’nin biraz farklı çeşitleri olsa da, temel güvenlik açığı temelde aynıdır: Sayı gibi belirli bir veri türü için ayrılması gereken bir SQL sorgu alanı, bunun yerine komut gibi beklenmeyen bilgiler iletilir. Komut, çalıştırıldığında, amaçlanan sınırların ötesine geçerek potansiyel olarak hain davranışlara izin verir. Bir sorgu alanı, genellikle bir web sayfasındaki bir forma girilen verilerden doldurulur.
Normal ve kötü niyetli SQL ifadeleri arasındaki basit bir karşılaştırmaya bakalım:
Normal SQL sorgusu:
Bu normal SQL sorgusunda, StudentId dizesi bir SQL deyimine geçirilir. Amaç, girilen öğrenci kimliğiyle eşleşen bir öğrenci için öğrenci listesine bakmaktır. Bulunduğunda, o öğrencinin kaydı iade edilecektir. Basitçe söylemek gerekirse, komut “git bu kullanıcıyı bul ve bana verilerini ver” diyor.
Kod şöyle görünebilir:
studentId = getRequestString("studentId"); lookupStudent = "SELECT * FROM students WHERE studentId = " + studentId
Bir öğrenci, ‘Lütfen öğrenci kimlik numaranızı girin’ etiketli bir web sayfası formuna 117 öğrenci kimliği girerse
ortaya çıkan SQL sorgusu şöyle görünecektir:
SELECT * FROM students WHERE studentId = 117;
Bu komut, API’yi yazan geliştiricinin olmasını beklediği öğrenci kimliğine sahip belirli bir öğrencinin kaydını döndürür.
SQL Enjeksiyon sorgusu:
Bu örnekte, saldırgan bunun yerine giriş alanına bir SQL komutu veya koşullu mantık girer, öğrenci kimlik numarasını şu şekilde girer:
Normalde sorgunun eşleşen kimlik için veritabanı tablosunda arama yaptığı yerde, şimdi bir kimlik arar veya 1’in 1’e eşit olup olmadığını görmek için testler yapar. Tahmin edebileceğiniz gibi, ifade sütundaki her öğrenci için her zaman doğrudur ve Sonuç olarak, veritabanı öğrenci tablosundaki tüm verileri sorguyu yapan saldırgana geri döndürür.
SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQLi, savunmasız bir Uygulama Programlama Arayüzü veya API’sini hedefleyerek çalışır. Bu durumda bir API, bir sunucunun istekleri aldığı ve yanıtladığı yazılım arayüzüdür.
Kötü niyetli bir aktörün, formları arayan bir web sitesinde otomatik olarak arama yapmasına ve ardından web sitesinin yazılım geliştiricilerinin veritabanından yararlanmak için amaçlamadığı bir yanıt üretebilecek çeşitli SQL sorguları girmeye çalışmasına izin veren yaygın olarak kullanılan araçlar mevcuttur.
SQL enjeksiyonlarının uygulanması kolaydır ve ilginç bir şekilde, uygun geliştirme uygulamaları göz önüne alındığında önlenmesi de oldukça kolaydır. Sıkı teslim tarihleri, deneyimsiz geliştiriciler ve eski kodlar genellikle değişken kod kalitesi ve güvenlik uygulamalarıyla sonuçlandığından, gerçek daha karanlıktır. Veritabanına erişimi olan bir web sitesindeki herhangi bir formdaki veya API uç noktasındaki tek bir güvenlik açığı bulunan alan, bir güvenlik açığını ortaya çıkarmak için yeterli olabilir.
SQL Enjeksiyon saldırısı nasıl önlenir?
SQL enjeksiyonu nedeniyle veri ihlali riskini azaltmak için birçok yöntem vardır . En iyi uygulama olarak, birkaç strateji kullanılmalıdır. Daha yaygın uygulamalardan birkaçını inceleyelim:
- Hazırlanan İfadelerin Kullanımı (Parametreli Sorgularla) – Bu veritabanı girdilerini sterilize etme yöntemi, geliştiricileri önce tüm SQL kodunu tanımlamaya ve ardından SQL sorgusuna yalnızca belirli parametreleri iletmeye zorlamayı içerir; girilen verilere açıkça ötesine genişletilemeyecekleri sınırlı bir kapsam verilir. Bu, veritabanının, giriş alanında sağlanan veri türünden bağımsız olarak, girilen veriler ile çalıştırılacak kod arasında ayrım yapmasına olanak tanır. Bazı sürümler veritabanı girişlerini otomatik olarak sterilize edeceğinden, bazı nesne-ilişkisel eşleme (ORM) kitaplıkları bu amaç için yaygın olarak kullanılır.
- Kullanıcı Tarafından Sağlanan Tüm Girişlerden Kaçış – SQL yazarken, belirli karakterler veya kelimelerin belirli bir anlamı vardır. Örneğin, ‘*’ karakteri “herhangi biri” anlamına gelir ve “VEYA” kelimeleri koşulludur. Veritabanına yapılan bir API isteğine yanlışlıkla veya kötü niyetli olarak bu karakterleri giren kullanıcıları engellemek için, kullanıcı tarafından sağlanan girdiden kaçınılabilir. Bir karakterden kaçmak, veritabanına onu bir komut veya koşullu olarak ayrıştırmamasını, bunun yerine onu değişmez girdi olarak ele almasını söylemenin yoludur.
- Saklı Prosedürlerin Kullanımı – Kendi başına sağlam bir güvenlik stratejisi olmasa da, saklı prosedürler SQL enjeksiyonuyla ilişkili riski sınırlamaya yardımcı olabilir. SQL sorguları çalıştıran veritabanı hesabının izinlerini uygun şekilde sınırlayarak, SQL enjeksiyonuna karşı savunmasız olan sağlam olmayan uygulama kodu bile, alakasız veritabanı tablolarını işlemek için gerekli izinlerden yoksun olacaktır. Saklı yordamlar, giriş parametrelerinin türünü de kontrol ederek, alanın almak üzere tasarlandığı türü ihlal eden verilerin girilmesini önleyebilir. Statik sorguların yetersiz olduğu durumlarda, saklı yordamlardan genellikle kaçınılmalıdır.
- En Az Ayrıcalığı Zorla – Genel bir kural olarak, bir web sitesinin dinamik SQL kullanması gereken tüm durumlarda, izinleri ilgili sorguyu yürütmek için gereken en dar kapsamla sınırlayarak SQL enjeksiyonuna maruz kalmayı azaltmak önemlidir. En belirgin biçimiyle bu, bir yönetici hesabının hiçbir durumda yetkisiz bir istekten gelen bir API çağrısının sonucu olarak SQL komutları yürütmemesi gerektiği anlamına gelir. Statik sorgular için saklı yordamlar en iyi şekilde kullanılırken, en az ayrıcalık uygulamak, dinamik SQL sorgularının risklerini azaltmaya yardımcı olabilir.
Bileşik SQL enjeksiyon saldırısı nedir?
Güvenlik önlemlerini atlatmak için akıllı saldırganlar bazen hedeflenen bir web sitesine çok vektörlü saldırılar uygular. Tek bir saldırı hafifletilebilirken, aynı zamanda veritabanı yöneticileri ve bilgi güvenliği ekiplerinin ilgi odağı haline gelebilir. DDoS saldırıları , DNS ele geçirme ve diğer bozulma yöntemleri bazen kapsamlı SQL enjeksiyon saldırılarını uygulamak için dikkati dağıtmak için kullanılır. Sonuç olarak, kapsamlı bir tehdit azaltma stratejisi, en geniş koruma yelpazesini sağlar. Cloudflare’nin web uygulaması güvenlik duvarı , DDoS azaltma ve DNS güvenliği , bütünsel bir güvenlik stratejisinin temel öğelerini oluşturur.