Selam TurkTeam, BlueTornado ile devam.
SQL Injection (SQLi), uygulamanın SQL sorgusunu kullanıcı girdisiyle güvensiz biçimde birleştirmesi sonucu ortaya çıkan klasik bir enjeksiyon zafiyetidir. Bu rehberde sıfırdan teori, DVWA üzerinde Low/Medium/Impossible karşılaştırması, parametreli sorgular ve modern ORM hatalarını ele alıyoruz. Tüm örnekler yalnızca yerel lab içindir.
Konuda Anlatılacaklar
- SQL Injection nedir, hangi riskleri taşır?
- DVWA lab kurulumu
- Kavramlar: union, boolean, error-based, blind
- Low seviyede adım adım gözlem
- Medium filtre ve prepared statement'a geçiş
- Korunma: parametreli sorgu, ORM, least privilege
- İleri seviye: second-order, WAF yanılsaması
- Kaynakça ve yasal uyarı
1) SQL Injection Nedir?
Veritabanı, uygulamanın gönderdiği SQL metnini yorumlar. Saldırgan, girdi alanına SQL sözdizimi parçaları ekleyerek sorgunun mantığını değiştirebiliyorsa injection vardır.
# Tehlikeli kalıp (kavramsal)
id = request.GET["id"]
sql = "SELECT first_name, last_name FROM users WHERE user_id = '" + id + "'"
# id = 1' OR '1'='1 olduğunda mantık bozulurOlası etkiler: kimlik doğrulamayı atlama, veri okuma/değiştirme, bazı DB/konfigürasyonlarda OS komutuna giden yollar (ör. xp_cmdshell gibi özellikler açıksa). Etki, DB kullanıcısının yetkisine ve uygulama mimarisine bağlıdır.
OWASP Top 10 2021'de Injection A03:2021 altındadır. CWE karşılığı başlıca CWE-89'dur.
2) Lab Kurulumu
git clone https://github.com/digininja/DVWA.git
cd DVWA
docker compose up -dKurulum sonrası DVWA Security'yi Low yapın. SQL Injection ve SQL Injection (Blind) sayfalarını kullanacağız.
[center][/center]
İsteğe bağlı olarak kendi MySQL/MariaDB labınızda da aynı mantığı kurabilirsiniz; önemli olan üretim verisine dokunmamaktır.
3) Kavram Referansı
In-band (Union / Error): Sonuç veya hata mesajı aynı kanalda döner.
# Union temelli keşif (yalnızca lab, sözdizimi DB'ye göre değişir)
1' UNION SELECT null, null--
1' UNION SELECT user(), database()--Boolean-based blind: Sayfa içeriği doğru/yanlış cevaba göre değişir; veri bit bit çıkarılır.
1' AND 1=1--
1' AND 1=2--Time-based blind:
SLEEP()WAITFOR DELAY# MySQL lab örneği (kendi DVWA'nız)
1' AND SLEEP(3)--Prepared statement / parametreli sorgu: SQL yapısı ile verinin ayrılması. Asıl savunma budur.
# Python psycopg / MySQL connector tarzı
cur.execute("SELECT * FROM users WHERE id = %s", (user_id,))4) DVWA Low: Adım Adım
Adım 1 - Normal davranış:
User ID: 1
# Beklenen: o kullanıcıya ait ad/soyadAdım 2 - Mantığı bozma:
1' OR '1'='1
# Low seviyede genellikle birden fazla satır dönerÇıktıyı yorumlayın: Uygulama girdi etrafına tırnak koyup birleştiriyorsa bu payload tüm satırları getirir. Bu, zafiyetin varlığını gösterir.
[center][/center]
Adım 3 - Sütun sayısını anlama (Union):
DVWA Low'da klasik union yolu kullanılır. Önce sütun sayısını bulun:
1' ORDER BY 1--
1' ORDER BY 2--
1' ORDER BY 3--
# Hata aldığınız nokta sütun sayısını aştığınız yerdir1' UNION SELECT user, password FROM users--
# Labda hash'lerin görünmesi, üretimde felaket senaryosudurAdım 4 - Hata mesajlarını okuma:
Verbose SQL hataları hem enjeksiyonu kolaylaştırır hem bilgi sızdırır. Production'da genel hata sayfası kullanın; detayı loglayın.
# Kötü: ham SQL exception'ı kullanıcıya göstermek
# İyi: "Bir hata oluştu" + sunucu tarafı log5) Blind SQLi Sayfası
DVWA SQL Injection (Blind) sayfasında sonuç satırları doğrudan basılmayabilir; "User ID exists" benzeri mesajlar görürsünüz.
1' AND '1'='1
1' AND '1'='2Birinde "exists", diğerinde farklı mesaj varsa boolean blind mümkündür. Otomatik araçlar (sqlmap) bu farkları ölçer; yalnızca kendi labınızda ve yasal kapsamda kullanın.
# sqlmap lab örneği (DVWA localhost, kendi ortamınız)
sqlmap -u "http://127.0.0.1/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \
--cookie="security=low; PHPSESSID=..." \
--batch --technique=Bsqlmap çıktısını yorumlarken: DBMS tipi, baner, tablolar. Üretimde izinsiz sqlmap çalıştırmak hem etik dışıdır hem yasadışıdır.
[center][/center]
6) Medium ve Impossible: Ne Değişiyor?
Medium'da DVWA genelde POST + mysql_real_escape_string benzeri kaçış veya seçim kutusu kullanır. Escape, yanlış bağlamda (ör. sayısal alan, farklı karakter seti) yeterli olmayabilir; asıl çözüm prepared statement'tır.
Impossible seviyede parametreli sorgu görürsünüz. Kaynak kodu (DVWA PHP) inceleyerek farkı not edin:
# Kavramsal güvenli PHP
$stmt = $mysqli->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?");
$stmt->bind_param("s", $id);
$stmt->execute();# ORM örneği (Django)
User.objects.filter(id=user_id)
# Dikkat: raw() / extra() ile tekrar injection açabilirsiniz7) Korunma Katmanları
- Birincil: Parametreli sorgu / ORM güvenli API
- Girdi doğrulama: Beklenen tip (int), uzunluk, allowlist
- Least privilege: Uygulama DB kullanıcısına DROP/FILE vermeyin
- Hata yönetimi: Detaylı SQL hatalarını gizleyin
- WAF: Savunma derinliği; tek başına çözüm değil
- Test: SAST, DAST, kod incelemesi, unit test ile raw SQL denetimi
# Beklenen tip kontrolü
if not user_id.isdigit():
abort(400)# PostgreSQL rol örneği (kavramsal)
GRANT SELECT, INSERT, UPDATE ON app_schema.* TO app_user;
-- FILE, SUPERUSER yok[center][/center]
8) İleri Seviye
Second-order SQLi: Girdi önce güvenli saklanır, sonra başka bir sorguda güvensiz birleştirilir.
ORM / query builder tuzakları:
# Tehlikeli: kullanıcı girdisini SQL parçası sanmak
User.objects.raw("SELECT * FROM users WHERE name = '%s'" % name)NoSQL injection: MongoDB'de operatör enjeksiyonu (
$gtRapor şablonu:
Bulgu: SQL Injection (CWE-89)
Endpoint: GET /vulnerabilities/sqli?id=
Kanıt: Labda OR '1'='1 ile çoklu satır
Etki: users tablosu okuma (lab)
Öneri: prepared statement + least privilege9) Sonuç
SQLi, girdinin sorgu yapısına karışmasıdır. DVWA Low'da görün, Impossible'da doğru kodu okuyun, kendi projelerinizde raw string birleştirmeyi yasaklayın. Araçlar yardımcı olur; kök neden kod ve tasarımda kalır.
Kaynakça
- OWASP SQL Injection
- OWASP SQLi Prevention Cheat Sheet
- DVWA
- sqlmap resmi site
- CWE-89
- OWASP Top 10 2021 A03 Injection
Yasal Uyarı
SQL Injection testleri yalnızca kendi sistemlerinizde veya yazılı izinli lab/pentest kapsamında yapılmalıdır. İzinsiz veritabanı sorgulama ve araç kullanımı TCK 243, 244, 245 maddeleri kapsamında suç olabilir. Bu yazı eğitim amaçlıdır; sorumluluk uygulayana aittir.