Oracle Geliştiricileri için SQL Injection Saldırıları ve Korunma Yöntemleri (1.Bölüm)


Giriş
Arka-planda Oracle veritabanı kullanan çoğu uygulama geliştiricisi SQL Injectionii saldırıları riskini hafife alıyor. Yaptığımız web uygulama denetimlerinde çoğü web uygulama geliştiricisinin SQL Injection saldırılarının risklerini ve bu tip saldırıları engellemede kullanılan basit teknikleri tam olarak anlamadığını gördük.

Bu doküman uygulama geliştiricileri, veritabanı yöneticileri ve uygulama denetleyicilerine SQL Injection saldırıları risklerini anlatmakta ve web uygulamalarının neden açıklar içerdiğini örneklerle göstermektedir. SQL saldırıları yapılması için hazırlanmamıştır ve bu tip saldırıları yapmak için bilgiler içermemektedir.

SQL Injection Genel Bilgi
Direk veritabanı bağlantısı olan, stored procedure çalıştıran, Oracle Forms uygulamaları, web uygulamaları gibi herhangi bir program veya uygulama SQL Injection saldırısından etkilenebilir. Çeşitli SQL Injection açıkları DBMS_DATAPUMP, DBMS_REGISTRY ve DBMS_METADATA (ocak 2006 oracle kritik yama güncellemesine göz atın) gibi standart Oracle veritabanı paketlerinde bulunmuştur. Saldırganlar uzaktan herhangi bir veritabanı veya uygulama kimlik doğrulaması gerektirmeden SQL Injection saldırıları gerçekleştirebildiğinden web uygulamaları yüksek risk altındadır.

Oracle, kullanan çoğu uygulama geliştiricisinin düşündüğünden daha fazla SQL Injection saldırılarından etkilenmektedir. Yaptığımız uygulama denetimlerinde söz konusu uygulamaların, geliştirilmesinde iyi oluşturulmuş kodlama standartları kullanılmasına rağmen SQL Injection saldırılarından etkilendiğini gördük. En çok endişe yaratan fonksiyon-tabanlı SQL Injection saldırılar çünkü bu saldırılar uygulama bilgisi gerektirmiyor ve kolaylıkla otomatikleştirilebilir.

SQL Injection saldırıları basit kodlama teknikleri ile kolayca engellenebilirler. Fakat tüm dinamik SQL sorgularına geçirilen tüm parametreler kontrol edilmeli veya bind değişkenleri kullanılmalı.

SQL Injection: Oracle diğer veritabanlarına karşı
Oracle genelde SQL Injection saldırılarına karşı daha iyidir çünkü birden fazla SQL komutu desteği yoktur (SQL Server ve PostgreSQL), EXECUTE komutu yoktur (SQL Server), ve INTO OUTFILE fonksiyonu yoktur (MySQL) - SQL Injection açıklarından yararlanmada kullanılan çoğu metod kullanılamaz. Ek olarak performans amaçlı kullanılan bind değişkenleri kullanımı SQL Injection saldırılarına karşı en etkili korumayı sağlar.

Oracle SQL Injection için diğer veritabanlarından daha az sayıda saldırı vektörüne sahip olabilir fakat düzgün savunmaya sahip olmayan Oracle-tabanlı uygulamalar kolayca SQL Injection saldırılarından etkilenebilirler.

Uygulama Geliştirme
Uygulamalar Oracle veritabanına bağlanmada çeşitli metodlar kullanarak geliştirilebilirler - bu metodlardan bazıları SQL Injectionda diğerlerinden daha fazla açık içeriyor olabilir. Bu doküman web tabanlı uygulamalarda sıklıkla kullanılan birkaç programlama dili ve uygulama mimarisine odaklanmaktadır, fakat, belirtilen teknikler çoğu programlama dili ve uygulama mimarisine uyacaktır.

Doküman Oracle veritabanına bağlantıda Java ve JDBC kullanan veya PL/SQL programlama dili kullanan uygulamalara odaklanmaktadır. Bunların oracle veritabanı kullanan web-tabanlı uygulamalarda en genel kullanılan iki metod olduğuna inanıyoruz.

SQL INJECTION

Giriş
SQL Injection saldırıları yapıları itibarı ile basittirler - bir saldırgan kendisine yarayacak şekilde SQL sorgusunu değiştirmeye yönelik olarak bir string girdisi gönderir. Saldırının karmaşıklığı saldırgan tarafından bilinmeyen bir SQL sorgusunun exploit edilmesini içerir. Açık-kaynak kodlu uygulamalar veya kaynak kodu ile sunulan ticari uygulamalar, saldırı öncesi açıklarının tespit edilebileceği için, bu saldırılardan daha çok etkilenmektedir.

