SQL Enjeksiyonu ve Veri Tabanı Güvenliği

Yük. Müh. Muhammet Ali Köker
11 min readJul 2, 2021

--

Veri tabanları genel olarak ortak özellikler içeren verileri barındırmakta ve ilgili organizasyonu sunmaktadır. Masaüstü, web, mobil ve gömülü sistem gibi her platformda veri tabanlarının farklı amaçlarla kullanıldığı görülmektedir.

Genel olarak veri tabanları şahıs ve kuruluş bağlamında kritik veriler içerebilmektedir. Örneğin bir şirketin işletme ile ilgili verileri veri tabanları üzerinde tutulabilmektedir. Benzer şekilde bir fabrikanın üretim ve kontrol sistemleri veri tabanı temelli çalışabilmektedir.

Her durumda veri tabanı sistemleri ilgili yazılım ve sistemin güvenliğini doğrudan etkilemektedir. Veri tabanı işlemlerinin gerçekleştirilmesini sağlayan SQL, uzun süredir kullanılan ve saldırganların hedefi haline gelen sorgu dilidir.

Makale kapsamında genel olarak veri tabanı ve ilgili sistemlerin güvenliğini önemli ölçüde etkileyen SQL enjeksiyonu kavramı ve ilgili süreçler değerlendirilecektir.

Şekil 1: SQL Enjeksiyonu

2. GENEL KAVRAMLAR

2.1. Veri Tabanı (DB, VT)

Bilgisayar sistemlerinde verilerin depolanması ve organizasyonu için farklı yöntemler önerilmektedir. Bu bağlamda genel olarak birbirleriyle ilişkili bilgilerin depolandığı ve ilgili yöntemlerle yapılandırıldığı alanlar veri tabanı olarak tanımlanmaktadır [2].

Dosya sistemleri (NTFS, FAT, ext4) dizin ve dosyaların diskte nasıl saklanacağını belirlemektedir. İşletim sistemleri donanım ve yazılım arasında ilgili süreçte ara katman durumundadır.

Veriler doğrudan dosyalarda tutulabileceği gibi daha yüksek sorgu yeteneklerine sahip veri tabanlarında da tutulabilmektedir. Dosya sistemlerine göre bir üst katmanda, amaca yönelik daha iyi veri yönetimi sunan veri tabanları tasarlanmıştır. Aslında veri tabanları da verileri dosyalarda tutmakta ancak ek olarak indeksleme gibi süreçlerle daha gelişmiş organizasyon sunmaktadır.

Veri tabanı mimarisinde amaca yönelik farklı tasarım modelleri temel alınmaktadır. Şekil 2’de gösterildiği gibi veriler niteliklerine göre ilgili veritabanının farklı tablolarında satır ve sütunlarla tutulmaktadır. Söz konusu tabloların doğru bir şekilde normalize edilmesi ve indekslenmesi sonucunda kayıtlı verilerin daha iyi organizasyonu sağlanmaktadır.

Şekil 2: Veri Tabanı Yapısı

2.2. Veri Tabanı Sistemi (DBMS, VTYS)

Veritabanı sistemleri, ilgili veritabanı için verinin kaydedilmesi ve diğer süreçleri yöneten yazılımlardır. Tüm veritabanı sistemlerinde alınan sorgu ve komutları işleyen bileşenler — sunucular bulunmaktadır.

Örneğin Microsoft Access, MongoDB, MySQL, Oracle, SQLite, Sybase, Informix, PostgreSQL, SQL Server farklı özelliklerdeki veritabanı sistemleridir. Her bir veritabanı sistemi ve sunucusu için çeşitli veri sorgulama teknikleri geliştirilmiştir.

Şekil 3’te günümüzde yaygın olarak kullanılan veri tabanı sistemlerinin ve ilgili yazılımların logoları bulunmaktadır.

Şekil 3: Veri Tabanı Sistemleri

2.3. Yapısal Sorgu Dili (SQL)

SQL, Structured Query Language (Yapısal Sorgu Dili) anlamına gelmektedir.

Farklı veri tabanlarının ve veri tabanı yönetim sistemlerinde sorgu sürecinde farklılıklar bulunmaktadır. SQL, bazı veri tabanı sistemlerinde veri sorgulama ile ilgili yaygın yöntemlerden biridir [7].

