Makale Özeti

Günümüzde işle ilgili uygulamaların hemen hepsi arka planda bir veri deposu kullanır. Bu en azından bir xml dosyasıdır. Çoğu durumda da bir veritabanıdır. Veritabanları uygulamalarımıza çok büyük bir güç katar ve önemli faydaları sebebiyle çok yaygındırlar. Ama bu yaygınlığın bir de bedeli vardır: Çalışma ve sorgu mekanizmaları da çok yaygın olarak bilinir ve erişimleriyle ilgili gerekli özen gösterilmediğinde kötü niyetli kişiler çok kıymetli verilerinizle ilgili asla istemeyeceğiniz şeyler yapar hale gelebilirler.

Makale

Uygulama güvenliğine yönelik yaygın tehlikeler (3) SQL aşılama
Günümüzde işle ilgili uygulamaların hemen hepsi arka planda bir veri deposu kullanır. Bu en azından bir xml dosyasıdır. Çoğu durumda da bir veritabanıdır. Veritabanları uygulamalarımıza çok büyük bir güç katar ve önemli faydaları sebebiyle çok yaygındırlar. Ama bu yaygınlığın bir de bedeli vardır: Çalışma ve sorgu mekanizmaları da çok yaygın olarak bilinir ve erişimleriyle ilgili gerekli özen gösterilmediğinde kötü niyetli kişiler çok kıymetli verilerinizle ilgili asla istemeyeceğiniz şeyler yapar hale gelebilirler.
Bir veritabanına içeriden, dışarıdan pek çok şekilde saldırılabilir. Bunun tüm detaylarına girmeyeceğiz. Daha çok veritabanının kendi güvenliği ile ilgili bu konular ayrıca ele alınabilir. Burada daha çok yazdığınız uygulama kodları üzerinden verilerinize ve veritabanınıza yapılabilecek saldırılardan bahsedeceğiz.
SQL aşılama nedir?
SQL aşılama türü saldırılar kodunuz üzerinden çalışır ve girdi kontrolünde yaptığınız hataları ya da eksik yaklaşımları sömürerek başarılı olurlar. SQL sorgularınızda karakter dizgisi birleştirme kullanıyorsanız ve bu birleştirmeye kontrol edilmemiş kullanıcı girdileri dahil oluyorsa her an gerçekleşebilecek bir tehlikeyle yüz yüzesiniz demektir.
SQL aşılama aşağıdaki amaçlarla kullanılabilir:
Veritabanı yoklamaları: Hata mesajlarını yönetmiyorsanız kötü niyetli kullanıcılar özellikle hata durumları oluşturarak veritabanınız hakkında bilgi edinmeye çalışabilirler. Geliştirme yaparken sizin işinize yaramak üzere tasarlanmış olan normal hata mesajlarını çalışan bir kodda olduğu gibi bırakırsanız, sizin bilgi edinmeniz için düzenlenmiş bu mesajlar kötü niyetli kişilere de aynı bilgileri veriyor olacaklardır.
Yetkilendirmeyi devre dışı bırakmak: Yetkilendirme esaslı SQL cümleleriniz korumasız durumdaysa SQL aşılama ile yetki kontrolleri devre dışı bırakılabilir.
Birden fazla SQL cümlesi çalıştırmak: SQL sorgularınıza cümleler eklenebilir.
SQL server sistem saklı yordamlarının (system stored procedure) çağrılması: Kötü niyetli kullanıcılar, gerekli önlemleri almadıysanız, tehlikeli olabilecek sistem saklı yordamlarını çağırabilirler. Bunlar sayesinde sadece verilerinizle ilgili zararlar vermenizin ötesinde tüm sisteminize yönelik tehditler oluşturabilirler.
ÖRNEKLER:
Şu kodu düşünün:

SELECT * FROM Kullanicilar
WHERE KullaniciAdi =’" + txtuid.Text + "’"

Ne var bunda, bende böyle kodlar kullanıyorum diyorsanız tehlike çanları çalıyor demektir. Kötü niyetli bir kullanıcı, metin kutusuna girdiği metni kontrol etmiyorsanız, SQL cümlesi tek tırnakla kapatıp bir noktalı virgül koyabilir. Ardından da (mesela hata mesajları sayesinde tablo isimlerinizi öğrendiyse ve/veya sa hesabıyla bağlandığınız için bu bilgileri zaten sistem tablolarından çekebilecek ve istediği her türlü SQL cümlesini çalıştırabilecek konumdaysa) önemli bir tablonuzu düşürmek gibi zararlı bir işlem yapabilir. Bu yapabileceklerinin sadece bir örneği. Daha kötü şeyler de yapabilir.
txtuid alanına şunu girdiğini düşünün:

’; DROP TABLE Müsteriler --

Bu durumda cümleniz şu hale gelir:

SELECT * FROM Kullanicilar WHERE KullaniciAdi=’’; DROP TABLE Customers --

Metin kutusuna ne girildiğini kontrol etmediyseniz, arka plandaki veritabanı güvenlik ayarlarınıza da yeterince özen göstermemiş olabilirsiniz. Yukarıdaki cümlenin veritabanında ne yapacağını açıklamayacağım. Sanırım hiçbir açıklamayı gerektirmeyecek bir korkunçlukta duruyor cümle karşınızda. Bir de veritabanı yedeğiniz yoksa ya da yeterince güncel değilse, vay halinize!
Aynı cümle için kullanıcının şu girdiyi sağladığını düşünün:

’ OR 1=1 –

Bu durumda cümle şu hale gelir:

SELECT * FROM Kullanicilar WHERE KullaniciAdi =’’ OR 1=1 --

1=1 her zaman doğru olduğundan, saldırgan tüm kullanıcılarınızın kayıtlarına ulaşabilir.
Sistem saklı yordamlarını, özellikle genişletilmiş saklı yordamları (extended stored procedure, xp_ ile başlayanlar) kullanabilen bir saldırgan işletim sistemleri komutları da çalıştırabileceğinden doğrudan sisteme de zarar verebilir.
Tüm detaylara girmiyoruz burada, ama sanırım SQL cümlelerinin ne kadar tehlikeli sızma noktaları olabileceğini görmüşsünüzdür. Dikkat!