SQL Enjeksiyonu (SQLi) Nedir?
SQL Enjeksiyonu (SQLi), saldırganların veritabanını manipüle etmek için giriş alanına kötü niyetli SQL ifadeleri girdiği bir saldırı türüdür.
Bu saldırı, doğrulama ve kullanıcı girişini düzgün bir şekilde ele alamayan ve şifre veya kredi kartı bilgileri gibi hassas verilere yetkisiz erişime izin veren uygulamaları hedef alır.
SQL Enjeksiyonu Nasıl Çalışır
Bir uygulama, kullanıcı girişini uygun doğrulama olmadan doğrudan bir veritabanı sorgusuna dahil ettiğinde, saldırganlar sorgunun davranışını değiştirerek kötü niyetli bir SQL ifadesi girebilir.
Örneğin:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
Bir saldırgan şunu girebilir:
' OR '1'='1
Sonuç olarak:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Bu her zaman doğru döner ve yetkisiz erişim sağlar.
Siber Güvenlikte SQL Enjeksiyonunun Önemi
SQL Enjeksiyonu, siber güvenlikteki en tehlikeli ve en eski tekniktir. Bu tür saldırılar, sürekli olarak OWASP İlk 10 listesinde yer almaktadır.
Küçük güvenlik açıkları bile bir saldırgana şunları yapma imkanı tanır:
- Verilere erişim, değiştirme veya silme
- Kimlik doğrulamayı atlatma
- Veritabanında yönetimsel işlemler yürütme.
- Tüm sistemi tehlikeye atma.
Yaygın SQL Enjeksiyonu Türleri
- Klasik SQLi : Web formları veya URL parametreleri aracılığıyla doğrudan enjeksiyon.
- Kör SQLi : Saldırganlar veritabanı bilgilerini dolaylı olarak çıkarır (örneğin, hata mesajları veya yanıt süresi aracılığıyla).
- Birleşim Tabanlı SQLi : Birden fazla sorgunun sonuçlarını birleştirmek için UNION operatörünü kullanır.
- Hata Tabanlı SQLi : Bilgi çıkarmak için veritabanı hata mesajlarına dayanır.
- Zaman Tabanlı Kör SQLi : Sorgu sonuçlarını tahmin etmek için sunucu yanıt gecikmelerini kullanır.
SQL Enjeksiyonunu Önleme Yöntemleri
1. Parametreli Sorgular (Hazırlanmış İfadeler) Kullanın
SQL komutlarının kullanıcı girdisini veri olarak, yürütülebilir kod olarak değil, ele almasını sağlayın.
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. Girdi Doğrulama ve Temizleme
Kullanıcılardan gelen tüm girdileri doğrulayın, yalnızca beklenen karakterlere izin verin.
3. ORM Çerçeveleri Kullanın
Prisma, Hibernate gibi çerçeveler doğrudan SQL işlemlerini azaltır.
4. En Az Ayrıcalık İlkesi
Kullanıcı izinlerini sınırlayın, yalnızca gerekli izinleri verin.
5. Düzenli Güvenlik Testleri
Uygulama güvenliği test araçları olarak SAST, DAST veya IAST kullanarak enjeksiyon açıklarını erken tespit edin.
Gerçek Dünyada Örnek
Bir çevrimiçi mağaza web sitesi, saldırganların bir giriş formunda SQL enjeksiyonu kullanarak veritabanından kredi kartı bilgilerini çıkardığı bir ihlal yaşadı.