SQL Inject on Ned r?
SQL Inject on, kullanıcı g rd s n n SQL cümles ne ham şek lde eklenmes sonucu saldırganın
sorgunun mantığını değ şt rmes ne veya yen sorgular çalıştırmasına z n veren uygulama katmanı
güvenl k açığıdır.
Nasıl gerçekleş r?
Uygulama: SQL şablonu + kullanıcı_g rd s → ver tabanına gönder r.
Saldırgan: kullanıcı_g rd s ne SQL sözd z m ekleyerek şablonun anlamını değ şt r r.
Sonuç: yetk s z okuma, değ şt rme, s lme veya şlet m s stem düzey nde ek etk ler.
Adım adım, gerçek b r örnek
Varsayılan uygulama kodu (kırılgan, pseudo-code):
nput_username = kullanıcıdan_al()
nput_password = kullanıcıdan_al()
sql = "SELECT * FROM users WHERE username = '" + nput_username + "' AND password = '" +
nput_password + "';"
[Link](sql)
Normal çalışmada (kullanıcı: ertugrul, parola:12345):
SELECT * FROM users WHERE username = ' ertugrul ' AND password = '12345';
sorgu doğru kullanıcıyı döndürür.
Saldırgan username alanına şu g rd y yazar:
‘ OR ‘1’=’1’ --
Sorgu met n b rleş m sonrası:
SELECT * FROM users WHERE username = '' OR '1'='1' -- ' AND password = '...';
Açıklama:
'' OR '1'='1' kısmı her zaman true olur
-- şaret SQL yorum satırı; ger kalan AND password = ... kısmı görmezden gel n r.
Sonuç: sorgu, lk bulunan (veya tüm) kullanıcı satırlarını döner, k ml k doğrulama
atlatılmıştır.
Kaynak : [Link] .com/2076-3417/15/2/571
Örnek
Örnek
Toplu SQL İfadeler ne Dayalı SQL Inject on
Toplu SQL fadeler (ör. SQL1; SQL2;) ver tabanı motorunun aynı çağrıda b rden fazla komutu
çalıştırmasına olanak ver r. Eğer uygulama kullanıcı g rd s n doğrudan SQL şablonuna ekl yorsa,
saldırgan tek b r g r ş le hem tüm kullanıcı ver ler n çekeb l r hem de ardından DROP TABLE
Tedar kç ler; g b yıkıcı b r komut çalıştırarak tabloyu s leb l r.
Aynı saldırının daha yıkıcı varyantı (ver s lme örneğ )
Kullanıcı g r ş şöyle olsaydı: '; DROP TABLE users; --
Sorgu:
SELECT * FROM users WHERE username = ''; DROP TABLE users; -- ' AND password = '...';
Örnek
SQL Inject on Önleme Adımları
1) Parametrel sorgular / prepared statements
Ne yapar: Sorgu metn n ve parametreler ayırır; kullanıcı g rd s sorgu mantığını değ şt remez.
Neden: DB motoru parametreler l teral değer olarak şler.
Örnekler
Python (psycopg2 / PostgreSQL)
[Link]("SELECT * FROM users WHERE ema l = %s", (ema l,))
PHP (PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
C# ([Link])
us ng var cmd = new SqlCommand("SELECT * FROM Users WHERE username=@u", conn);
[Link] thValue("@u", username);
[Link] (pg)
const res = awa t cl [Link]('SELECT * FROM products WHERE d=$1', [ d]);
Test: Test ortamında ema l = "' OR '1'='1' --" le dene; parametrel olup olmadığına bak — ver
döndürmemel .
2) G rd doğrulama — beyaz l ste (wh tel st ng)
Ne yapar: Beklenen format dışındak g rd ler reddeder; saldırı yüzey n daraltır.
Örnekler
ID ç n (sadece rakam):
f(!/^\d{1,10}$/.test([Link]. d)) return [Link](400).send(' nval d d');
E-posta:
var regex = new Regex(@"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$");
f() throw new Val dat onExcept on();
Enum (kategor ):
f category not n ("Books","G fts","Tools"): ra se ValueError
Test: Beklenen dışı nput 400 dönmel ; nject on str ngler redded lmel veya str ng l teral olarak
şlenmel .
3) ORM / query bu lder / stored procedures
Ne yapar: Otomat k parametre bağlaması sağlar; raw SQL kullanımını azaltır.
Örnek (Ent ty Framework / Dapper / H bernate):
var user = [Link].F rstOrDefault(u => [Link] l == ema l);
Stored proc (parametre le)
CREATE PROCEDURE GetUserByEma l @ema l NVARCHAR(255) AS
SELECT * FROM Users WHERE ema l=@ema l;
Uyarı: ORM ç nde raw SQL kullanıyorsanız mutlaka parametre bağlayın.
Test: Raw query kullanımını kod taraması le tesp t et; mümkünse refactor et.
4) Mult -statement / stacked quer es engelleme
Ne yapar: Tek stekte b rden fazla SQL çalıştırılmasını engeller; ; DROP TABLE ... r sk n azaltır.
Konf g örneğ : MySQL dr ver’da mult pleStatements=false; MSSQL/other dr ver konf glarını
kontrol et.
Test: '; DROP TABLE users; -- payload’ı tek parametre olarak ver ld ğ nde b rden fazla komut
çalışmamalı.
5) En az ayrıcalık (least pr v lege)
Ne yapar: Uygulama DB kullanıcısına sadece gereken z nler ver r; ele geç r lse b le zarar kısıtlı
olur.
SQL örneğ :
CREATE USER app_user IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE ON mydb.* TO app_user;
-- DROP/ALTER yetk s verme
Test: app_user le DROP denend ğ nde perm ss on den ed olmalı.
6) Hata mesajlarını maskeleme; logg ng & mon tor ng
Ne yapar: Kullanıcıya tekn k hata vermey keser; detaylı hata kaydı SIEM’e g der.
Uygulama: Prod’da gener c mesaj: “Sunucu hatası”; detay stack trace sadece secure log.
Mon tor ng: SIEM/WAF alarmı: aynı IP’den çok sayıda ', UNION, SLEEP çeren steklerde uyarı.
Test: B l nçl hatada kullanıcıya ayrıntı göster lmed ğ n ve log kaydının oluştuğunu doğrula.
7) WAF, DAST, SAST, pentest — katmanlı savunma
Ne yapar: B r katman kaçarsa d ğerler yakalar; otomat k tarama düzenl güvenl k ger b ld r m
sağlar.
CI entegrasyonu: Jenk ns/G tHub Act ons → OWASP ZAP veya Acunet x taraması, başarısızsa
merge bloke.
Test: CI p pel ne’da nject on testler çalışmalı; kr t k bulgu varsa fa l/ ssue açılmalı.
8) D nam k SQL’ azalt / parametreleşt r
Ne yapar: Str ng concat le oluşturulan SQL’den kaçın.
Kötü örnek:
EXEC('SELECT * FROM users WHERE name = ''' + @name + '''');
İy örnek: parametrel stored proc (yukarıda).
Test: Kod taraması le dynam c SQL kullanım sayısı azaltılmalı.
9) Prat k payload örnekler (sadece z nl test ortamı)
Auth bypass: ' OR '1'='1' --
UNION exf l: ' UNION SELECT username, password FROM users --
Stacked: '; DROP TABLE users; --
T me-based bl nd (Postgres): '; SELECT pg_sleep(5); --
Test prosedürü: stag ng ortamında payload l stes n çalıştır, logları ve DB davranışını ncele.
10) Kısa check-l st (hızlı denet m)
Tüm SQL sorguları parametr zed mı?
Mult -statement engellenm ş m ?
G rd beyaz-l steleme uygulanmış mı?
Uygulama DB hesabı least-pr v lege mı?
Prod hata mesajları maskel , loglama akt f m ?
CI’da DAST/SAST + yıllık pentest planı var mı?