Web Uygulama Güvenliği

SQLmap Kullanımı

SQLmap aracını yalnızca izole laboratuvarlarda kullanın; SQL injection belirtilerini güvenli şekilde doğrulayın, sonuçları yorumlayın ve uygulamanızı savunma odaklı güçlendirin.

17 Temmuz 202618 dk okumaBaşlangıç–Orta Seviye

1. SQLmap Nedir?

SQLmap, web uygulamalarındaki SQL injection risklerini otomatik olarak test etmek için kullanılan açık kaynaklı bir güvenlik aracıdır.

Veritabanı türünü tahmin edebilir, parametrelerin enjekte edilebilir olup olmadığını kontrol edebilir ve test sonuçlarını raporlayabilir.

Yetkili kullanım

SQLmap yalnızca size ait uygulamalarda veya açıkça test izni verilmiş laboratuvarlarda kullanılmalıdır.

2. SQL Injection Nedir?

SQL injection, kullanıcı girdisinin güvenli şekilde parametrelenmeden SQL sorgusuna eklenmesi sonucu oluşan bir güvenlik açığıdır.

Güvensiz örnek:

php
$query = "SELECT * FROM users WHERE id = " . $_GET["id"];

Bu yapı, kullanıcı girdisinin doğrudan sorguya eklenmesine neden olur.

3. Olası Etkiler

  • Yetkisiz veri görüntüleme
  • Veri değiştirme veya silme
  • Kimlik doğrulama mekanizmalarının atlatılması
  • Uygulama mantığının bozulması
  • Hassas sistem bilgilerinin açığa çıkması
  • Veritabanı bütünlüğünün zarar görmesi

Gerçek etki, uygulamanın veritabanı yetkileri ve güvenlik yapılandırmasına göre değişir.

4. Güvenli Laboratuvar Gereksinimleri

  • Kali Linux veya test amaçlı Linux sistemi
  • Size ait yerel web uygulaması
  • İzole Host-only veya Internal Network
  • Snapshot veya yedek
  • Test kapsamı ve izin belgesi
  • Gerçek kullanıcı verisi içermeyen örnek veritabanı

5. SQLmap Kurulumu

Kali Linux paket listesini güncelleyin:

bash
sudo apt update

SQLmap paketini yükleyin:

bash
sudo apt install sqlmap -y

Kurulumu doğrulayın:

bash
sqlmap --version

6. Yardım Ekranı

Temel seçenekleri görmek için:

bash
sqlmap -h

Daha ayrıntılı yardım ekranı için:

bash
sqlmap -hh

7. Hedef ve Kapsam Belirleme

Testten önce kapsam açık şekilde tanımlanmalıdır.

  • Yalnızca laboratuvar URL’si kullanılmalı
  • Test edilecek parametre belirlenmeli
  • Gerçek üretim sistemi kullanılmamalı
  • Veri çekme ve değiştirme işlemleri kapsam dışı tutulmalı
  • Test süresi ve hız sınırı belirlenmeli
Kapsam dışı işlemler

Veritabanı dökümü, parola hash çıkarma, dosya okuma/yazma veya işletim sistemi komutu çalıştırma bu dokümana dahil değildir.

8. Zararsız URL Parametresi Testi

Yalnızca size ait yerel laboratuvar uygulamasında bir parametrenin test edilmesi için temel kullanım:

bash
sqlmap -u "http://127.0.0.1/lab/product.php?id=1" --batch

--batch, etkileşimli sorular için varsayılan güvenli yanıtları kullanır.

9. Belirli Parametreyi Test Etme

Birden fazla parametre bulunan URL’de yalnızca belirli parametreyi seçmek için:

bash
sqlmap -u "http://127.0.0.1/lab/search.php?q=test&page=1" -p q --batch

Bu yaklaşım test kapsamını daraltır ve gereksiz parametrelerin denenmesini engeller.

10. Yerel POST Formunu Test Etme

Yalnızca kendi laboratuvar formunuz için POST verisi belirtilebilir:

bash
sqlmap -u "http://127.0.0.1/lab/login-test.php" --data="username=test&code=100" -p code --batch

Bu örnek yalnızca laboratuvar girdisinin güvenli şekilde doğrulanması içindir.

11. İstek Dosyası Kullanma

Yerel test uygulamasına ait HTTP isteği bir dosyaya kaydedilmişse:

http
GET /lab/product.php?id=1 HTTP/1.1
Host: 127.0.0.1
User-Agent: Lab-Browser
Connection: close

İstek dosyasını SQLmap’e vermek için:

bash
sqlmap -r lab-request.txt --batch

12. Level ve Risk Ayarları

SQLmap test yoğunluğunu --level ve --risk seçenekleriyle değiştirir.

Seçenek Açıklama
--level=1 Temel ve daha sınırlı test kapsamıdır.
--risk=1 Düşük riskli testler kullanılır.
Yüksek değerler Daha fazla istek ve daha yoğun test anlamına gelir.

Başlangıçta yalnızca varsayılan düşük değerler kullanılmalıdır.

13. İstek Hızını Sınırlama

Laboratuvar uygulamasını gereksiz yükten korumak için gecikme eklenebilir:

bash
sqlmap -u "http://127.0.0.1/lab/product.php?id=1" --delay=1 --timeout=10 --retries=1 --batch

Bu ayarlar test trafiğini daha kontrollü hale getirir.

14. Sonuçları Yorumlama

SQLmap çıktısında aşağıdaki türde mesajlar görülebilir:

