SQL Sızdırma Saldırısı Nedir?
Bir saldırgan, web sayfasında giriş yapılabilen bir web formunun girdisine ya da sorgu sabitine SQL sorguları yerleştirerek kötü amaçlı olabilecek SQL komutlarını yürütebiliyorsa bir SQL Sızdırma Saldırısıyla karşı karşıyasınız demektir. Kullanıcının ya da sorgu sabiti girdisinin dinamik SQL sorgularını ya da depolanmış girdi parametrelerini doğrudan doğruya etkileyebildiği girdi formları, bu tür saldırılara açık formlardır. Olay genellikle şöyle gelişir:
- Bir web uygulamasının, uygulamaya erişimin denetlendiği bir log-in sayfası vardır. Bu login sayfasına girmek için de bir log-in ve şifre gerekiyordur.
- Log-in sayfasından verilen girdi, dinamik bir SQL komutu oluşturmak için ya da depolanmış bir prosedür çağrısının doğrudan girdisi olarak kullanılıyordur. Söz konusu sorguyu oluşturmak için nelerin kullanabileceğine bir örnek olarak aşağıdaki kodu verebiliriz:
- System.Text.StringBuilder query =
- new System.Text.StringBuilder(
- “SELECT * from Users WHERE login = ‘”)
- .Append(txtLogin.Text).Append(“‘ AND password='”)
- .Append(txtPassword.Text).Append(“‘”);
- Saldırgan login ve şifre girdisi olarak “‘ or ‘1’=’1” gibi bir girdi yazar.
- Böylelikle SQL dinamik komutu şunun gibi bir şey olur: “SELECT * from Users WHERE login = ” or ‘1’=’1′ AND password = ” or ‘1’=’1′”.
- Sorgunun ya da depolanmış prosedürün, girdilerdeki referansları veri tabanındaki referanslarla karşılaştırması temin edilir.
- Sorgu veri tabanındaki verilere göre işler ve saldırgan bu yanlışlık sayesinde web uygulamasına erişim kazanır çünkü asıl SQL komutunun yerine sızdırılmış SQL komutu geçmiştir.
Uygulamanın girdiyi alacağını ve onu doğrulamak için bir arama icra etmesi ihtimalini olduğunu da göz önüne alan saldırgan, sorgunun tüm kullanıcılara dönmesine ve onların uygulamaya erişim kazanmasına neden olacak kısmi bir SQL sabiti girebilir.
Benim Uygulamamla Kim Ne Yapabilir?
Saldırganın verebileceği hasarın miktarı her bir ortam için farklılık arz edebilir. Bu temelde uygulamanızın veri tabanına erişimde kullandığı güvenlik imtiyazlarına bağlıdır. Eğer kullanıcı hesabının idarecisi ya da bazı yüksek imtiyazları varsa o zaman saldırgan uygulama veri tabanı tablolarına, veri ekleme, silme ya da güncelleme ve hatta tüm tabloları devreden çıkarmak dahil istedikleri birçok şeyi yapabilirler.
Bunu Nasıl Önleyeceğim?
İyi haber, ASP.NET uygulamanızın SQL Sızdırma Saldırısına açık olmasını engellemek göreceli olarak oldukça kolay bir iştir. Tüm kullanıcı girdinizi, bir sorgu komutunda kullanmadan önce filtre etmelisiniz. Bu filtreleme işinin çok sayıda formda yürütülmesi gerekebilir.
- Eğer dinamik olarak oluşturulan sorgular kullanıyorsanız o zaman şu teknikleri kullanın:
- Saldırganın SQL komutunu değiştirmesini engelleyecek şekilde, tekil girdilerin yerine iki tekil gerdi geçirerek tekil girdileri sınırlandırın. Yukarıdaki örneği temel alırsak görürüz ki, , “SELECT * from Users WHERE login = ”’ or ”1”=”1′ AND password = ”’ or ”1”=”1′” şeklindeki bir komut “SELECT * from Users WHERE login = ” or ‘1’=’1′ AND password = ” or ‘1’=’1′” şeklindeki bir komuttan çok daha farklı sonuç doğurur.
- Kullanıcı girdisindeki tire işaretlerini kaldırın ki saldırgan şu tür bir sorgu oluşturması mümkün olmasın: SELECT * from Users WHERE login = ‘mas’ — AND password =” bu tür bir sorgu sorgunun ikinci yarısının değerlendirme dışı kalmasına ve yok sayılmasına neden olur. Bu da geçerli bir kullanıcı login’ini bilen bir saldırgan ilgili şifreyi bilmese bile erişim kazanmasına olanak tanır.
- Sorgunun altında çalıştığı kullanıcı hesabına verilen veri tabanına erişim iznini sınırlandırın. Veri seçmek, sokmak, güncellemek ve silmek için farklı farklı kullanıcı hesapları kullanın. Başka başka hesaplardan yürütülebilecek işleri birbirlerinden ayırmakla, veri sokma, güncelleme ya da silme komutunun, seçim komutu yerine icra edilmesinin ya da tersi durumun önüne geçmiş olursunuz.
- Tüm sorguları depolanmış prosedürler olarak kurun ve yürütün. SQL parametrelerinin işleyişe geçiş şekilleri, tire ve apostrof işaretlerinin komut sızdıracak şekilde kullanılmasını engelleyecektir. Ek olarak bu yolla veri tabanı izinlerinin sadece yürütülebilecek belirli prosedürlerle kısıtlı kalması mümkün olur. Tüm kullanıcı girdisi işleyen prosedürün bağlamına uyacak ve olası bir sızdırma saldırısına uymayacak şekilde olmalıdır.
- Form ya da sorgu sabiti girdisinin uzunluğunu sınırlandırın. Eğer login’iniz 10 karakter uzunluğundaysa o değer için daha fazla karaktere müsaade edilmemesini temin edin. Bu, olası zararlı SQL komutlarının girdiye sızdırılmasını daha da zorlaştıracaktır.
- Girdinin istenilen değerlerle sınırlı olduğunu teyit için, kullanıcı girdisinde doğrulama işlevi koyun. Veri doğrulaması hem müşteri hem de sunucu bilgisayarsa işlemelidir. Sunucu bilgisayar tarafındaki doğrulama, müşteri bilgisayarındaki doğrulamada meydana gelen güvenlik zayıflığını giderecek nitelikte olmalıdır. Bir saldırganın kaynak kodunuza erişmesi, onu kaydetmesi, doğrulama scriptlerinizi (betiklerinizi) değiştirmesi (ve hatta olduğu gibi silmesi) ve formu sunucunuza uygunsuz veriyle sunması mümkündür. Doğrulamanın işlediğinden mutlak surette emin olmanın tek yolu doğrulamayı sunucu üzerinde de yürütmektir. RegularExpressionValidator gibi doğrulamayı yürütecek müşteri-taraflı betiği üreten ve sunucu-taraflı yöntemi de devreye sokmanızı temin eden birkaç yapım-öncesi doğrulama nesneleri de vardır. Bulabildiğiniz doğrulayıcılar yelpazesi içinde, sizin gereksiniminizle örtüşen bir doğrulayıcı bulamazsanız CustomValidator kullanarak kendi doğrulayıcınızı oluşturabilirsiniz.
- Login’ler ve şifreler gibi verileri şifrelenmiş bir biçimde saklayın. Kullanıcı girdisini, veri tabanındaki veriyle karşılaştırmak üzere şifreleyin. Veri artık, veri tabanına yönelik hiçbir komut anlamı taşımayan, sızdırılmış komutlardan arınmış ve saldırganın SQL komutunuzu sızdırmasına olanak tanımayacak bir şekilde veri tabanıyla karşılaştırılabilir. System.Web.Security.FormsAuthentication class dosyası, özellikle kullanıcı girdisini arındırmakta kullanışlı olan HashPasswordForStoringInConfigFile’ı içermektedir.
- Veriyi çağıran bir sorguya verilen yanıtın satır sayısını doğrulatın. Eğer sadece bir satır veri yanıtlaması bekliyorsanız, birden fazla satırlı yanıt geldiğinde sisteme hata verdirin.
Yazar Hakkında
Mark Strawmyer, MCSD, MCSE (NT4/W2K), MCDBA, büyük ve orta ölçekli kuruluşlara yönelik .NET uygulamaları Kıdemli Mimarıdır. Mark ayrıca Indiana eyaleti, Indianapolis’teki Crowe Chizek ile beraber bir teknoloji öncüsüdür. Strawmyer, Microsoft-tabanlı çözümlerin mimarisi, tasarımı ve geliştirilmeleri konularında uzmandır. Kendisine at [email protected] adresinden ulaşabilirsiniz.