SQL Injection (SQL Enjeksiyonu), bir web uygulamasına veya veritabanına zarar vermek veya izinsiz erişim sağlamak amacıyla kötü niyetli kullanıcıların SQL sorgularını manipüle etmeleriyle gerçekleştirilen bir saldırı türüdür. Bu tür bir saldırı, genellikle kullanıcıdan alınan verilerin doğru şekilde doğrulanmadığı ve filtrelenmediği durumlarda ortaya çıkar.
SQL Injection Nasıl Çalışır?
Bir SQL Injection saldırısının temel prensibi, uygulamanın kullanıcıdan aldığı verileri doğrudan SQL sorgularında kullanmasıdır. Bu durumda, saldırgan, kullanıcı girdisini manipüle ederek kötü niyetli SQL kodları ekleyebilir. Bu sayede, saldırgan:
- Veritabanındaki verileri görüntüleyebilir veya değiştirebilir.
- Sistemdeki kullanıcı bilgilerine (örneğin, şifreler) erişebilir.
- Veritabanındaki tablolarda silme, güncelleme veya ekleme işlemleri yapabilir.
- Veritabanına zarar vererek verileri bozabilir veya silinebilir.
Örnek Senaryo:
Bir kullanıcı, giriş yapmak için bir web formuna kullanıcı adı ve şifre girer. Eğer bu giriş verileri, SQL sorgusuna doğrudan eklenirse, saldırgan şu şekilde bir manipülasyon yapabilir:
Örneğin, eğer web uygulaması şu SQL sorgusunu kullanıyorsa:
sqlKopyalaDüzenleSELECT * FROM users WHERE username = 'USER' AND password = 'PASS';
Bir saldırgan, kullanıcı adı yerine şu gibi bir girdi verebilir:
sqlKopyalaDüzenle' OR '1' = '1
Ve şifreyi boş bırakabilir. Bu durumda, sorgu şu hale gelir:
sqlKopyalaDüzenleSELECT * FROM users WHERE username = '' OR '1' = '1' AND password = '';
Buradaki '1' = '1' ifadesi her zaman doğru olacağı için, bu sorgu tüm kullanıcı bilgilerini (veya veritabanındaki tüm verileri) döndürebilir.
SQL Injection Türleri:
- In-Band SQL Injection:
- Bu türde, saldırgan veritabanından doğrudan veri alabilir. Örneğin, hata mesajları üzerinden bilgi toplama (Error-based SQL Injection) veya zamanlamalı sorgular (Time-based Blind SQL Injection) gibi yöntemler kullanılır.
- Blind SQL Injection:
- Saldırgan, doğrudan veritabanından veri almasa da, uygulamanın verdiği yanıtları inceleyerek veri sızdırabilir. Blind SQL Injection, genellikle başarılı olup olmadığını anlamak için zamanlı (timing) veya mantıksal (boolean) testler kullanır.
- Out-of-Band SQL Injection:
- Bu tür, saldırganın doğrudan veritabanından veriyi almasına izin vermez, fakat başka bir kanaldan (örneğin DNS isteği) veri sızdırabilir.
SQL Injection’a Karşı Alınabilecek Önlemler:
- Parametreli Sorgular (Prepared Statements):
- Veritabanı sorgularında parametreli sorgular kullanmak, kullanıcı verilerini doğrudan sorguya eklemek yerine, verilerin bir parametre olarak gönderilmesini sağlar. Bu yöntem SQL Injection’ı engeller.
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); $stmt->execute(['username' => $username, 'password' => $password]); - Veri Doğrulama ve Filtreleme:
- Kullanıcı girdileri her zaman doğrulanmalı ve filtrelenmelidir. Sayılar, e-posta adresleri, vb. için özel doğrulama yapılabilir. Böylece zararlı veri girişlerinin önüne geçilebilir.
- Stored Procedures (Depolanan Prosedürler):
- Depolanan prosedürler, veritabanı üzerinde belirli işlemleri gerçekleştiren güvenli ve parametreli sorgulardır.
- Hata Mesajlarını Gizleme:
- Veritabanı hata mesajları kullanıcıya gösterilmemeli, çünkü bu mesajlar, saldırganların sistem hakkında bilgi edinmesine yardımcı olabilir. Hatalar loglanmalı, fakat kullanıcılara sadece genel hata mesajları gösterilmelidir.
- Erişim Kontrolleri ve Privilijler:
- Veritabanı hesaplarının, yalnızca gerekli işlemleri gerçekleştirebilecek yetkilere sahip olduğundan emin olunmalıdır. Her kullanıcının yalnızca ihtiyaç duyduğu verilere erişimi olmalıdır.
- Web Application Firewall (WAF) Kullanımı:
- Web uygulama güvenlik duvarları, SQL Injection gibi saldırılara karşı uygulama seviyesinde koruma sağlayabilir.
Sonuç:
SQL Injection, ciddi güvenlik açıklarına yol açabilecek ve sistemleri tehlikeye atabilecek bir saldırı türüdür. Bu tür saldırılara karşı korunmak için doğru güvenlik önlemleri alınmalı, kullanıcı girdileri dikkatlice işlenmeli ve uygulamalar sürekli olarak güvenlik testlerinden geçirilmelidir.














Bir Cevap Yazın