SQL Injection Nedir?
SQL Injection, veritabanı güvenliğini ihlal etmek için kullanılan bir saldırı tekniğidir. Bu teknik, bir uygulamanın kullanıcıdan aldığı verileri doğru şekilde filtrelemediği durumlarda gerçekleşir. Saldırgan, normalde kullanıcı girişini bekleyen SQL sorgusuna zararlı SQL kodları enjekte ederek, veritabanındaki bilgileri elde edebilir, değiştirebilir veya silebilir.SQL Injection Nasıl Çalışır?
SQL Injection, kullanıcının girdiği verilerin doğrudan SQL sorgusuna eklenmesiyle çalışır. Örneğin, bir kullanıcı giriş formu düşünelim
SQL:
SELECT * FROM kullanıcılar WHERE kullanıcı_adı = 'kullanıcı' AND şifre = 'parola';
- Kullanıcı adı: kullanıcı
- Şifre: ' OR '1'='1
SQL:
SELECT * FROM kullanıcılar WHERE kullanıcı_adı = 'kullanıcı' AND şifre = '' OR '1'='1';
SQL Injection Çeşitleri
Klasik SQL Injection: Bu tür saldırılarda, veritabanı yönetim sisteminin (DBMS) çıktıları doğrudan kullanıcıya gösterilir. Saldırgan, çıktıyı kullanarak ek bilgi toplayabilir ve saldırısını genişletebilir.Blind SQL Injection: Bu tür saldırılarda, DBMS’in verdiği yanıtlar doğrudan kullanıcıya gösterilmez. Saldırgan, bu durumda evet/hayır gibi basit yanıtlar alır ve sorgusunu bu yanıtlar doğrultusunda şekillendirir.
Time Based Blind SQL Injection: Bu saldırı türünde, saldırgan belirli bir komutun çalışıp çalışmadığını kontrol etmek için veritabanı işlemlerini geciktirir. Örneğin, bir SQL sorgusunun yanıt süresi uzarsa, bu sorgunun başarılı olduğunu gösterir.
Error Based SQL Injection: Veritabanı motorunun hata mesajlarını kullanarak yapılan saldırılardır. Bu hata mesajları, veritabanı yapısı hakkında bilgi verir ve saldırganın veritabanını daha iyi anlamasına olanak tanır.
SQL Injection Saldırı Teknikleri
Birleşik (UNION) Saldırısı: Saldırgan, SQL sorgusuna UNION ifadesi ekleyerek, veritabanından başka bir tabloyu veya sorguyu birleştirir ve bu sayede başka tablolardan veri çekebilir. Örneğin
SQL:
' UNION SELECT kullanıcı_adı, şifre FROM kullanıcılar --
Kod:
' OR '1'='1
SQL:
' OR 1=1; SLEEP(5); --
SQL Injection’dan Korunma Yöntemleri
Parametrik Sorgular: SQL Injection saldırılarından korunmanın en etkili yollarından biri parametrik sorgular (prepared statements) kullanmaktır. Bu yöntem, SQL sorgularında kullanıcı girişlerini doğrudan değil, parametreler üzerinden işler. Örneğin, PHP’de PDO ile yapılan bir parametrik sorgu
PHP:
$stmt = $pdo->prepare('SELECT * FROM kullanıcılar WHERE kullanıcı_adı = ? AND şifre = ?');
$stmt->execute([$kullanıcı_adı, $şifre]);
Veri Doğrulama ve Temizleme: Kullanıcıdan alınan verilerin doğrulanması ve temizlenmesi, SQL Injection’a karşı koruma sağlar. Örneğin, bir e-posta adresinin formatı kontrol edilerek ve özel karakterler temizlenerek saldırı riski azaltılabilir.
En Az Yetki İlkesi: Veritabanı kullanıcılarına minimum yetkilerin verilmesi, bir saldırı gerçekleştiğinde zararın boyutunu azaltır. Örneğin, uygulama kullanıcıları sadece okuma iznine sahip olmalı, yazma ve silme izinleri sadece gerekli olduğunda verilmelidir.
Hata Mesajlarını Gizleme: Veritabanı hata mesajlarının kullanıcıya gösterilmemesi, saldırganın sistem hakkında bilgi toplamasını engeller. Bunun yerine, genel hata mesajları kullanılmalı ve detaylı hata bilgileri sadece loglarda tutulmalıdır.
Web Uygulama Güvenlik Duvarı (WAF): Bir WAF, SQL Injection gibi saldırıları tespit eder ve engeller. WAF, kötü niyetli sorguları filtreleyerek ve engelleyerek SQL Injection saldırılarına karşı ek bir güvenlik katmanı sağlar.
Gerçek Senaryo Örneği: SQL Injection ile Veritabanı Ele Geçirme
Senaryo: Bir E-Ticaret Sitesine Saldırı
Bir saldırgan, popüler bir e-ticaret sitesine göz atıyor ve ürünlerin listelendiği bir URL fark ediyor
HTTP:
http://shop.com/products.php?category=electronics
Web Sitesine Yapılan İstek
Saldırgan, kategori parametresinin SQL Injection’a karşı savunmasız olup olmadığını kontrol etmek için şu şekilde bir sorgu yapıyor
HTTP:
http://shop.com/products.php?category=electronics' OR '1'='1
Arka Planda Olan Senaryo
Bu sorgu, sunucuya şu SQL cümlesini gönderiyor
SQL:
SELECT * FROM ürünler WHERE kategori = 'electronics' OR '1'='1';
Saldırganın Veritabanını Ele Geçirmesi
Savunmasız noktayı bulduktan sonra saldırgan, veritabanı hakkında daha fazla bilgi edinmek için saldırısını genişletir. UNION komutunu kullanarak başka bir sorguyu mevcut sorguya ekler
HTTP:
http://shop.com/products.php?category=electronics' UNION SELECT kullanıcı_adı, şifre FROM kullanıcılar --
SQL:
SELECT * FROM ürünler WHERE kategori = 'electronics' UNION SELECT kullanıcı_adı, şifre FROM kullanıcılar;