Ana içeriğe geç
Kesit SQL
İleri · SQL Server Operasyon

SQL injection ve doğru savunma: parametreli sorgu, en az yetki, işe yaramayan savunmalar

Girdinin kod olarak yorumlanmasını tanımak, katmanlı savunma kurmak, yanlış savunmaları ayırmak ve iz bulmak. Savunma odaklı.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Bu dersin sınırı

Amaç savunmak. Saldırıyı yalnız tanımak için en küçük örnek gösterilir. Başkasının sistemini denemek suçtur; sınama yalnız sana ait ya da yazılı izin aldığın ortamda yapılır.

Veri kurgudurops_ tabloları hayali bir portal için tohumlu üreteçle kuruldu. Gerçek bir sistemden alınmadı; süre ve okuma değerleri ölçüm değildir. Motor SQLite olduğu için günlükteki SQL Server sorguları çalıştırılmaz, metin olarak incelenir. Tabloları sorgularsın, sistem yönetimi komutlarını yalnız okursun.

Sorun tek cümle

Kullanıcı girdisi metin birleştirmeyle sorguya girdiğinde motor neyin veri, neyin kod olduğunu ayıramaz. Temeli Güvenlik dersinde, dinamik SQL tarafı Dinamik SQL dersinde. Burada savunmayı bir bütün olarak kuruyoruz.

-- YANLIŞ: girdi metne ekleniyor
DECLARE @sql NVARCHAR(MAX) = N'SELECT COUNT(*) FROM bank_customers WHERE full_name = ''' + @ara + N'''';
EXEC (@sql);
-- @ara değeri  a' OR '1'='1  olursa koşul her satırda doğru olur

Katmanlı savunma

KatmanNe yaparTek başına yeter mi?
Parametreli sorguDeğer kod olarak yorumlanmaz, tür ve uzunluk denetlenirDeğerler için asıl savunma budur
İzin listesi (beyaz liste)Tablo ve sütun adı parametre olamaz, kabul edilenleri sayAdlar için şart; QUOTENAME ile birlikte
Girdi doğrulamaTür, uzunluk, biçim, aralık. Her güven sınırında, yalnız istemcide değilHayır, ek katman
En az yetkiUygulama hesabı sysadmin olmaz, yalnız gerekeni yaparAçığı kapatmaz, zararı sınırlar
Hata mesajıAyrıntıyı kullanıcıya gösterme, günlüğe yazHayır, yalnız bilgi sızıntısını azaltır
Kod inceleme ve izlemeEXEC, sp_executesql kullanan yordamları gözden geçir, günlüğü izleHayır, açığı bulmak içindir

Doğru yazım

-- Dinamik SQL şart değilse kullanma
SELECT COUNT(*) FROM bank_customers WHERE full_name = @ara;

-- Şartsa değeri parametre olarak ver
EXEC sp_executesql N'SELECT COUNT(*) FROM bank_customers WHERE full_name = @a',
     N'@a NVARCHAR(100)', @a = @ara;

İşe yaramayan ya da eksik savunmalar

YöntemNeden yetmez
Tek tırnağı silmek ya da çiftlemekSayısal alanda tırnak gerekmez; kaçışlama asıl savunma olamaz. Belge süzmeyi güvenilir birincil savunma saymaz
Yalnız arayüzde doğrulamaİstemci atlanır, istek doğrudan gönderilebilir
Yasak sözcük listesi (DROP, OR)Eksik kalır, meşru girdiyi de bozar: "Orhan" adı gibi
Saklı yordama geçmekYordam içinde metin birleştiriyorsa sorun aynen sürer
Hata mesajını gizlemekAçık yerinde kalır, yalnız görünmesi zorlaşır
ORM kullanmakORM'in ham SQL yolunda birleştirme yaparsan korunmazsın

En az yetki günlükle nasıl kurulur?

"Bu hesap ne yapıyor?" sorusunu tahminle değil günlükle yanıtla. Hesap başına okuma ve yazma sayısı, hangi izinlerin gereksiz olduğunu gösterir. Uygulama hesabı yalnız gereken yordamlara EXECUTE almalı; ayrıntısı SQL Server güvenliği dersinde. Belge ayrıca xp_cmdshell kullanımını hiçbir ortamda önermez.

SELECT l.login_name, l.kind,
       SUM(CASE WHEN a.event_type = 'read' THEN 1 ELSE 0 END) AS okuma,
       SUM(CASE WHEN a.event_type = 'write' THEN 1 ELSE 0 END) AS yazma
FROM ops_logins l
LEFT JOIN ops_access_log a ON a.login_name = l.login_name
GROUP BY l.login_name, l.kind
ORDER BY l.login_name;

Günlükte iz: parmak izi işe yarar

Parametreli bir sorgu her çağrıda aynı biçimdedir. Girdi koda dönüşünce biçim değişir ve yeni bir parmak izi doğar. Kurgusal günlüğümüzde pazartesi akşamı arama sorgusunda bunu göreceksin. Portal aramayı parametresiz kuruyor, bu yüzden günlükte girdinin izi var. Bu aynı zamanda bir bulgudur: günlükte sabit değer gördüğün her sorgu, inceleme adayıdır.

İz bir kanıt başlangıcıdır, hüküm değildir: görünen adres uygulama sunucusudur, denemeyi yapan kişi günlükte yoktur. Girişleri uygulama katmanı günlüğüyle eşleştirmen gerekir.

Alıştırmalara geç (8)