Malatya DENEYAP

🔐 SQL Injection Laboratuvarı

Ortaokul Siber Güvenlik Dersi

Eğitmen: Hakan TOPTAŞ

📚 Malatya DENEYAP — SQL Injection Ders Notları

Öğretmen ve öğrenciler için adım adım rehber.

Hazırlayan: Hakan TOPTAŞ

1️⃣ Temel Kavram: SQL Sorgusu

Normal bir giriş kontrolü şöyle çalışır:

-- Kullanıcı "admin" ve "12345" girdiğinde:
SELECT * FROM kullanicilar
WHERE kullanici_adi = 'admin'
AND sifre = '12345'

Veritabanı bu sorguyu çalıştırır. Eşleşen kayıt varsa giriş başarılı olur.

2️⃣ Sorun: Güvensiz Kod

Güvensiz sitede kullanıcının yazdığı metin doğrudan SQL'e eklenir:

$sql = "SELECT * FROM kullanicilar WHERE kullanici_adi = '' . $_POST['kullanici'] . "' AND sifre = '' . $_POST['sifre'] . "'";

Saldırgan, kullanıcı adı kutusuna SQL komutu gibi davranan özel bir metin yazarsa sorgu değişir!

3️⃣ Deneme 1: Giriş Sayfası (login.php)

Zafiyetli Kullanıcı adı alanına şunu yazın:

⚡ Sorgu nasıl değişiyor?

-- Kullanıcı adına ' OR '1'='1 yazıldığında:
SELECT * FROM kullanicilar
WHERE kullanici_adi = '' OR '1'='1' AND sifre = '...'

-- '1'='1' her zaman DOĞRU → tüm kullanıcılar eşleşir!

4️⃣ Deneme 2: Arama Sayfası (search.php)

Zafiyetli Arama kutusuna şunları deneyin:

Veritabanı adı, tablo ve alan keşfi için Veritabanı Keşif modülüne bakın.

5️⃣ Veritabanı Yapısını Keşfetme

İleri seviye saldırıda önce veritabanının yapısı öğrenilir. Bu laboratuvarda Veritabanı Eğitimi modülünde adım adım anlatılmıştır:

  1. Veritabanı adını bul (database())
  2. Tabloları listele (information_schema.tables)
  3. Sütunları keşfet (information_schema.columns)
  4. Hassas veriyi çek (şifreler, gizli notlar)

6️⃣ Sınıfta Anlatım Önerisi

  1. Önce normal giriş yapın (ogrenci1 / 12345) — her şey normal görünsün
  2. "Peki şifreyi bilmeden girebilir miyiz?" diye sorun
  3. Sayfanın altındaki "Çalışan SQL Sorgusu" kutusunu gösterin
  4. İlk payload'ı birlikte yazın: ' OR '1'='1
  5. Sorgunun nasıl değiştiğini satır satır açıklayın
  6. Güvenli versiyonu (guvenli.php) karşılaştırın
  7. Etik hacking konusunu konuşun: Sadece izinli sistemlerde test!

7️⃣ Nasıl Korunulur?

✅ Hazırlanmış Sorgular (Prepared Statements)

$stmt = $pdo->prepare("SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND sifre = ?");
$stmt->execute([$kullanici, $sifre]);

Kullanıcı girdisi asla SQL komutu olarak yorumlanmaz — sadece veri olarak işlenir.

✅ Diğer Önlemler

⚖️ Etik ve Yasal Uyarı

Bu teknikleri sadece kendi laboratuvarınızda veya yazılı izin aldığınız sistemlerde kullanın. Başkasının sitesine izinsiz saldırmak suçtur ve ciddi cezaları vardır.

Siber güvenlik uzmanları (etik hackerlar) bu bilgiyi sistemleri korumak için kullanır — saldırmak için değil!