SQL Injection (SQL Enjeksiyonu), web uygulamalarının kullandığı veritabanı sorgularını manipüle ederek yetkisiz veri erişimi, veri manipülasyonu veya tam sistem ele geçirme amacıyla kullanılan bir siber sızma yöntemidir. SQL enjeksiyonu, genellikle kullanıcıdan alınan girdi doğru bir şekilde doğrulanmadığında ortaya çıkar.
Örnek: Bir login formunda kullanıcı adı ve şifre alanı vardır. Kullanıcıdan gelen bu bilgiler doğrulanmadan SQL sorgusuna eklenirse, bir siber saldırgan bu açığı kullanabilir.
SQL Injection Saldırı Türleri
Doğrudan SQL sorgusuna zarar verici komutları eklemeye dayanır.
Örnek: Kullanıcı giriş formunda giriş sorgusu:
Eğer "kullanici" yerine admin' -- girilirse:
Saldırgan, sistemden doğrudan geri dönüs alamasada "doğru/yanlış" üzerinden ilerler.
Örnek:
Bu mantıkla sistemdeki tablo yapıları ve veri yapısı öğrenilebilir.
Birden fazla sorguyu birleştirerek sistemden veri sızdırma.
Örnek:
Bu sorgu mevcut veritabanı adını ve kullanıcı bilgilerini döndürebilir.
Hata mesajları kullanılarak sistemle ilgili bilgi edinme.Örnek:
Bu sorgu, SQL motorunun "CONVERT" hatası üretmesine neden olarak yapı hakkında ipucu verir.
Senaryo: Bir e-ticaret sitesindeki arama kutusunda SQL enjeksiyonu denemesi.
Hedef Sorgu:
Saldırgan Girdisi: test' OR '1'='1
Son Sorgu:
Bu sorgu, "1=1" her zaman doğru olduğu için tüm ürünleri listeleyecektir.
Parametreli Sorgular Kullanmın: Kullanıcı girdisini doğrudan SQL sorgusuna eklemek yerine "Prepared Statements" kullanın.
Örnek:
Girdi Doğrulama: Kullanıcıdan gelen her türlü girdiyi sanitize edin.
Hata Mesajlarını Gizleme: Sistem iç yapısını belli eden hata mesajlarını son kullanıcıya göstermeyin.
Minimum Yetki Prensibi: Veritabanı kullanıcılarına minimum yetki atayın.
Web Uygulama Güvenlik Duvarı (WAF): SQL Injection denemelerini algılayarak engelleyen bir WAF kullanın.
Örnek: Bir login formunda kullanıcı adı ve şifre alanı vardır. Kullanıcıdan gelen bu bilgiler doğrulanmadan SQL sorgusuna eklenirse, bir siber saldırgan bu açığı kullanabilir.
SQL Injection Saldırı Türleri
1. Classic SQL Injection:
Doğrudan SQL sorgusuna zarar verici komutları eklemeye dayanır.
Örnek: Kullanıcı giriş formunda giriş sorgusu:
Kod:
SELECT * FROM users WHERE username = 'kullanici' AND password = 'sifre';
Eğer "kullanici" yerine admin' -- girilirse:
Kod:
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'sifre';
2. Blind SQL Injection (Kör SQL Enjeksiyonu):
Saldırgan, sistemden doğrudan geri dönüs alamasada "doğru/yanlış" üzerinden ilerler.
Örnek:
Kod:
SELECT * FROM users WHERE id = 1 AND 1=1; -- Dönüs: TRUE
SELECT * FROM users WHERE id = 1 AND 1=2; -- Dönüs: FALSE
Bu mantıkla sistemdeki tablo yapıları ve veri yapısı öğrenilebilir.
3. Union-Based SQL Injection:
Birden fazla sorguyu birleştirerek sistemden veri sızdırma.
Örnek:
Kod:
SELECT username, password FROM users WHERE id = 1 UNION SELECT database(), user();
Bu sorgu mevcut veritabanı adını ve kullanıcı bilgilerini döndürebilir.
4. Error-Based SQL Injection:
Hata mesajları kullanılarak sistemle ilgili bilgi edinme.Örnek:
Kod:
SELECT * FROM users WHERE id = 1 AND 1=CONVERT(int, 'abc');
Bu sorgu, SQL motorunun "CONVERT" hatası üretmesine neden olarak yapı hakkında ipucu verir.
SQL Injection Örnek Senaryosu
Senaryo: Bir e-ticaret sitesindeki arama kutusunda SQL enjeksiyonu denemesi.
Hedef Sorgu:
Kod:
SELECT * FROM products WHERE name = 'girdi';
Saldırgan Girdisi: test' OR '1'='1
Son Sorgu:
Kod:
SELECT * FROM products WHERE name = 'test' OR '1'='1';
Bu sorgu, "1=1" her zaman doğru olduğu için tüm ürünleri listeleyecektir.
SQL Injection'a Karşı Alınabilecek Önlemler
Parametreli Sorgular Kullanmın: Kullanıcı girdisini doğrudan SQL sorgusuna eklemek yerine "Prepared Statements" kullanın.
Örnek:
Kod:
cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))
Girdi Doğrulama: Kullanıcıdan gelen her türlü girdiyi sanitize edin.
Hata Mesajlarını Gizleme: Sistem iç yapısını belli eden hata mesajlarını son kullanıcıya göstermeyin.
Minimum Yetki Prensibi: Veritabanı kullanıcılarına minimum yetki atayın.
Web Uygulama Güvenlik Duvarı (WAF): SQL Injection denemelerini algılayarak engelleyen bir WAF kullanın.