Thread Starter
#0

SQL tabanlı veritabanları (özellikle MySQL ve MSSQL), kötü amaçlı kullanıcılar tarafından sunucularda shell komutları çalıştırmak amacıyla hedef alınabilir. Özellikle xp_cmdshell, LOAD_FILE, INTO OUTFILE, sys_eval gibi fonksiyonlar kullanılarak sistem düzeyinde işlemler yapılabilir.
Bu yüzden SQL seviyesinde shell komutlarına karşı koruma şarttır. Peki nasıl?
⚠️ SQL'de Kullanılan Tehlikeli Shell Komutları Nelerdir?
Bazı SQL komutları veya fonksiyonlar, sistemdeki dosyalara erişim sağlar ya da shell komutlarını çalıştırabilir:
MSSQL Örnekleri:
- xp_cmdshell 'dir C:\'
- sp_configure 'show advanced options', 1
- EXEC master.dbo.xp_cmdshell 'powershell ...'
MySQL Örnekleri:
- SELECT LOAD_FILE('/etc/passwd');
- SELECT ... INTO OUTFILE '/var/www/html/shell.php';
- sys_eval() (MariaDB'de 3rd party olarak yüklenebilir)
Bu komutlar kullanılarak sunucuya shell yüklenebilir, dosyalar görüntülenebilir veya sistem ele geçirilebilir.
✅ SQL'de Shell Komutlarına Karşı Korunma Yolları
1. 🔧 Tehlikeli Fonksiyonları Devre Dışı Bırakın
MSSQL:
CODE
12345-- xp_cmdshell'i tamamen devre dışı bırakın
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;
MySQL:
- secure_file_priv parametresini sadece belirli dizinlere sınırlandırın:
CODE
1secure_file_priv="/var/lib/mysql-files/"
- LOAD_FILE() ve INTO OUTFILE gibi fonksiyonların kullanımına dikkat edin. Uygulama seviyesinde filtrelenmelidir.
2. 🧱 Uygulama Katmanında Girdi Doğrulama (Input Validation)
SQL enjeksiyon (SQLi) saldırıları aracılığıyla shell komutlarına ulaşılır. Bu yüzden:
- Hazır sorgular (prepared statements) kullanın
- Kullanıcı girdisini sanitize edin (örneğin ', ;, -- gibi karakterleri temizleyin)
- Sadece beklenen verileri kabul edin (örnek: regex ile e-posta, ID vs.)
3. 🧍 Yetkilendirme ve Hak Sınırlandırması
- Veritabanı kullanıcılarına minimum yetkiler verin.
- Shell veya dosya sistemine erişim gereken işlemler sadece belirli rollerle yapılmalı.
- GRANT FILE, GRANT EXECUTE gibi izinleri sınırlayın.
4. 🗂️ Web Dizini Dışında OUTFILE Kullanımını Yasaklayın
MySQL'de şu komutla PHP shell yüklenebilir:
SQL
1SELECT "<?php system($_GET['cmd']); ?>" INTO OUTFILE "/var/www/html/shell.php";
Bu nedenle:
- Web sunucusu dizinlerini yazılabilir yapmayın
secure_file_privile yazılabilir dizini kontrol edin
INTO OUTFILEkullanımını denetleyin
5. 🔍 Kayıt ve İzleme (Logging & Monitoring)
- Veritabanı loglarını etkinleştirin (örneğin general_log, slow_query_log, audit log)
- Tehlikeli anahtar kelimeleri izleyin (
xp_cmdshell,outfile,load_file)
- WAF ve SIEM sistemleri ile entegrasyon sağlayın
6. 🧪 Penetrasyon Testleri Yapın
sqlmapgibi araçlarla test ederek shell komutlarının çalıştırılıp çalıştırılamayacağını tespit edin.
- Dışarıdan erişilebilen tüm formlar, API'ler ve admin panelleri taratılmalıdır.
📌 Ekstra Güvenlik Katmanları
- UFW veya iptables ile 3306 gibi SQL portlarını dışa kapatın
- Web sunucusunu ve veritabanını ayrı makinelerde çalıştırın
- PHP, Apache ve MySQL sürümlerini güncel tutun
- Disable_functions listesine
exec,shell_exec,system,popengibi PHP komutlarını ekleyin
