SQL Injection

SQL Injection (SQLi), bir web uygulamasının veritabanına gönderdiği SQL sorgularına, saldırganın kötü niyetli SQL kodları enjekte etmesiyle oluşan bir güvenlik açığıdır. Bu açık sayesinde saldırgan, veritabanındaki hassas verilere erişebilir, verileri değiştirebilir, silebilir ve hatta komut çalıştırabilir.

Nasıl Çalışır?
Bir web uygulaması, kullanıcıdan aldığı girdiyi doğrudan SQL sorgusuna ekler. Örneğin:

sql
SELECT * FROM kullanicilar WHERE kullanici_adi = '$kullanici' AND sifre = '$sifre';
Eğer saldırgan kullanici alanına ' OR '1'='1 yazarsa sorgu şu hale gelir:

sql
SELECT * FROM kullanicilar WHERE kullanici_adi = '' OR '1'='1' AND sifre = '$sifre';
Bu durumda tüm kullanıcılar döner ve saldırgan sisteme giriş yapabilir.

SQL Injection Türleri:
Error-Based SQLi: Hata mesajlarından veritabanı bilgisi sızdırma.

Union-Based SQLi: UNION sorgusu ile başka tablolardan veri çekme.

Boolean-Based Blind SQLi: Sayfanın verdiği true/false cevaplarına göre veri çıkarma.

Time-Based Blind SQLi: Bekleme sürelerine göre veri sızdırma (ör: WAITFOR DELAY).

Out-of-Band SQLi: DNS veya HTTP istekleriyle veri dışarı aktarma.

Uygulama Teknikleri (Test ve Güvenlik):
Test Teknikleri:
Manuel Test:

Giriş alanlarına ' , " , ; , -- , /* karakterleri gönderin.

Hata mesajlarını inceleyin (MySQL, PostgreSQL, MSSQL hataları farklıdır).

' OR '1'='1 , ' OR 1=1-- , admin'-- gibi payload'lar deneyin.

UNION SELECT ile sütun sayısını bulmaya çalışın (ör: ' UNION SELECT NULL--).

Otomatik Test Araçları:

sqlmap: En popüler otomatik SQLi aracı. sqlmap -u "http://hedef.com/urun.php?id=1" --dbs komutuyla veritabanlarını listeleyin.

Burp Suite: Intruder modülüyle farklı payload'lar gönderin.

Havij (Windows) veya jSQL Injection (Java) kullanabilirsiniz.

Advanced Payload'lar:

sql
' UNION SELECT @@version, null, null--
' AND 1=CONVERT(int, @@version)--
' AND (SELECT COUNT(*) FROM information_schema.tables) > 0--
admin' WAITFOR DELAY '0:0:5'--
Güvenlik Teknikleri (Koruma):
Parametreli Sorgular (Prepared Statements): En etkili yöntem. Kullanıcı girdisi sorgudan ayrıştırılır.

php
$stmt = $conn->prepare("SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND sifre = ?");
$stmt->bind_param("ss", $kullanici, $sifre);
$stmt->execute();
Stored Procedures: Veritabanında saklı prosedürler kullanarak dinamik SQL'den kaçının.

Girdi Doğrulama (White List): Sayısal alanları intval() ile temizleyin, e-posta gibi alanları regex ile kontrol edin.

En Az Ayrıcalık Prensibi: Veritabanı kullanıcısına sadece gerekli yetkileri verin. INSERT, UPDATE, DELETE yetkilerini kısıtlayın.

WAF (Web Application Firewall): ModSecurity veya Cloudflare gibi çözümlerle SQLi payload'larını engelleyin.

Düzenli Tarama: Haftalık sqlmap veya Acunetix taraması yapın.

Hata Mesajlarını Gizleyin: Üretim ortamında hata mesajlarını kapatın.

php
error_reporting(0);
Veritabanı Şifreleme: Hassas verileri (kredi kartı, şifre) şifreli saklayın.

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,703Mesajlar
326,233Kullanıcılar
membiSon Üye
Üst Alt