SQL Injection Nedir?

SQL Injection, kötü niyetli kullanıcıların bir web sitesinin veri tabanına doğrudan erişim sağlamaya çalıştığı, en bilinen güvenlik açıklarından biridir.

Adından da anlaşılacağı gibi bu saldırı, SQL (Structured Query Language) komutlarını “enjeksiyon” yoluyla sisteme dahil ederek gerçekleştirilir.

Amaç: Veri çalmak, kullanıcı bilgilerini görmek, sisteme zarar vermek…

Örnek Senaryo

Diyelim ki sitende şu tarz bir URL mevcut:

https://mucahitakin.com/blog.php?id=2

Bu URL, blog.php dosyasının id=2 olan içeriği veritabanından çekip göstermesi anlamına gelir.

// zayıf (savunmasız) örnek
$id = $_GET['id'];
$sql = "SELECT * FROM blog WHERE id = $id";
$result = mysqli_query($conn, $sql);

Eğer yukarıdaki gibi doğrudan GET parametresi SQL sorgusuna ekleniyorsa, büyük tehlike var demektir.

SQL Injection Denemesi:

Kötü niyetli biri URL’yi şu hale getirirse:

https://mucahitakin.com/blog.php?id=2 OR 1=1

Sorgu şu hale dönüşür:

SELECT * FROM blog WHERE id = 2 OR 1=1;

Bu durumda veritabanındaki tüm içerikler dönebilir. Daha kötüsü:

https://mucahitakin.com/blog.php?id=0 UNION SELECT username, password FROM users

Eğer tablo yapın uygunsa, bu saldırı ile admin kullanıcılarının bilgileri bile çekilebilir.

SQL Injection ile Neler Yapılabilir?

Yapılabilecek ŞeyAçıklama
Tüm kullanıcıları listelemeUNION SELECT kullanılarak
Admin şifresini görmeSHA-1, MD5 hash çalma
Veri silmeDELETE FROM … enjeksiyonu ile
Tüm veritabanını keşfetmeinformation_schema.tables kullanılarak

Güvenli Kodlama Nasıl Yapılır?

1. Hazırlanmış (Prepared) Sorgular Kullan

// Güvenli PDO örneği
$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM blog WHERE id = ?");
$stmt->execute([$id]);

2. Veri doğrulaması yap

$id = (int)$_GET['id']; // sadece sayıya izin ver

3. ORM sistemleri kullan

Laravel, Symfony gibi framework’ler varsayılan olarak SQL Injection’a karşı güvenlidir:

$blog = Blog::find($id);

Güvenlik Testi: SQL Açığı Var mı?

Senin siten mucahitakin.com üzerinde güvenlik taraması veya test için OWASP ZAP, Burp Suite veya basit curl ile yapılan bazı testler şunlar olabilir:

curl "https://mucahitakin.com/blog.php?id=1 OR 1=1"

Ya da HTML form üzerinden şu tarz payloadlar denenebilir:

' OR '1'='1
' UNION SELECT null, username, password FROM users --

UYARI: Bu testler, kendi siten dışında yapılırsa yasa dışıdır!

Kendi sitende test yapman tamamen yasal ve teşvik edilen bir davranıştır.

🔍 SQL Injection Nasıl Tespit Edilir?

  1. URL’deki parametrelerle oynayarak beklenmeyen içeriklerin gelmesi
  2. Log dosyalarında olağandışı SQL hata mesajlarının görülmesi
  3. Güvenlik tarayıcıları (ZAP, sqlmap, etc.)
  4. Web uygulama güvenlik duvarları (WAF) loglarında anormal sorgular

✅ Güvenlik Kontrol Listesi

KontrolDurum
Hazırlanmış sorgular kullanılıyor mu?
Kullanıcı girişi filtreleniyor mu?
Hatalar kullanıcıya gösterilmiyor mu?
Formlarda CAPTCHA kullanılıyor mu?⚠️
WAF veya IDS aktif mi?⚠️

Sql Güvende mi?

Eğer sitende yukarıda anlattığım gibi doğrudan parametre ile SQL sorgusu yapılıyorsa, ciddi risk altındasın.

Ama eğer Laravel gibi modern framework’ler kullanıyorsan, çoğu zaman varsayılan olarak bu tür saldırılara karşı koruma altındasın.

SQL Injection Test Script

// test-sql.php
$url = "https://mucahitakin.com/blog.php?id=1%20OR%201=1";
$html = file_get_contents($url);
if (strpos($html, 'tüm içerik') !== false) {
    echo "SQL Injection açığı olabilir!";
} else {
    echo "Muhtemelen güvenli.";
}

SQL Injection, küçük bir ihmalin çok büyük sonuçlara yol açabileceği bir güvenlik açığıdır.

Login Sayfası

Login sayfasında kullanıcıdan alınan username ve password hemen hemen aşağıdaki sorguya benzer yapılar ile çalışmaktadır.

SELECT * FROM users WHERE username = 'INPUT' and password='md5(INPUT)' LIMIT 1;

Her username ve password ikilisinin uniq olması beklenir. Herhangi bir durum olursa uygulamanın hata vermemesi için LIMIT ile dönen sonuç sınırlandırılır.

Bu yapıda saldırgan olarak sorguyu manipüle edebileceğimiz 1 adet değişken mevcuttur. Şifre alanına yazılacak her payloadın md5 alınacağı için sorgu içerisinde [a-f][0-9] ‘dan ibaret bir string oluşacaktır. Bu nedenle sql injection saldırısı username üzerinden gerçekleşmek durumundadır.

Blind SQLi saldırıları gerçekleştirirken <,  > , = gibi karakterleri kullanırız. Bu karakter ise hedef uygulamada YASAKLI durumdadır. username değişkeni içerisinde bu karakterlerden herhangi biri varsa yazılım otamatik olarak ilgili karakteri kaldırmaktadır.

Unutma: Güvenlik, geliştirmenin en önemli parçasıdır.

Kaynakça : https://www.mehmetince.net/spesifik-sql-injection-zafiyetlerinin-sqlmap-ile-exploit-edilmesi/

Leave a Reply

Your email address will not be published. Required fields are marked *