SQL Injection (SQLi), bir web uygulamasının veritabanı ile iletişim kurarken kullanıcıdan aldığı girdileri yeterince filtrelememesi sonucu ortaya çıkan kritik bir güvenlik açığıdır. Bu açık sayesinde saldırgan, uygulamanın arka planda çalıştırdığı SQL sorgularını manipüle edebilir.

Basitçe söylemek gerekirse:

  • Kullanıcının sadece "veri" girmesi gereken bir alana, SQL komutu yazabilmesidir

SQL Injection Nasıl Çalışır?

Bir web uygulamasında genellikle şu senaryo vardır:

  1. Kullanıcı bir form doldurur (login, arama, filtre vb.)
  2. Girilen veri doğrudan SQL sorgusuna eklenir
  3. Veritabanı bu sorguyu çalıştırır

Güvensiz bir örnek:

SELECT * FROM users WHERE username = '$username' AND password = '$password';

Eğer uygulama girdi kontrolü yapmıyorsa, saldırgan şunu yazabilir:

' OR '1'='1

Ortaya çıkan sorgu:

SELECT * FROM users WHERE username = '' OR '1'='1';

Bu sorgu her zaman doğru olduğu için:

  • Giriş yapılabilir
  • Yetkisiz erişim sağlanır

SQL Injection ile Neler Yapılabilir?

Bir SQL Injection açığı çok ciddi sonuçlara yol açabilir:

  • 🔓 Login bypass (şifresiz giriş)
  • 📄 Veritabanındaki tüm tabloları listeleme
  • 👤 Kullanıcı bilgilerini çalma
  • 🔑 Admin yetkisi kazanma
  • 🧨 Veritabanını silme veya değiştirme

Bu yüzden SQL Injection, OWASP Top 10 listesinde yıllardır üst sıralarda yer alır.

SQL Injection Türleri

None

1️. In-Band SQL Injection

In-Band SQLi, saldırganın gönderdiği payload ile aldığı cevabın aynı kanal üzerinden gerçekleştiği en yaygın SQLi türüdür.

Avantajı:

  • En kolay tespit edilen
  • En hızlı sömürülebilen tür

— Error-Based SQL Injection

Bu yöntemde:

  • Veritabanı hata mesajları üretir
  • Hata mesajları doğrudan kullanıcıya gösterilir

Saldırgan bu hataları kullanarak:

  • Tablo adlarını
  • Kolon isimlerini
  • Veritabanı türünü

öğrenebilir.

Örnek mantık:

' AND 1=CONVERT(int, (SELECT @@version))--

➡ Eğer uygulama hata bastırmıyorsa, bu yöntem işe yaramaz.

— Union-Based SQL Injection

Bu yöntemde:

  • UNION SELECT ifadesi kullanılır
  • Mevcut sorguya ek sonuçlar eklenir

Amaç:

  • Veritabanından ekstra veri çekmek

Örnek mantık:

' UNION SELECT username, password FROM users--

Başarılı olabilmesi için:

  • Kolon sayısı uyumlu olmalı
  • Veri tipleri uyuşmalı

➡ Bu yüzden genelde önce column count discovery yapılır.

2️. Blind SQL Injection

Blind SQLi, uygulamanın hata mesajı veya veri çıktısı vermediği durumlarda kullanılır.

Saldırgan:

  • Sadece uygulamanın davranışını gözlemler
  • "Doğru mu / yanlış mı?" mantığıyla ilerler

— Boolean-Based Blind SQL Injection

Bu yöntemde:

  • Koşul doğruysa sayfa normal döner
  • Koşul yanlışsa sayfa farklı davranır

Örnek:

' AND 1=1--
' AND 1=2-

Fark:

  • Sayfa içeriği değişiyorsa → SQLi vardır

➡ Veri bit bit (karakter karakter) çıkarılır.

— Time-Based Blind SQL Injection

Bu yöntemde:

  • Veritabanına bilinçli gecikme eklenir
  • Sayfanın cevap süresi ölçülü

Örnek:

' AND IF(1=1, SLEEP(5), 0)--

Eğer:

  • Sayfa 5 saniye geç dönüyorsa → koşul doğru

➡ En yavaş ama en güvenilir Blind SQLi türüdür.

3️. Out-of-Band SQL Injection

Out-of-Band (OOB) SQLi, veri sızdırmanın farklı bir kanal üzerinden yapıldığı nadir bir yöntemdir.

Kullanıldığı durumlar:

  • In-band çalışmıyorsa
  • Blind SQLi çok yavaşsa

Veri sızdırma yolları:

  • DNS request
  • HTTP request
  • External server bağlantısı

Örnek senaryo:

  • Veritabanı saldırganın sunucusuna DNS isteği atar
  • Veri bu istek içinde taşınır

➡ Genelde: MSSQL, Oracle gibi güçlü DB'lerde görülür

SQL Enjeksiyonuna Karşı Koruma Yöntemleri

  • Prepared Statements (Parametrized Queries) Kullanıcı girdisi ile SQL sorgusu ayrılır. En etkili çözümdür.

Prepared Statements (Parametrized Queries) Kullanıcı girdisi ile SQL sorgusu ayrılır. En etkili çözümdür.

  • Input Validation Kullanıcıdan gelen veriler tür ve format açısından kontrol edilir.
  • ORM Kullanımı Doğrudan SQL yazmayı azaltır, yanlış kullanımda risk geri döner.
  • Least Privilege Veritabanı kullanıcısına sadece gerekli yetkiler verilir.
  • Hata Mesajlarını Gizleme Veritabanı hataları kullanıcıya gösterilmez.
  • WAF (Web Application Firewall) Bilinen SQLi payload'larını engeller, ek güvenlik katmanıdır.