Kötü Amaçlı Yazılım & Saldırılar

SQL Enjeksiyonu

👤 Güvenlik Uzmanı1/35 dk
İnteraktif sahne yükleniyor…
🎯 Neden önemli?

Tek bir arama kutusuna yazılan ' OR '1'='1 gibi birkaç karakter, koca bir veritabanındaki tüm kullanıcı parolalarını saldırgana açabilir — SQL Enjeksiyonu yıllardır web uygulamalarındaki en yıkıcı açıkların başında gelir.

Giriş

Merhaba, ben Güvenlik Uzmanı. Bu kartta SQL Enjeksiyonunu (SQL Injection / SQLi) öğreniyoruz: ne olduğunu, saldırganın veritabanı sorgusunu nasıl ele geçirdiğini ve iş yerinde bunu önlemek için ne yapmamız gerektiğini ele alacağız.

Anlatım

NEDİR? SQL Enjeksiyonu (SQL Injection / SQLi), bir uygulamanın kullanıcıdan aldığı girdiyi (form alanı, URL parametresi, çerez, HTTP başlığı) doğrudan SQL sorgusuna yapıştırması sonucu ortaya çıkan bir güvenlik açığıdır. Saldırgan, girdiye özel SQL karakterleri/komutları yazarak uygulamanın oluşturduğu sorgunun MANTIĞINI değiştirir. Sonuçta veritabanı, geliştiricinin değil saldırganın istediği sorguyu çalıştırır. OWASP'ın yıllardır en kritik web açıkları listesinde (Injection) yer alır. NASIL ÇALIŞIR? 1) Uygulama, sorguyu metin birleştirmeyle kurar. Örn: "SELECT * FROM users WHERE name = '" + girdi + "'". 2) Saldırgan girdi olarak ' OR '1'='1 yazar. 3) Oluşan sorgu şuna döner: SELECT * FROM users WHERE name = '' OR '1'='1'. '1'='1' her zaman doğru olduğundan WHERE koşulu daima sağlanır ve tüm kayıtlar döner. 4) Tek tırnak ('), veritabanına "metin burada bitti, bundan sonrası komuttur" der; saldırgan bu sınırı kırarak veri ile komutu birbirine karıştırır. 5) Daha ileri tekniklerde saldırgan UNION SELECT ile başka tablolardan veri çeker, hata mesajlarından bilgi sızdırır (error-based), evet/hayır cevaplarıyla körlemesine veri okur (blind SQLi) veya sorgunun yanıt süresini ölçerek bilgi çıkarır (time-based blind). NEDEN ÖNEMLİ / İŞ YERİNDE Başarılı bir SQLi ile saldırgan: tüm kullanıcı tablosunu (e-posta, parola özetleri, kişisel veri) okuyabilir, kayıtları değiştirip silebilir, kimlik doğrulamayı atlayıp yönetici olarak giriş yapabilir ve bazı durumlarda işletim sistemi komutu çalıştırarak sunucuyu ele geçirebilir. Bu, doğrudan veri ihlali, KVKK/GDPR yaptırımı, itibar kaybı ve hizmet kesintisi demektir. Geliştirici, sıralama uzmanı veya destek ekibinde olun — kullanıcı girdisinin asla güvenilir olmadığını bilmek herkesin işidir. DİKKAT / İYİ UYGULAMA • Parametreli sorgu (prepared statement) / bağlı parametre kullanın: kullanıcı girdisi VERİ olarak gönderilir, asla KOMUT olarak yorumlanmaz — SQLi'ye karşı birincil ve en etkili savunma budur. • Mümkünse güvenli bir ORM veya saklı yordam (stored procedure) kullanın. • Girdi doğrulama (whitelist) ve çıktı kodlama ekleyin; ancak bunlar parametreli sorgunun YERİNE değil, yanına gelir. • En az yetki ilkesi: uygulamanın veritabanı kullanıcısına sadece gereken yetkiyi verin (gereksiz DROP/yönetici hakkı vermeyin). • Ek savunma katmanı olarak WAF (Web Uygulama Güvenlik Duvarı) yaygın SQLi desenlerini engelleyebilir; ama tek başına yeterli değildir. • Ayrıntılı veritabanı hata mesajlarını kullanıcıya göstermeyin (saldırgana ipucu verir).

📌 Senaryolar
📌 Örnek 1 (Kimlik doğrulama atlatma): Bir giriş formunda kullanıcı adı alanına admin' -- yazılır. Açıklama: Uygulama sorguyu "SELECT * FROM users WHERE user='" + girdi + "' AND pass='" + parola + "'" şeklinde kurar. Girdiyle sorgu "...WHERE user='admin' --' AND pass='...'" olur. SQL'de -- yorum işaretidir ve satırın geri kalanını (parola kontrolünü) iptal eder. Sonuç: parola hiç doğrulanmadan admin hesabıyla giriş yapılır.
📌 Örnek 2 (UNION ile veri sızdırma): Bir ürün arama sayfasında id parametresine 1 UNION SELECT username, password FROM users -- gönderilir. Açıklama: Asıl sorgu ürün bilgisi döndürürken, UNION SELECT saldırganın seçtiği users tablosundaki kullanıcı adı ve parola sütunlarını aynı sonuç kümesine ekler. Sayfa, ürün verisinin yanında kullanıcı kimlik bilgilerini ekranda gösterir. Bu, en yaygın veri-hırsızlığı (in-band UNION-based) tekniğidir.
📌 Örnek 3 (Parametreli sorgu ile önleme): Aynı arama, prepared statement ile yazılır: cursor.execute("SELECT * FROM users WHERE name = ?", (girdi,)). Açıklama: Burada ? yer tutucusudur; veritabanı sürücüsü sorgu metnini ÖNCE derler, kullanıcı girdisini SONRA yalnızca veri olarak bağlar. Girdi ' OR '1'='1 olsa bile, bu metin name sütununda aranan düz bir değer sayılır — komut olarak çalışmaz. SQLi denemesi başarısız olur. Bu yöntem, dilden bağımsız (Python, Java, PHP, .NET) birincil savunmadır.
Özet

• SQL Enjeksiyonu: kullanıcı girdisinin doğrudan SQL sorgusuna karışıp sorgu mantığını değiştirmesidir. • ' OR '1'='1, -- ve UNION SELECT gibi yüklerle kimlik doğrulama atlatma ve veri sızdırma yapılır. • Sonuçları ağırdır: veri ihlali, yetki yükseltme, hatta sunucunun ele geçirilmesi. • Birincil savunma parametreli sorgu/prepared statement'tır; en az yetki, girdi doğrulama ve WAF ek katmanlardır.

✅ Mini-Test (3)
1.SQL Enjeksiyonu açığının temel nedeni aşağıdakilerden hangisidir?
2.SQL Enjeksiyonuna karşı en etkili birincil savunma hangisidir?
3.Başarılı bir SQL Enjeksiyonu saldırısı, kimlik doğrulamayı atlatmaya veya tüm kullanıcı tablosunu okumaya yol açabilir.
← Tüm sözlük terimleri · Farkındalık eğitimi