Eğitim SQL Injection Nedir ve Nasıl Kullanılır

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';
Eğer bu sorgu, kullanıcı girişinden alınan verileri doğrudan alıyorsa ve herhangi bir doğrulama yapılmıyorsa, saldırgan şu şekilde bir giriş yapabilir:
  • Kullanıcı adı: kullanıcı
  • Şifre: ' OR '1'='1
Bu durumda SQL sorgusu şöyle olur
SQL:
SELECT * FROM kullanıcılar WHERE kullanıcı_adı = 'kullanıcı' AND şifre = '' OR '1'='1';
Bu sorguda '1'='1' her zaman doğru olduğundan, veritabanı tüm kullanıcıları döndürebilir ve saldırgan sisteme giriş yapabilir.

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 --
String Manipülasyonu: Saldırgan, SQL sorgusundaki string ifadeleri manipüle ederek sorgunun mantığını değiştirir. Örneğin
Kod:
' OR '1'='1
Zaman Tabanlı Saldırılar: SQL sorgusuna SLEEP() gibi bir fonksiyon ekleyerek, sorgunun ne kadar sürdüğüne bakılır ve sorgunun çalışıp çalışmadığı anlaşılır. Örneğin
SQL:
' OR 1=1; SLEEP(5); --
Bu sorgu, veritabanı sunucusunu 5 saniye boyunca uyutacak ve böylece saldırgan, SQL Injection’ın başarılı olup olmadığını anlayacaktır.

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]);
Bu yaklaşım, SQL kodu ve kullanıcı girişi arasındaki ayrımı sağlar, böylece zararlı kodlar çalıştırılamaz.

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
Bu URL, veritabanından belirli bir kategorideki ürünleri çekmek için kullanılıyor.

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';
Bu SQL cümlesi, OR '1'='1' ifadesi sayesinde, kategori ne olursa olsun tüm ürünlerin döndürülmesine neden olur. Saldırgan, sonuçlarda tüm ürünlerin listelendiğini gördüğünde bu noktanın SQL Injection'a karşı savunmasız olduğunu anlar.

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 --
Bu sorgu, sunucuya şu SQL cümlesini gönderir
SQL:
SELECT * FROM ürünler WHERE kategori = 'electronics' UNION SELECT kullanıcı_adı, şifre FROM kullanıcılar;
Bu sorgunun sonucu olarak, veritabanında bulunan kullanıcıların adları ve şifreleri saldırgana gösterilir. Saldırgan bu bilgileri kullanarak sisteme yönetici olarak giriş yapabilir ve e-ticaret sitesinin tüm veritabanını ele geçirebilir.

Sonuç

Bu senaryoda, saldırgan basit bir SQL Injection saldırısıyla e-ticaret sitesinin veritabanını ele geçirmiştir. Eğer site, parametrik sorgular veya veri doğrulama yöntemleri kullansaydı, bu saldırı engellenebilirdi.
 
Geri
Üst