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:
- Kullanıcı bir form doldurur (login, arama, filtre vb.)
- Girilen veri doğrudan SQL sorgusuna eklenir
- 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'='1Ortaya çı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

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 SELECTifadesi 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.