Genel olarak veri tabanlarında yeni bir kayıt ekleme; mevcut kayıtlarda arama, listeleme, düzenleme, silme, kopyalama, taşıma gibi işlemleri SQL ile gerçekleştirilmektedir.

Birçok veri tabanı sisteminde ortak olarak kullanılan SQL komutları Tablo 1’de gösterilmektedir.

ALTER DATABASE

Veritabanı özelliklerini değiştirmektedir.

ALTER TABLE

Tablo özelliklerini değiştirmektedir.

CREATE DATABASE

Veritabanı oluşturmaktadır.

CREATE INDEX

Index oluşturmaktadır.

CREATE TABLE

Yeni bir tablo oluşturmaktadır.

DELETE

Kayıt silmektedir.

DROP INDEX

Index silmektedir.

DROP TABLE

Tablo silmektedir.

INSERT INTO

Yeni kayıt eklemektedir.

SELECT

Kayıtları seçer ve listelemeyi sağlamaktadır.

TRUNCATE TABLE

Tabloyu boşaltmaktadır.

UPDATE

Kayıtları güncellemektedir.

Tablo 1: Ortak SQL Komutları

2.4. SQL Komut Türleri

SQL komutları genel olarak DQL, DDL, DML ve DCL olmak üzere 4 temel dil ile ele alınmaktadır.

2.4.1. DQL (Data Query Language)

Veri tabanında mevcut verileri ile ilgili sorgulama sağlayan komutları içermektedir. Burada amaç genel olarak ilgili verilerin belirlenen sınırlamalarla okunmasını sağlamaktır.

SELECT komutu ilgili tablo veya komut kümesi için seçim sağlamaktadır. Söz konusu komutta FROM ifadesinden sonra tablo, WHERE ifadesinden sonra koşul, LIKE ifadesinden sonra örüntü, ORDER BY ifadesinden sonra da sıralama ile ilgili sütunlar belirtilmektedir.

· SELECT * FROM kitaplar

· SELECT * FROM kitaplar WHERE isim=‘nutuk’

· SELECT isim, yazar FROM kitaplar WHERE yazar LIKE ‘%kemal%’

· SELECT isim FROM kitaplar WHERE kategori=‘matematik’ ORDER BY satis DESC

2.4.2. DDL (Data Definition Language)

Veri tabanı, tablo, indeks gibi temel bileşenlerin ön tanımlamasını sağlamaktadır.

CREATE komutu ile veri tabanı, tablo veya index oluşturulmaktadır.

· CREATE DATABASE kutuphane

· CREATE TABLE kitaplar (id INT PRIMARY KEY, isim CHAR(50), yazar CHAR(50))

· CREATE UNIQUE INDEX yazarindex ON kitaplar(yazar)

ALTER komutu ile tablo izin düzenleme gerçekleştirilmektedir.

· ALTER TABLE kitaplar ADD konu CHAR(50)

· ALTER TABLE kitaplar DROP COLUMN konu

· ALTER TABLE kitaplar MODIFY konu CHAR(60)

DROP komutu ile ilgili veri tabanı veya index silinmektedir.

· DROP TABLE kitaplar

· DROP INDEX kitapindex

TRUNCATE komutu ile ilgili tablonun kayıtları ve otomatik artan id değeri gibi değerleri temizlenmektedir. İlgili işlemlerde işlem günlüğü (transaction log) üzerinde kayıt tutulmamaktadır. Ayrıca WHERE gibi sınırlandırıcı parametreleri desteklememektedir.

· TRUNCATE TABLE kitaplar

2.4.3. DML (Data Manipulation Language)

Genel olarak kayıtlı verileri ilgilendirmekte ve söz konusu verilerde değişikliğe sebep olan komutları içermektedir.

DELETE komutu ilgili kayıt veya kayıtlar için silinmektedir. İlgili işlemlerde işlem günlüğü (transaction log) üzerinde kayıt tutulmaktadır. Ayrıca işlem WHERE gibi parametrelerle sınırlandırılabilmektedir. İlgili komutun kullanımında değişiklik hedeflenen verilere dikkat edilmesi gerekmektedir.

· DELETE FROM kitaplar