Mesaj Anlamı
parameter appears to be dynamic Parametre değeri değiştiğinde cevap değişiyor olabilir.
parameter might be injectable Enjeksiyon ihtimali tespit edilmiş olabilir.
parameter does not appear to be injectable Test edilen yöntemlerle açık bulunamamıştır.
back-end DBMS Muhtemel veritabanı türü tahminidir.

Otomatik araç çıktısı tek başına kesin kanıt değildir; geliştirici tarafından kod incelemesiyle doğrulanmalıdır.

15. Yanlış Pozitif ve Yanlış Negatifler

SQLmap sonuçları aşağıdaki nedenlerle hatalı yorumlanabilir:

  • Özel hata sayfaları
  • Önbellek davranışı
  • WAF veya güvenlik duvarı
  • Kararsız uygulama cevapları
  • Dinamik içerik
  • Yanlış parametre seçimi

Sonuçlar uygulama logları, kaynak kod ve veritabanı sorguları üzerinden ayrıca incelenmelidir.

16. Uygulama ve Sunucu Loglarını İzleme

Laboratuvar testinde uygulama ve web sunucusu logları eş zamanlı izlenmelidir.

Nginx erişim logu örneği:

bash
sudo tail -f /var/log/nginx/access.log

Apache erişim logu örneği:

bash
sudo tail -f /var/log/apache2/access.log

17. Parametreli Sorgular

SQL injection’a karşı en önemli savunma parametreli sorgulardır.

PHP PDO örneği:

php
$stmt = $pdo->prepare(
    "SELECT * FROM products WHERE id = :id"
);

$stmt->execute([
    "id" => $_GET["id"]
]);

Kullanıcı girdisi sorgu metnine doğrudan eklenmez.

18. Python ile Güvenli Sorgu

Python DB-API parametreli sorgu örneği:

python
cursor.execute(
    "SELECT * FROM products WHERE id = %s",
    (product_id,)
)

String birleştirme veya f-string ile SQL sorgusu oluşturulmamalıdır.

19. Node.js ile Güvenli Sorgu

Parametreli sorgu örneği:

javascript
const [rows] = await db.execute(
  "SELECT * FROM products WHERE id = ?",
  [productId]
);

20. Veritabanı Yetkilerini Sınırlama

  • Uygulama hesabına yalnızca gerekli izinleri verin.
  • Uygulamayı veritabanı yöneticisi hesabıyla çalıştırmayın.
  • Okuma ve yazma ihtiyaçlarını ayırın.
  • Gereksiz sistem tablolarına erişimi engelleyin.
  • Farklı uygulamalar için ayrı veritabanı hesapları kullanın.

21. Hata Mesajlarını Güvenli Yönetme

Veritabanı hata mesajları doğrudan kullanıcıya gösterilmemelidir.

Kullanıcıya genel hata mesajı gösterin:

örnek
İşleminiz şu anda tamamlanamadı.
Lütfen daha sonra tekrar deneyin.

Ayrıntılı hata bilgisi yalnızca güvenli sunucu loglarında tutulmalıdır.

22. WAF ve Ek Güvenlik Katmanları

Web Application Firewall, SQL injection girişimlerini tespit etmeye yardımcı olabilir.

Ancak WAF temel açığı düzeltmez. Asıl önlemler:

  • Parametreli sorgular
  • Girdi doğrulama
  • En az yetki
  • Güvenli hata yönetimi
  • Kod incelemesi
  • Otomatik güvenlik testleri

23. Geliştirici Kontrol Listesi

  • SQL sorgularını string birleştirme ile oluşturmayın.
  • Parametreli sorgu veya güvenli ORM kullanın.
  • Sunucu tarafı veri tipi doğrulaması yapın.
  • Veritabanı hesabını en az yetkiyle çalıştırın.
  • Hata detaylarını kullanıcıya göstermeyin.
  • Uygulama ve veritabanı loglarını izleyin.
  • Bağımlılıkları güncel tutun.
  • Güvenlik testlerini CI/CD sürecine ekleyin.

24. Laboratuvar Temizliği

  • SQLmap işlemini sonlandırın.
  • Test loglarını güvenli şekilde arşivleyin.
  • Geçici istek dosyalarını silin.
  • Laboratuvar veritabanını temiz snapshot’a döndürün.
  • Sanal makineleri kapatın.
  • Test URL’lerini internete açık bırakmayın.

25. Sık Karşılaşılan Hatalar

sqlmap komutu bulunamadı

bash
sudo apt update
sudo apt install sqlmap -y

Target URL is not stable

Sayfanın cevabı dinamik olabilir. Önbellek, reklam, zaman bilgisi veya oturum değişkenlerini kontrol edin.

Parameter does not appear to be dynamic

Seçilen parametre cevap üzerinde etkili olmayabilir. Doğru parametreyi ve uygulama mantığını kontrol edin.

Connection timed out

Laboratuvar sunucusunun çalıştığını, IP adresini ve güvenlik duvarı kurallarını kontrol edin.

26. Komut Özeti

İşlem Komut
Sürüm kontrolü sqlmap --version
Yardım ekranı sqlmap -h
Yerel URL testi sqlmap -u "http://127.0.0.1/lab/?id=1" --batch
Parametre seçme -p id
POST verisi --data="id=1"
İstek dosyası sqlmap -r lab-request.txt --batch
Gecikme ekleme --delay=1

27. Sonuç

Bu dokümanda SQLmap kurulumu, yerel laboratuvar kullanımı, parametre seçimi, kontrollü test trafiği, sonuç yorumlama ve SQL injection savunmaları ele alındı.

SQL injection’a karşı en etkili yaklaşım parametreli sorgular, en az yetki, güvenli hata yönetimi ve düzenli kod incelemesidir.

© 2026 Kemal Tokmak — Gerçek Deneyimler, Gerçek Dokümantasyon