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.
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.
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).
• 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.