· DELETE FROM kitaplar WHERE id=2020

UPDATE komutu ilgili kayıt veya kayıtlar için güncelleme yapılmaktadır. Bu komutta da değişiklik hedeflenen kayıtlar için DELETE komutu ile benzer şekilde WHERE parametresi kullanmaktadır. Ayrıca değişiklik istenen alanlar için SET parametresi kullanılmakta, bu kapsamda birden çok alan virgüllerle ayrılabilmektedir.

· UPDATE kitaplar SET yazar=‘Muhammet Ali Köker’

· UPDATE uyeler SET sifre=‘Aeda.2021’ WHERE kullaniciadi=‘alikoker’

· UPDATE uyeler SET isim=‘Muhammet Ali’, soyisim=‘Köker’ WHERE kullaniciadi=‘alikoker’

INSERT komutu ilgili tabloya ekleme yapılmaktadır.

· INSERT INTO kitaplar (isim, yazar) VALUES (‘Nutuk’, ‘Mustafa Kemal Atatürk’)

· INSERT INTO isimler (isim, soyisim, meslek) VALUES (‘Muhammet Ali’, ‘Köker’, ‘Bilgisayar Mühendisi’)

2.4.4. DCL (Data Control Language)

Veri tabanı üzerinde yetki kontrolü gibi işlemleri sağlayan komutları içermektedir.

GRANT komutu ile veri tabanı, tablo gibi nesneler için ilgili kullanıcı temelinde yetki verilmektedir.

· GRANT SELECT ON kitaplar TO *.*

· GRANT SELECT ON kitaplar TO alikoker WITH GRANT OPTION

REVOKE komutu ile daha önce tanımlanan yetkiler alınmaktadır.

· REVOKE SELECT ON kitaplar TO *.*

Tablo 2’de söz konusu komutlar ve ilgili diller özet olarak gösterilmektedir.

DQL (Data Query Language)

SELECT

DDL (Data Definition Language)

CREATE, ALTER, DROP, TRUNCATE

DML (Data Manipulation Language)

INSERT, UPDATE, DELETE

DCL (Data Control Language)

GRANT, REVOKE

Tablo 2: SQL Komut Türleri

3. SQL ENJEKSİYONU

3.1. Tanım

SQL Injection, SQL ile sorgulama yapılan sistemlerde saldırı amaçlı komut çalıştırma tekniğidir. Sonuçta hedef sistem web sitesi, masaüstü uygulaması, mobil uygulama olabilmektedir.

Kullanıcıların sisteme giriş yaptığı, sistemdeki verileri okuduğu ve ilgili verileri düzenlediği alanlarda ilgili katmandaki yazılım ile veri tabanına erişim söz konusu olmaktadır [8].

Örneğin bir web sitesi istemciden gelen istekleri yanıtlayan web sunucusu ile hizmet vermektedir. Ayrıca söz konusu sunucu veri tabanı sunucusu ile iletişim kurmakta ve ilgili komutları çalıştırmaktadır. Bu noktada SQL Injection ilgili sunucuya yapılan istekler amaca göre manipüle edilebilmektedir.

Şekil 4’te SQL enjeksiyonu ile bir kullanıcı giriş formunun şifre olmadan aşılması gösterilmektedir.

Şekil 4: SQL Enjeksiyonu

3.2. Web Yazılımlarında SQL Enjeksiyonu

Web yazılımlarında form, HTML’de ilgili etiketler arasındaki kontroller ile istemci verilerini sunucuya iletmektedir.

Şekil 5’te gösterildiği gibi istemci tarafında form ile kullanıcı girişi yapılmaktadır.

Şekil 5: Kullanıcı Girişi Web Formu

Ayrıca Şekil 6’daki gibi sunucu tarafında da SQL ile kullanıcı adı ve şifre doğrulanmaktadır. Seçili satırda ilgili değişkenlerin herhangi bir önlem alınmaksızın string üzerinde birleştirildiği görülmektedir. Bu durumda saldırgan ilgili komutu manipüle edebilmekte, amacına yönelik olarak değiştirebilmektedir. Bu süreçte ek olarak veri tabanı güvenliğini artırmak amacıyla SqlConnection nesnesi ile ilgili veri tabanı kullanıcısının yetkileri sınırlandırılmakta, kullanıcı adı ve parola gibi bilgiler tümleşik güvenli dosyalarda tutulmaktadır.

