AraKullanıcı girişiGezintiEn son ağ günlüğü gönderileri
En Çok OkunanlarKimler yeni
Bağlantılarİçerik paylaşımı |
SQL Injection Test EtmeBir SQL Injection saldırısı istemci tarafından uygulamaya SQL sorgusu ekleme veya "enjekte" etme ile gerçekleşir. Başarılı bir SQL Injection saldırısı veritabanından önemli bilgilerin okunabilmesi ile, değiştirilebilmesi ile (Insert/Update/Delete), veritabanında yönetici işlemleri yapılabilmesiyle (Veritabanı sunucusunun kapatılması gibi) veya bazı durumlar işletim sistemi komutları çalıştırılabilmesi ile sonuçlanabilir. Problemin Tanımı
Saldırı sınıfından bağımsız olarak, bir SQL Injection saldırısı, saldırganın yazılım olarak doğru bir SQL sorgusu hazırlamasını gerektirir. Eğer uygulama doğru olmayan bir sorgu sebebiyle hata mesajı dönerse, orjinal sorgunun mantığını çözmek ve enjeksiyonu doğru olarak nasıl yapılacağını öğrenmek kolaydır. Bununla beraber, eğer uygulama hata detaylarını gizliyorsa, test edenin orjinal sorgu mantığını tersten çözmesi gerekir. Buna da "Kör SQL Enjeksiyoni" (Blind SQL Injection) adı verilir. Kara Kutu Testleri ve Örnekler
Test işlemini gerçekleştirenin POST isteklerindeki gizli alanlarda dahil SQL sorgusunda kullanılabilecek tüm giriş alanlarının listesini yapması ve tek tek test etmesi, sorguya müdahele edip hatalar yaratması gerekir. İlk testlerden biri tek tırnak (') veya noktalı vigrül (;) kullanımıdır. Tekli tırnak SQL sorgusunda string sonlandırıcı olarak kullanılır ve uygulama tarafından filtrelenmiyorsa geçersiz bir sorgu ile sonuçlanabilir. Noktalı virgül ise bir SQL sorgusunun sonlandırılmasında kullanılır ve eğer filtrelenmemişse bu da bir hata yaratacaktır. Doğru filtrelenmemiş bir alan (örnekte MS SQL sunucusu) aşağıdaki mesajı verdirebilir: Ayrıca kendisinden sonra gelenlerin bir yorum olduğunu ve göz ardı edilip çalıştırılmaması gerektiğini belirten -- karakterleri ve AND OR gibi SQL kelimeleri de sorguyu değiştirmede kullanılır. Basit fakat etkili bir teknik basitçe değerinin rakam olması beklenen bir yere harf girmektir. Aşağıdaki gibi bir hata mesajı ile karşılaşılır: Örnekteki gibi tam hata mesajları test edene fazla bilgi sağlayarak başarılı bir enjeksiyon yapabilmelerine yardımcı olur. Bununla beraber, bazen uygulamalar hiçbir detay vermeden sadece '500 Server Error' veya özel hazırlanmış bir hata sayfası döndürebilir. Bu gibi durumlarda kör enjeksiyon teknikleri kullanmamız gerekir. Her durumda, tüm alanların ayrı ayrı test edilmesi çok önemlidir. Hangi parametrelerin etkilenip hangilerinin etkilenmediğin doğru olarak bulmak için parametrelerden sadece biri değiştirilip diğerleri sabit tutulmalı. Standart SQL Enjeksiyon Testi Buna benzer sorgular genelde web uygulamasının kullanıcı kimliğini doğrulaması gerektiğinde kullanılır. Eğer sorgu bir değer dönerse bu isim ve şifreye sahip bir kullanıcı olduğuna işaret eder ve kullanıcı sisteme alınır, aksi durumda erişimi engellenir. Giriş alanlarının değerleri genelde kullanıcı tarafından web formuna girilir. Aşağıdaki parametreleri girdiğimizi varsayalım: Sorgu aşağıdaki gibi olacaktır Kısa bir analiz sonrası sorgunun bir değer (veya birden fazla veri) döndüğünü görürüz çünkü şart her zaman doğrudur (OR 1=1). Bu durumda sistem kullanıcı adı ve şifreyi bilmeden kullanıcının kimlik doğrulamasını yapmış olur. Bir diğer sorgu tipi olarak: Bu durumda, iki problemimiz var, biri parantez kullanımı ve diğeri de MD5 hash fonksiyonunun kullanımı. İlk olarak parantez problemini çözelim. Bu basitçe doğru sorguyu tutturana kadar parantez kapama eklemektir. İkinci problemi çözmek için ikinci şartı geçersiz hale getirmeye çalışabiliriz. Sorgumuza yorum başlangıcı karakterini ekleyerek arkasından gelenlerin göz ardı edilmesini sağlayabiliriz. Her veritabanı yönetim sisteminin kendi yorum sembolleri vardır. Fakat çoğu veritabanında kullanılan genel bir sembol /* karakterleridir. Oracle da bu sembol -- karakterleridir. Bunu göz önüne alırsak kullanacağımız kullanıcı adı ve şifre değerleri: Bu sayede sorgu aşağıdaki gibi olur: URL isteği aşağıdaki gibi olur: Bazen kimlik doğrulama kodu döndürülen tuple'ın (veritabanında bir kayıt oluşturan veri seti) tam olarak 1'e eşit olduğunu kontrol eder. Önceki örneklerde bu durum zorluk çıkarırdı (veritabanında her kullanıcı için bir değer). Bu problemi aşmak için, döndürülen tuple'ın 1 olduğunu gösteren bir SQL komutu eklememiz yeterlidir. (Kayıt getirildikten sonra) bunu sağlamak için, "LIMIT <rakam>" komutunu kullanırız. <rakam> değeri döndürülmesini istediğimiz tuple sayısını belirtir. Buna göre önceki örneğimizdeki kullanıcı adı ve şifre alanı değerleri aşağıdaki gibi olur: Bu şekilde aşağıdaki gibi bir istek yapabiliriz: Union sorgusu SQL Enjeksiyon Testi Id değişkenine aşağıdaki değeri atayacağız: Aşağıdaki sorguya sahip olmuş olacağız: Bu da tüm kredi kartı kullanıcılarını orjinal sorgunun sonuçlarına ekleyecektir. ALL parametresi DISTINCT komutu kullanımını aşmak için gereklidir. Kredi kartı numaralarının yanında iki farklı değer daha seçtik. Bu iki değer önemsiz, eklenmesinin sebebi her iki sorgunun da aynı sayıda parametreye sahip olması gerekliliği. Aksi takdirde yazım hatası ile karşılaşılır. Kör SQL Enjeksiyon Testi (Blind SQL Injection) Bu engeli aşmak mümkün olabilmektedir. Metod çeşitli Boolean sorgularını sunucuya çalıştırmak, cevapları gözlemlemek ve cevapların anlamını çözmekten oluşur. Örneğimizde yine www.example.com sitesinde id parametresinin SQL enjeksiyondan etkilendiğini varsayalım. Eğer aşağıdaki isteği yaparsak: Bu fonksiyonlarile ilk karakter üzerinde testlerimizi gerçekleştireceğiz ve değeri bulduktan sonra ikinciye geçeceğiz. Bu tüm veri elde edilene kadar devam edecek. Test'de bir kerede sadece bir karakter seçilmesi için SUBSTRING fonksiyonu kullanılacak (tek bir karakter seçimi uzunluk parametresinin 1 olarak verilmesi ile oluyor) ve karakterin ASCII değerini elde etmek için ASCII fonksiyonu kullanılacak, böylece nümerik karşılaştırma yapabileceğiz. İstenen değeri bulabilmek için karşılaştırma sonuçları tüm ASCII tablosu ile yapılacak. Örnek olarak id parametresi için aşağıdakini gireceğiz: Bu da bize doğru veya yanlış bir değer dönecektir. Eğer doğru değer alırsak, sonuç çıkarma işlemimiz tamamlanmış demektir ve parametrenin değerini elde etmişiz demektir. Eğer yanlış değer alırsak, parametre değerinde null değeri var demek ve diğer bir null değeri bulana kadar bir sonrakini test etmeye devam etmemiz gerekmektedir. Kör SQL Enjeksiyon saldırısı çok yük sayıda sorguya ihtiyaç duyar. Test edenin bu iş için otomatik bir araç kullanması gerekir. Bu işlemi GET istekleri ile MySQL veritabanı için deneyen araçlardan biri olan SqlDumper ekran görüntüsü aşağıda görülebilir: Stored Procedure Enjeksiyon Stored procedure içinde dinamik SQL kullanırken, uygulama kod enjeksiyon riskini yok etmek için kullanıcı girişlerini doğru olarak filtrelemelidir. Eğer bu yapılmazsa kullanıcılar stored procedure içinde çalıştırılabilecek kötü amaçlı SQL girebilirler. Kullanıcı girişi: Yukarıdaki prosedür kullanıcı girişlerini doğru olarak filtrelemektedir. Örnekteki prosedür pek kullanıcı login işlemi için kullanılmaz. Başka bir örnek olarak kullanıcının görüntülemek istediği kolonları seçtiği bir dinamik raporlama sorgusunu ele alalım. Bu durumda da kullanıcı istediği kodu ekleyebilir. Aşağıdaki SQL sunucusu stored procedure'ünü ele alalım: Kullanıcı girişi: Bunun sonucunda rapor çalışır ve tüm kullanıcıların şifreleri güncellenir. Kaynak: http://www.owasp.org/index.php/Testing_for_SQL_Injection __________________________ (1 vote)
|
Benzer yazılarEtiketlerEn son forum mesajlarıYaklaşan Aktiviteler |
Son yorumlar
8 saat 5 min önce
23 saat 5 min önce
3 gün 21 saat önce
6 gün 3 saat önce
6 gün 22 saat önce
6 gün 23 saat önce
1 hafta 8 saat önce
1 hafta 2 gün önce
1 hafta 3 gün önce
2 hafta 5 gün önce