SQL Injection Nedir? Nasıl Korunulur?

SQL Injection Nedir?

SQL Injection (SQL Enjeksiyonu), bir saldırganın bir web uygulamasındaki güvenlik açıklarından faydalanarak kötü niyetli SQL sorguları çalıştırmasına olanak tanıyan bir saldırı türüdür. Bu tür saldırılar, veritabanına yetkisiz erişim sağlamaktan, hassas bilgileri çalmaya, verileri değiştirmeye veya tamamen silmeye kadar ciddi güvenlik tehditleri oluşturabilir.

download SQL Injection Nedir? Nasıl Korunulur?

SQL Injection Nasıl Çalışır?

SQL Injection saldırıları, genellikle kullanıcı giriş formları veya URL parametreleri aracılığıyla gerçekleşir. Saldırganlar, veritabanı sorgularının içine kötü niyetli SQL komutları ekleyerek yetkisiz işlemler yapabilir. Örneğin, bir web sitesi aşağıdaki gibi bir SQL sorgusu kullanıyorsa:

SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "';

Burada username ve password değerleri doğrudan kullanıcıdan alınmaktadır. Eğer bir saldırgan aşağıdaki gibi bir giriş yaparsa:

Username: ' OR '1'='1
Password: ' OR '1'='1

Sorgu şu hale gelir:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';

Bu durumda, 1=1 ifadesi her zaman doğru olacağından saldırgan, herhangi bir geçerli kullanıcı adı ve şifre girmeden sisteme giriş yapabilir.

SQL Injection Çeşitleri

1. Klasik SQL Injection

Saldırganın giriş formlarına SQL komutları enjekte ederek veritabanı üzerinde değişiklik yapmasını veya veri çekmesini sağlayan temel saldırı yöntemidir.

2. Blind SQL Injection (Kör SQL Enjeksiyonu)

Web uygulamalarında hata mesajları gösterilmediğinde kullanılır. Saldırgan, sistemin tepkisini analiz ederek veritabanı hakkında bilgi edinmeye çalışır.

3. Time-Based SQL Injection

Veritabanının yanıt süresine dayanarak yapılan saldırıdır. Örneğin, SQL sorgusuna SLEEP(5) eklenerek sistemin tepkisi gözlemlenir.

4. Union-Based SQL Injection

Birleştirme (UNION) işlemi ile saldırganın farklı veritabanı tablolarından veri çekmesini sağlayan saldırıdır.

5. Error-Based SQL Injection

Hata mesajları üzerinden veri sızdırma yöntemidir. Örneğin, yanlış bir sorgu gönderildiğinde veritabanının döndürdüğü hata mesajları saldırganlara ipucu verebilir.

SQL Injection’a Karşı Alınabilecek Önlemler

SQL Injection saldırılarından korunmak için aşağıdaki güvenlik önlemleri alınmalıdır:

1. Hazırlıklı (Parameterized) Sorgular Kullanmak

Kullanıcı girdileri doğrudan SQL sorgularına eklenmemeli, yerine hazırlıklı ifadeler (Prepared Statements) kullanılmalıdır. Örneğin, PHP ve MySQL için:

$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();

Bu yöntemle, kullanıcı girişleri doğrudan SQL ifadesinin içine yerleştirilmez ve enjeksiyon saldırıları engellenir.

2. ORM Kullanımı

ORM (Object-Relational Mapping) kütüphaneleri, SQL sorgularını otomatik olarak oluşturduğu için doğrudan SQL Injection riskini azaltır. Örneğin, Python’da SQLAlchemy kullanımı:

user = session.query(User).filter_by(username=username).first()

3. Giriş Verilerini Doğrulamak ve Temizlemek

Kullanıcının girdiği veriler kesinlikle filtrelenmeli ve özel karakterler temizlenmelidir. Örneğin:

  • E-posta adresleri için belirli format kontrolü yapılmalı
  • Yalnızca beklenen veri türleri kabul edilmeli (Örneğin, sayısal değerler is_numeric() ile kontrol edilebilir)

4. Minimum Yetkilendirme Kullanmak

Veritabanı kullanıcılarına minimum yetki verilmelidir. Web uygulamasının kullandığı veritabanı kullanıcı hesabının yalnızca gerekli izinlere sahip olması sağlanmalıdır.

5. Web Güvenlik Duvarı (WAF) Kullanmak

Bir Web Application Firewall (WAF) kullanarak, SQL Injection saldırıları tespit edilip engellenebilir. Örneğin, ModSecurity gibi açık kaynaklı WAF çözümleri kullanılabilir.

6. Hata Mesajlarını Gizlemek

Hata mesajlarında veritabanı detaylarının gösterilmesi engellenmelidir. Bunun yerine kullanıcıya sadece genel hata mesajları gösterilmelidir.

7. Güvenlik Testleri ve Penetrasyon Testleri Yapmak

Web uygulamalarına düzenli olarak güvenlik testleri uygulanmalı ve SQL Injection testleri yapılmalıdır. SQLMap gibi otomatik araçlar saldırıları tespit etmek için kullanılabilir.

Sonuç

SQL Injection, ciddi güvenlik açıkları yaratabilen tehlikeli bir saldırı türüdür. Ancak, güvenli kod yazma uygulamalarına dikkat edilerek ve gerekli güvenlik önlemleri alınarak bu tür saldırılardan korunmak mümkündür. Veritabanı sorgularında hazırlıklı ifadeler kullanmak, giriş verilerini doğrulamak ve minimum yetkilendirme prensibini benimsemek, SQL Injection saldırılarından korunmada temel yaklaşımlar arasında yer almaktadır. Güvenliği sağlamak için sürekli testler ve güncellemeler yapılmalı, en iyi uygulamalar takip edilmelidir.