Şekil 6: Sunucu Tarafında Kimlik Doğrulama

İstemci tarafında bu örnek için form ile SQL Injection yapılabilmektedir. Bu durumda Şekil 7’de gösterildiği gibi sunucu tarafında şifre olmaksızın sisteme erişilecektir.

Şekil 7: Form Tabanlı SQL Enjeksiyonu

Benzer şekilde URL üzerinden de bilgi aktarımı söz konusu olmaktadır. Form için “GET” isteklerinde ilgili URL için sondaki sorgu dizisinde (query string) bilgiler aktarılmaktadır. Bunun dışında doğrudan iletim de mümkün olmaktadır. Her durumda ilgili SQL enjeksiyonu açığıyla ilgili olarak sisteme parolasız giriş mümkün olmaktadır.

Şekil 8’de URL ile kullanıcı giriş bilgilerinin gönderildiği ve sisteme parola girişi yapılmaksızın giriş sağlandığı görülmektedir.

Şekil 8: URL Tabanlı SQL Enjeksiyonu

3.3. Masaüstü Yazılımlarında SQL Enjeksiyonu

Benzer durum masaüstü uygulamalarında da mümkündür. Şekil 9’da C# .NET üzerinde Windows Forms tabanlı uygulama için SQL Injection gösterilmektedir.

Şekil 9: Masaüstü Yazılımlarda SQL Enjeksiyonu

3.4. Mobil Yazılımlarında SQL Enjeksiyonu

Mobil uygulamalarda da SQL sorgusu söz konusuysa SQL Injection gerçekleştirilebilir. Örneğin Şekil 10’da gösterilen Android uygulamasında girilen anahtar kelime ile eşleşen kullanıcı adlarının, SELECT SQL sorgusu ile listelenmesi sağlanmaktadır. Burada önlem alınmadığı takdirde SQL Injection ile veri tabanı üzerinde değişiklik yapılabilmekte veya veri tabanında yer alan başka bilgilere erişilebilmektedir.

Şekil 10: Mobil Yazılımlarda SQL Enjeksiyonu

4. ETKİLER VE AYRINTILAR

4.1. Veri Tabanı Değişiklikleri

Saldırgan sisteme SQL Injection ile veri tabanında ekleme, değiştirme, silme gibi işlemler yapabilmektedir. Örneğin Şekil 11’de gerçekleştirilen işlem «MyTable» tablosunun kayıtlarını silecektir.

Şekil 11: Veri Tabanı Değişiklikleri

4.2. Açık Arama

Saldırgan SQL enjeksiyonu ile hedef sistemde açık arayabilmektedir. Şekil 12’de açık arama süreci gösterilmekt3edir.

Şekil 12: Açık Arama

4.3. Tespit ve Saldırı

Bir web tarayıcısı veya ağa erişen başka yazılımlar ile SQL Injection gerçekleştirilebilir. Ayrıca saldırganlar ve sızma testi uzmanları için SQL Injection’ı kolaylaştıracak araçlar mevcuttur. SQLMap, jSQL Injection bu araçlara örnek verilebilir.

Şekil 13’te SqlMap gösterilmektedir.

Şekil 13: SqlMap

4.4. Veri Türüne Göre SQL Enjeksiyonu

SQL enjeksiyon ile gerçekleştirilen işlemlerde temelde 2 tür söz konusudur:

Sayısal Veri SQL Saldırıları: Genellikle tanımlayıcı değer (id) ile ilgili saldırılardır.

String Veri SQL Saldırıları: Karakter katarı olarak bilinen veriler hedeflenmektedir.

4.5. Veri Çekme Yöntemine Göre SQL Enjeksiyonu

SQL enjeksiyon saldırılarının veri çekme yöntemine göre 2 türü bulunmaktadır:

Bant İçi (Inband) SQL Saldırıları: Saldırganın saldırı öncesinde ve sırasında aynı iletişim kanalını kullandığı saldırı türüdür.

Bant Dışı (Out Of Band) SQL Saldırıları: Saldırganın temel iletişim kanalından farklı kanal kullandığı ve genel olarak dosyaya yazma işlemlerinin gerçekleştirildiği saldırı türüdür.

