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.
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.
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:
$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:
sudo apt update
SQLmap paketini yükleyin:
sudo apt install sqlmap -y
Kurulumu doğrulayın:
sqlmap --version
6. Yardım Ekranı
Temel seçenekleri görmek için:
sqlmap -h
Daha ayrıntılı yardım ekranı için:
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
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:
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:
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:
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:
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:
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:
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:
sudo tail -f /var/log/nginx/access.log
Apache erişim logu örneği:
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:
$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:
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:
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:
İş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ı
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.