SQL Injection saldırıları kategorileri
Oracle veritabanlarına yapılan SQL Injection saldırıları dört ana kategoride toplanabilir:
1. SQL değiştirme
2. Kod enjeksiyon
3. Fonksiyon çağrısı enjeksiyon
4. Hafıza taşması


İlk iki kategori tüm veritabanı tiplerine yapılan saldırılarda en genel kullanılan saldırılar olduğu için iyi bilinmektedir.

SQL değiştirme basitçe SQL sorgusunun çeşitli işlemlerle (ör UNION) veya WHERE şartında değişiklik ile farklı sonuçların döndürülmesini içerir. Daha önce yazılmış olan pek çok SQL Injection saldırısı bu tiptedir. EN çok bilinen saldırı kullanıcı kimlik doğrulama sorgusunda WHERE şartını her zaman doğru değer dönecek şekilde değiştirmektir.

Kod enjeksiyon saldırganın SQL sorgusuna yeni SQL sorguları veya veritabanı komutları yerleştirmesini içerir. Klasik kod enjeksiyon saldırılarına örnek olarak SQL sunucusu EXECUTE komutu verilebilir. Kod enjeksiyon, eğer bir veritabanı isteğinde birden fazla SQL sorgusu gerçekleştirilmesi destekleniyorsa çalışır. SQL Server ve PostgreSQL bu yeteneğe sahiptir ve bazı durumlarda Oracle'da da birden fazla SQL sorgusu enjekte edilebilmektedir. Oracle kod enjeksiyon açıkları SQL'in PL/SQL'de dinamik çalıştırılmasını içerir.

Son iki kategori daha çok Oracle veritabanına yönelik saldırılardır ve çok fazla bilinmemekte ve dokümante edilmemektedir. Yaptığımız denetimlerin çoğunda uygulamaların bu iki saldırı tipiinden etkilendiğini gördük.

Fonksiyon çağrı enjeksiyonu Oracle veritabanı fonksiyonları veya özel fonksiyonların etkilenen bir SQL sorgusuna eklenmesini içerir. Bu fonksiyon çağrıları işletim sistemi çağrıları yapmada veya veritabanındaki verileri değiştirmede kullanılabilir.

Hafıza taşması SQL Injection saldırıları da fonksiyon çağrı enjeksiyonu saldırıların bir alt koludur. Çeşitli ticari ve açık-kaynak veritabanlarında, az sayıda birkaç veritabanı fonksiyonunda hafıza taşmasına yol açan açıklar bulunmakta. Bu açıkların çoğu için yamalar var fakat production ortamındaki çoğu veritabanı yaması geçilmemiş durumda.

Neler Açıktan Etkilenir
Bir web uygulaması sadece bir sebepten SQL Injection açığı içerir - son kullanıcı tarafından sağlanan girişlerin doğru olarak kontrol edilmeden dinamik SQL sorgularına geçirilmesi. Genelde kullanıcı girdisi direk olarak SQL sorgusuna geçirilir. Fakat bazı durumlarda kullanıcı girişi veritabanında depolanarak daha sonra bir dinamik SQL sorgusuna geçirilebilir, bu da ikinci-sıra SQL Injection olarak adlandırılır. Çoğu web uygulamasının durumsuz (stateless) yapısı nedeniyle, veriyi veritabanına yazmak veya web sayfaları arasında başka yollarla depolanması çok sık görülür. Saldırının bu endirek tipi çok daha karmaşıktır ve genelde uygulama hakkında geniş bilgi sahibi olunmasını gerektirir.

Neler Açıktan Etkilenmez
İçeriği hiçbir şekilde yorumlayamayacağından bind değişkenlerinin kullanımı SQL Injection'a karşı koruma sağlar. PL/SQL ve JDBC bind değişkenlerini destekler. Bind değişkenleri hem performans hemde güvenlik için kullanılmalıdırlar.

SQL Injection metodları
Oracle veritabanlarında kullanılabilen 4 tipte SQL Injection saldırısı vardır. İlk iki tip - SQL değiştirme ve kod enjeksiyon - en çok bilinen ve dokümante edilenlerdir. Fakat fonksiyon çağrısı enjeksiyon ve hafıza taşması saldırıları pek dokümante edilmemiştir ve çoğu uygulama da bu tip saldırılardan etkilenir.

Bu bölümde kullanılan örnekler hakkında:
Bu bölümde farklı tipte SQL Injection metodlarını örneklendirmek için sql sorguları kullanılmıştır. Programlam dilinden bağımsız olmak için, sadece geliştirici tarafından amaçlanan ve saldırgan tarafından değiştirilmiş sql sorguları sunulmaktadır. Kırmızı ile işaretlenen yerler geliştiricinin beklediği ve saldırganın girdiği değerleri belirtmektedir.