4.6. Hata Tabanlı SQL Enjeksiyonu

Veri tabanının hata iletileri üretmesine ve ilgili açıkların bulunmasına yönelik saldırılardır [5]. 2 yaygın türü bulunmaktadır:

Birliğe Dayalı (Union) SQL Saldırıları: Şekil 14’teki gibi tek HTTP yanıtı üzerinden UNION operatörü ile birleştirilmiş büyük ölçekte veri almaya yöneliktir. Söz konusu operatör ile SELECT sorgusu ile elde edilen sonuç kümeleri (result set) birleştirilmektedir.

Çift Sorguya Dayalı (Double) SQL Saldırıları: İki farklı SQL sorgusunun tek sorgu ile birleştirildiği saldırı türüdür. Genel olarak daha hızlı çalışan saldırı yöntemi olarak değerlendirilmektedir. Şekil 14’te benzeri saldırılar gösterilmektedir.

Şekil 14: SQL Enjeksiyonu Süreci

4.7. Çıkarım Tabanlı SQL Enjeksiyonu

Saldırganın öncelikle sunucuya veri göndererek ilgili yanıtı ve davranışı gözlemlediği saldırılardır. 2 grup altında değerlendirilmektedir:

Mantık Tabanlı (Boolean): Veri tabanına gönderilen SQL sorgu sonuçlarından doğru (true) veya yanlış (false) olarak ifade edilebilecek çıkarım yapmaktadır.

Zaman Tabanlı: Gönderilen isteklerle ilgili isteğin veri tabanına erişip erişmediğini, eriştiyse ne kadar zaman geçtiğini belirlemektedir. İlgili süreçte genellikle sleep(), benchmark() gibi komutlar kullanılmaktadır.

4.8. Önleme Yöntemleri

SQL enjeksiyonu saldırılarını önlemek için birçok yöntem mevcuttur.

· Veri tabanı yazılımı ve diğer yazılım bileşenleri benzeri güvenlik açıklarına karşı güncel tutulmaktadır.

· Ağ trafik izleme yazılım ve sistemleri kullanılmaktadır.

· Veri tabanı sunucuları için özelleşmiş veri tabanı güvenlik duvarları (database firewall) kullanılmakta ve yapılandırılmaktadır [9].

· Veri tabanı trafiği sürekli izlenmekte; SQL enjeksiyonu, veri ihlali ve ayrıcalıklı kullanıcı tabanlı saldırılar izlenmektedir.

· İlgili saldırıları tespit ederek proaktif koruma sunan yazılımlar kullanılmaktadır.

· Veri tabanı üzerindeki olası işlemler için etkinlik izleme (activity monitoring) ve audit (günlük tutma, logging) sistemleri kullanılmaktadır.

· Sisteme sızmayı önlemek amacıyla veri tabanı güvenliği için özelleştirilmiş imza analizi (signature analysis) yöntemi kullanılmaktadır.

· Veri ihlallerini önlemek amacıyla veri tabanı ile ilgili her türlü işlemde beyaz liste (white list) ve kara liste (black list) temelli filreleme yöntemlerine başvurulmaktadır.

· Kritik veriler maskelenmekte, kullanıcıdan gizlenmektedir.

· Veri tabanı kullanıcıları ve ilgili veri tabanında kayıtlı kullanıcılarla ilgili olarak daha güçlü parola tanımlama zorunlu tutulmakta, ilgili parolaların periyodik olarak değişikliği sağlanmaktadır.

· Olası veri ihlallerinde güvenliği artırmak için parola gibi veriler SHA-256 gibi hash (özetleme) algoritmaları ile tutulmaktadır.

· Kullanıcıdan alınan form girişlerinde, URL parametrelerinde ve cookie değerlerinde SQL ile ilgili noktalama işaretlerini değiştirilmektedir.

· E-posta, kullanıcı adı gibi girdiler öncelikle doğrulama (validation) işleminden geçirilmektedir.

· Sayısal değerleri integer (tamsayı) değerlerine dönüştürmektedir.

· Sunucu tarafında ilgili programlama diline bağlı olarak SqlParameterCollection.AddWithValue gibi Sql Injection’u önleyen sınıf metodları kullanılmaktadır.

· Veri tabanı ile ilgili açık oluşturabilecek hata mesajları kullanıcıdan gizlenmektedir.

· Saldırı yüzeyini daraltmak amacıyla veri tabanına erişim sağlayan kod bloklarından gereksiz olanlar kaldırılmakta veya devre dışı bırakılmaktadır.

· Veri tabanı sisteminin yapılandırılmasında erişim yönetimi ve risk analizi ile ilgili yaygın güvenlik artırıcı süreçlere başvurulmaktadır.

· Kullanıcı ve veri tabanı arasında Şekil 15’te gösterilen ağ, web uygulaması (WAF) ve veri tabanı (DBF) özelinde güvenlik duvarları kullanılmaktadır.

Şekil 15: Kullanıcı ve Veri Tabanı Arasındaki Güvenlik Katmanları

5. SONUÇLAR

SQL enjeksiyonu, veri tabanı ve ilgili diğer sistemlerin güvenliğini tehdit eden oldukça önemli bir saldırı türüdür. İlgili saldırılar ile hedef sistemden kritik veriler ele geçirilebilmekte, işlemler manipüle edilebilmekte ve sisteme zarar verilebilmektedir.

Saldırılar sonucunda ekonomi, itibar gibi yönlerden kayıplar söz konusu olmakta; ülke güvenliğini bile etkileyebilecek sorunlar meydana gelmektedir.

Bir sistem tüm bileşen ve unsurlarıyla bir bütündür. Sistem güvenliğini sağlamak amacıyla her alt bileşenin güvenliğini sağlamak gerekmektedir. Bu bağlamda saldırıları önleyecek süreçlere önem verilmelidir.

Şekil 16: Veri Tabanı Güvenliği

KAYNAKÇA

http://www.alikoker.com.tr/sql-enjeksiyonu

[1] Anley, C. (2002). Advanced SQL injection in SQL server applications.

[2] Bandhakavi, S., Bisht, P., Madhusudan, P., & Venkatakrishnan, V. N. (2007, October). CANDID: preventing SQL injection attacks using dynamic candidate evaluations. In Proceedings of the 14th ACM conference on Computer and communications security (pp. 12–24).

[3] Boyd, S. W., & Keromytis, A. D. (2004, June). SQLrand: Preventing SQL injection attacks. In International Conference on Applied Cryptography and Network Security (pp. 292–302). Springer, Berlin, Heidelberg.

[4] Clarke-Salt, J. (2009). SQL injection attacks and defense. Elsevier.

[5] Halfond, W. G., Viegas, J., & Orso, A. (2006, March). A classification of SQL-injection attacks and countermeasures. In Proceedings of the IEEE international symposium on secure software engineering (Vol. 1, pp. 13–15). IEEE.

[6] Kemalis, K., & Tzouramanis, T. (2008, March). SQL-IDS: a specification-based approach for SQL-injection detection. In Proceedings of the 2008 ACM symposium on Applied computing (pp. 2153–2158).

[7] Kieyzun, A., Guo, P. J., Jayaraman, K., & Ernst, M. D. (2009, May). Automatic creation of SQL injection and cross-site scripting attacks. In 2009 IEEE 31st international conference on software engineering (pp. 199–209). IEEE.

[8] Junjin, M. (2009, April). An approach for SQL injection vulnerability detection. In 2009 Sixth International Conference on Information Technology: New Generations (pp. 1411–1414). IEEE.

[9] Shar, L. K., & Tan, H. B. K. (2012). Defeating SQL injection. Computer, 46(3), 69–77.

[10] Sadeghian, A., Zamani, M., & Abdullah, S. M. (2013, September). A taxonomy of SQL injection attacks. In 2013 International Conference on Informatics and Creative Multimedia (pp. 269–273). IEEE.

[11] Spett, K. (2002). SQL injection.Things Security and Data Protection. Springer International Publishing.

--

--

Yük. Müh. Muhammet Ali Köker

Bilgisayar ve Mekatronik Mühendisi, İçişleri Bakanlığı & Argus, Adli Bilişim & Siber Güvenlik MSc, İşletme BSc, MARMARA GAZİ AKÜ İÜ SAÜ KKÜ, www.alikoker.com.tr