SQL Injection Nedir?

SQL Injection Nedir?

SQL veritabanı sistemi kullanan web sitelerini veya web uygulamalarını etkileyen siber saldırı türlerini araştıranların SQL Injection Nedir? sorusunun peşine düşmesi kaçınılmazdır.

SQL Injection, 1998’de keşfedilmesine rağmen hala etkili olan ve kişilerin, kuruluşların hatta ülkelerin kritik verilerini çalmak, değiştirmek, rehin almak için sıklıkla gerçekleştirilen bir siber tehdit türüdür.

SQL enjeksiyonunu anlamak için SQL’in ne olduğunu hatırlamak yararlı olabilir.

SQL Nedir?

SQL (Structured Query Language), Yapılandırılmış Sorgu Dili anlamına gelir. Bu dil temel olarak ilişkisel veritabanı ile etkileşim için geliştirilmiştir. Gerekli verilere erişme, veri ekleme, veritabanını değiştirme veya sorgu amacıyla kullanılan SQL; Microsoft SQL Server, Oracle, IBM DB2 ve MySQL gibi ilişkisel veritabanları için komut ve kontrol dilidir. Modern web geliştirmede ilişkisel veritabanları, PHP, .NET, Java EE, Hibernate, SQLite gibi betik dillerinde yazılmış web uygulamalarının ve içerik yönetim sistemlerinin arka ucunda kritik bir kaynaktır.

Dilerseniz SQL’in avantajları, nasıl çalıştığı ve kullanım alanlarından bahsettiğimiz SQL Nedir? Ne İşe Yarar? adlı yazımıza göz atabilirsiniz.

SQLi Nedir?

SQL Injection ya da SQLi denen siber saldırı türü, web sayfası ve web uygulaması güvenlik önlemlerini atlamayı mümkün kılan bir korsanlık tekniğidir. Saldırganı SQL enjeksiyonu kullanmaya çeken; kritik veri hazinelerinin cazibesidir. Bu saldırı tekniğini kullanarak, bilgisayar korsanları bir SQL veritabanının içeriğini ele geçirebilir, değiştirebilir ve silebilir.

Uzun süredir OWASP TOP 10’da yer alan ve en eski güvenlik açıklarından biri olan SQL enjeksiyonu, istemciden uygulamaya giriş verileri aracılığıyla bir SQL sorgusunun eklenmesiyle gerçekleştirilir. SQL komutları, önceden tanımlanmış SQL komutlarının yürütülmesini etkileyen veri düzlemi girişine enjekte edilir.

Bir web uygulaması veya web sitesi Oracle, SQL Server veya MySQL gibi SQL veritabanlarını kullanıyorsa, SQL enjeksiyon saldırısına karşı savunmasız kalabilir. SQL Injection, şirketleri; tüm veritabanından yararlanılması açısından en korunmasız bırakan tehditlerden biri olmasıyla ünlüdür.

Bilgisayar korsanı, veri veya tabloları veritabanından silmeye kalktığında, yedekleri olsa bile, verilerin silinmesi, veritabanı geri yüklenene kadar uygulamanın kullanılabilirliğini etkileyecektir. Ayrıca, yedeklemeler son girilen verileri içermeyebilir.

Saldırganlar, veritabanındaki verileri değiştirerek SQL enjeksiyonunu ciddi tehditler oluşturacak şekilde kullanabilir, örneğin bir finansal uygulamada hesap bakiyelerini değiştirilebilir. Daha da kötüsü, saldırganlar bir uygulamanın veritabanında yönetici hakları elde edebilir.

SQL enjeksiyon saldırılarında en yaygın risk, e-posta adresleri ve oturum açma bilgilerinin çalınması ve dark web’de satılmasıdır. Bu nedenle başarılı bir SQL enjeksiyonu sadece kurumlar için değil, kullanıcılar ve müşteriler için de büyük tehdit oluşturmaktadır.

SQL Injection Saldırıları Nasıl Gerçekleştirilir?

SQLi Nedir?, SQL Injection Nedir?
Başarılı bir SQL enjeksiyon saldırısı, veritabanınızdan e-posta, kullanıcı adı, parola ve kredi kartı ayrıntıları gibi hassas verileri okuyabilir, değiştirebilir veya silebilir.

Bir kişinin veya kuruluşun verilerini silme, değiştirme, yedekleme, sisteme virüs ekleme, operasyonlara zarar verme gibi amaçlarla kullanılan SQL Injection, uygulamanın istemci ucundan SQL sorgu girişi eklenerek veya enjekte edilerek yapılır.

SQL enjeksiyonu için saldırganın bir web uygulamasında veya web sayfasında güvenlik açığı olan bir girişi bulması gerekir.

SQL enjeksiyonu, veriler güvenilmeyen bir kaynaktan bir programa girdiğinde ve bu veriler dinamik olarak bir SQL sorgusu oluşturmak için kullanıldığında gerçekleşir. Yanıt, saldırganın veritabanı mimarisini anlaması ve uygulamanın güvenli bilgilerine erişmesi için gereklidir. Bilgisayar korsanı, özel olarak hazırlanmış bir SQL komutuyla veritabanı yapısı hakkında net fikir sağlayan bir yanıt elde ederek veritabanındaki tüm bilgilere erişebilir.

SQL, kontrol düzlemi ile veri düzlemi arasında ayrım yapmadığından, saldırgan bir meta karakter yerleştirebilir (veri olarak yorumlanmayan bir karakter, alt çizgi _ gibi).

Çocukların bile gerçekleştirebileceği kadar basit bir saldırı türü olan SQL enjeksiyonu ile bir saldırgan eklediği bir kodla parola bilgisi gerekmeksizin kimlik doğrulamasını atlayabilir.

SQL Injection saldırılarının gerçekleştirildiği farklı yolları şu şekilde sıralayabiliriz:

Kullanıcı girişine dayalı SQL enjeksiyonu: Web uygulamaları, kullanıcının girdilerini; işlenmek üzere veritabanına ileten formlar aracılığıyla kabul eder. Uygulamalar bu girdileri sterilize etmeden kabul ederse, saldırgan form alanları aracılığıyla SQL ifadeleri enjekte edebilir ve veritabanının içeriğini silebilir, kopyalayabilir veya değiştirebilir.

Çerezlere dayalı SQL enjeksiyonu: Web uygulamaları genellikle tanımlama bilgileri yükler ve verilerini veritabanı işlemlerinin bir parçası olarak kullanır. Bu tür SQL enjeksiyonu, tanımlama bilgilerini veritabanı sorgularını “zehirleyecek” şekilde değiştirir. Kötü niyetli bir kullanıcı veya bir kullanıcının cihazına dağıtılan kötü amaçlı yazılım, arka uç veritabanına beklenmedik bir şekilde SQL enjekte etmek için tanımlama bilgilerini değiştirebilir.

HTTP başlıklarına dayalı SQL enjeksiyonu: HTTP başlıkları gibi sunucu değişkenleri SQL enjeksiyonu için de kullanılabilir. Bir web uygulaması HTTP başlıklarından girdileri kabul ederse, rastgele SQL içeren sahte başlıklar veritabanına kod enjekte edebilir.

İkinci dereceden SQL enjeksiyonu: En karmaşık SQL enjeksiyon saldırılarıdır çünkü uzun bir süre uykuda kalabilirler. İkinci dereceden SQL enjeksiyon saldırısı, bir bağlamda iyi huylu olarak kabul edilebilecek ancak başka bir bağlamda kötü amaçlı olan zehirli veriler sunar. Geliştiriciler tüm uygulama girişlerini sterilize etseler bile bu tür saldırılara karşı savunmasız kalabilirler.

SQL Injection Türleri

SQL Injection Saldırıları Nasıl Gerçekleştirilir?, SQL Injection Türleri
SQL enjeksiyonunu önlemek için dinamik sorgulara izin vermemeniz ya da kötü niyetli SQL içeren, kullanıcı tarafından sağlanan girdilerin sorgunun mantığını etkilemesini önlemeniz gerekir.

En popüler saldırı türü olan bant içi (In-band) SQL enjeksiyonları aynı iletişim kanalını kullanır ve iki şekilde gerçekleşir:

  • Hata tabanlı (Error-based): Hata tabanlı SQL enjeksiyon tekniği, uygulama veritabanı sunucuları tarafından atılan hata mesajlarına dayanır. Saldırganlar, hangi sorguların hata mesajları aldığını test ederek, veritabanı yapısına dayalı olarak hedeflenen SQL enjeksiyonları oluşturabilir.

  • Union-based: Bir uygulama SQL enjeksiyonuna karşı savunmasız olduğunda ve uygulamanın yanıtları bir sorgu için sonuçları döndürdüğünde, saldırganlar uygulama veritabanının tablolarından veri almak için UNION anahtar sözcüğünü kullanır.

Inferential (Çıkarımsal) SQL enjeksiyonu, Blind SQL enjeksiyon saldırısı olarak da bilinir. Bu saldırıda, bir veri yükü gönderdikten sonra, saldırgan veritabanının veri yapısını belirlemek için davranışı ve yanıtları gözlemler. İki türde görülür:

  • Boole tabanlı: Saldırganlar, uygulamayı DOĞRU veya YANLIŞ’ın farklı sonuçlarını döndürmeye zorlayan SQL sorguları göndererek, belirli yüklerin meşru sonuçlar döndürüp döndürmediğini anlayabilir.

  • Time-based: Zamana dayalı olarak adlandırabileceğimiz bu yöntem, veritabanından yanıt vermeden önce belirli süre beklemesini isteyen SQL sorguları gönderir. Zamana dayalı SQL enjeksiyon saldırısı, genellikle bir uygulama genel hata mesajları verdiğinde kullanılır. Bu teknik, veritabanını belirli bir süre beklemeye zorlar. Yanıt süresi, saldırganın sorguyu DOĞRU veya YANLIŞ olarak belirlemesine yardımcı olur.

Her iki durumda da, saldırganların verileri karakter karakter numaralandırması gerektiği düşünüldüğünde, Inferential SQL enjeksiyon saldırı yöntemleri oldukça zorludur.

Out-of-band (Bant Dışı) SQL enjeksiyon saldırıları en az kullanılan SQL injection tekniğidir. Bant dışı SQL enjeksiyon saldırısı, uygulamanın verileri herhangi bir protokol (HTTP, DNS veya SMB) aracılığıyla iletmesini ister.

SQL Enjeksiyonu Güvenlik Açıkları Nasıl Tespit Edilir?

SQLi güvenlik açıklarını tespit etmek için uygulamanıza veya web sitenize saldırılar başlatmanız önerilir. Bu açıkları bulmak için manuel test ve otomatik test olmak üzere iki teknik kullanılır. Manuel testte, uygulama geliştirme sırasında, SQL enjeksiyonu güvenlik açığının tespit edilmesine yardımcı olan bir dizi test söz konusudur.

Otomatik test için SQLMap gibi çeşitli araçlar bulunmaktadır. Genellikle bu araçlar, kullanımda olan veritabanı türünü belirlemek için sitenizi inceler ve sorgular oluşturur. Keşfedilen bazı güvenlik açıklarının kaldırılmasına yardımcı olabilecek hata düzeltme özelliği de içerirler.

SQL Injection Nasıl Önlenir?

SQL Enjeksiyonu Güvenlik Açıkları Nasıl Tespit Edilir?
Teknik olarak, bir SQL enjeksiyon saldırısını önlemenin tek yolu, olası kötü amaçlı kodları filtrelemek için kullanıcılar tarafından girilen girdilerin izlenmesi ve sterilize edilmesidir.

Bildiğiniz üzere sürümler ve uzantılar düzenli yükseltmeler gerektirir. Eski sürümler veya kodlar oldukça savunmasızdır ve uygulamanızın bütünlüğünü koruyamayabilir. Eski kodu gözden geçirmek ve güvenlik açıklarından kaçınmak için yama uygulanmış ve yükseltilmiş kod sürümlerini çalıştırmak tatsız sürprizlerden kaçınmak için çok önemlidir.

Bir SQL enjeksiyon saldırısını önlemenin ilk adımı, hangi uygulamaların savunmasız olduğunu belirlemektir. Gerçek şu ki bir SQL veritabanıyla etkileşime giren herhangi bir web sitesi risk altındadır.

SQL enjeksiyonunu önlemek için dinamik sorgulara izin vermemeniz ya da kötü niyetli SQL içeren, kullanıcı tarafından sağlanan girdilerin sorgunun mantığını etkilemesini önlemeniz gerekir.

Teknik olarak, bir SQL enjeksiyon saldırısını önlemenin tek yolu, olası kötü amaçlı kodları filtrelemek için kullanıcılar tarafından girilen girdilerin izlenmesi ve sterilize edilmesidir. Bu tam olarak bir web uygulaması güvenlik duvarının (WAF) yaptığı şeydir. Kullanıcıların web uygulamasına girdiği tüm girdileri analiz ederek şüpheli kodlarla eşleşmeleri bulur. Potansiyel olarak tehlikeli web isteklerini filtrelemek söz konusu olduğunda, yazılım veya cihaz tabanlı bir WAF kullanışlıdır. WAF’ların SQL enjeksiyonu savunması, veritabanına sızma girişimlerinin çoğunu ezebilir.

Ek olarak SQL enjeksiyonu saldırılarını önlemeye yönelik en bilinen önerileri şu şekilde sıralayabiliriz:

  • Parametreli Sorgular: Parametreli sorgu, parametrelerin yer tutucu olarak kullanıldığı ve yürütme zamanında sağlandığı bir sorgudur. Bu sorgu türünde, parametrelerin veri türleri önceden tanımlanır ve bazı durumlarda varsayılan değerler de ayarlanır. Bunu yapmak, SQL enjeksiyon sorgularının başarısız olmasına neden olur.

  • Saklı Prosedürler (Stored Procedures): Saklı prosedürler, uygulamadan çağrılan veritabanında tanımlanan ve saklanan SQL ifadeleridir. Saklı prosedürler, herhangi bir dinamik SQL üretimi içermeyen parametrelerle önceden oluşturulmuş SQL ifadeleridir. Saklı yordamlar da denen bu prosedürleri ayarlamak için geliştiricilerin, gerekli girdiler için parametrelerle SQL ifadeleri oluşturması gerekir. Saklı yordamlar ve parametreli sorgular arasındaki fark, saklı yordamların veritabanı içinde tanımlanması ve saklanması, ancak uygulamadan çağrılmasıdır. Ayrıca, saklı yordamlar bazı DBMS’lerde (varsayılan olarak mevcut değildir) yürütme hakları gerektirdiğinden, kullanıcı erişimi vermek yerine en az ayrıcalığa sahip ayrı bir hesap oluşturmak önemlidir.

  • İzin Verilenler Listesi Giriş Doğrulaması (Allowlist Input Validation): İzin verilenler listesi girdi doğrulaması, harici girdileri bilinen, onaylanmış bir dizi girdiye karşı kontrol eder ve eşleşmeyen girdilerde başarısız olur. Bu, yalnızca bağlama değişkenlerine izin verilmeyen durumlarda kullanılmalıdır. İzin verilenler listesi giriş doğrulaması, girişi sorguya iletilmeden önce algılamak için bir yedekleme seçeneği de olabilir.

  • Kullanıcı Tarafından Sağlanan Tüm Girdilerden Kaçınmak: Tüm SQL enjeksiyonlarını engelleyemediği için bu yöntemi yalnızca önceki seçenekler mümkün değilse kullanmalısınız. Bu fazlasıyla veritabanına özgü bir uygulamadır. Her DBMS, karakterden kaçan bir düzeni destekler. Doğru şema kullanılarak tüm kullanıcı girdilerinden kaçınılırsa, DBMS, girdi ile geliştiriciler tarafından yazılan SQL kodunu ayırt edebilecektir.

  • En Az Ayrıcalık: En az ayrıcalık, SQL enjeksiyonuna karşı bir savunma değildir, ancak herhangi bir saldırının verebileceği hasarı sınırlamanın bir yoludur. En az ayrıcalık, uygulamanızın veritabanında sınırsız güce sahip olmadığı anlamına gelir. Bir saldırgan erişim elde ederse, verebileceği hasar sınırlı olacaktır. Root erişimi veya yönetici ayrıcalığına sahip bir hesap kullanarak uygulamaların veritabanlarına olan bağlantılarını engellemek etkili bir korumadır. Uygulama hesaplarının yalnızca ihtiyaç duydukları kadar izne sahip olmasını sağlamak gerekir. Hesaplara yalnızca tam olarak ihtiyaç duyulan erişim için izin vermeniz önerilir. Örneğin, bir hesabın salt okuma erişimine ihtiyacı varsa, yalnızca ihtiyaç duyduğu tablolara (hatta tablonun belirli bölümlerine) salt okunur erişimi olduğundan emin olmalısınız. Yapabiliyorsanız, veritabanı hesaplarına oluşturma veya silme erişimi vermekten kaçının. Her kullanıcının/uygulamanın ayrı bir hesabı olmalıdır. Ayrıca, veritabanı yönetim sisteminin (DBMS) altında çalıştığı işletim sistemi hesabının ayrıcalıklarını gözden geçirmeniz önerilir.

SQL Enjeksiyonu İhlalleri

SQL Injection Nasıl Önlenir?, SQL Enjeksiyonu İhlalleri
Çok sayıda siber suçlu, veritabanlarına sızmak için zayıf kod hatalarından yararlanmayı bekler.

SQL enjeksiyonlarının 1998’de ortaya çıkmasından bu yana siber güvenlik alanında gerçekleşen ciddi gelişmelere rağmen, hala büyük bir endişe kaynağı olduğu görülmektedir. Hatta geçtiğimiz iki yıl içinde SQLi saldırılarının, yazılım – uygulama güvenliğine yönelik tüm saldırıların yaklaşık üçte ikisini oluşturduğu bilinmektedir. Bilinen büyük SQL enjeksiyonu ihlallerini şu şekilde sıralayabiliriz:

  • GhostShell: Ekim 2012’de, bilgisayar korsanlarının SQL enjeksiyonu kullanarak 53 üniversiteyi hedef aldığı saldırı, öğrencilere, öğretim üyelerine ve personele ait 36.000 kişisel kaydın çalınması ve yayınlamasıyla sonuçlanmıştır.

  • 7-Eleven: Ağustos 2009’da, başta 7-Eleven perakende zinciri olmak üzere birçok şirketteki kurumsal sistemlere sızmak için SQL enjeksiyonunun kullanıldığı saldırıda 130 milyon kredi kartı numarası çalınmıştır.

  • HBGary: Şubat 2011’de HBGary CEO’sunun Anonymous üyelerinin isimlerine sahip olduğunu duyurmasına bir yanıt olarak Anonymous ile ilgilisi bulunan bilgisayar korsanları, şirketin web sitesini çökertmek için SQL Injection kullanmıştır.
  • WordPress Eklentileri: İspanyol güvenlik araştırmacıları Jacinto Sergio Castillo Solana ve Manuel Garcia Cardenas, 84.000’den fazla eklentide 4.500’ü SQLi olmak üzere 5.000’den fazla güvenlik açığı keşfetmiştir.
  • Sesli Komut SQL Enjeksiyonu: 2019’da ortaya çıkan bu yeni tür SQLi, saldırıyı gerçekleştirmek için sesli komutlara dayanmaktadır. Bu, Alexa’nın korumasız bir uygulamada sözcükleri ve sayıları çevirerek istismar edilebileceğinin göstergesidir.
  • Tesla güvenlik açığı: 2014’te güvenlik araştırmacıları, SQL enjeksiyonunu kullanarak Tesla’nın web sitesini ihlal edebildiklerini, yönetici ayrıcalıkları kazanabildiklerini ve kullanıcı verilerini çalabildiklerini duyurmuşlardır.

  • Cisco güvenlik açığı: 2018’de Cisco Prime’da bir SQLi açığı bulunmuş ve Cisco güvenlik açığını düzeltmiştir.

  • Fortnite güvenlik açığı: 350 milyondan fazla kullanıcıya sahip çevrimiçi bir oyun olan Fortnite’de, 2019 yılında, saldırganların kullanıcı hesaplarına erişmesine izin verebilecek bir SQLi güvenlik açığı keşfedilmiş ve düzeltilmiştir.

Özet

SQL enjeksiyonu, web uygulamalarına yönelik en yaygın saldırılardan biridir. Başarılı bir SQL enjeksiyon saldırısı, veritabanınızdan e-posta, kullanıcı adı, parola ve kredi kartı ayrıntıları gibi hassas verileri okuyabilir, değiştirebilir veya silebilir. SQLi, bir saldırganın yetkisiz erişim sağlayarak kimlik sahtekarlığı yapmasına veya veritabanınızı yok etmesine neden olabilir.

SQL Injection güvenlik açığını belirlemek ve sistemlerinizi güvende tutmak için hemen harekete geçmek çok önemlidir. Çok sayıda saldırgan, veritabanlarına sızmak için zayıf kod hatalarından yararlanmayı beklediğinden SQL Injection Nedir? sorusuyla kodlarınızı gözden geçirmeniz ve güçlü uygulama güvenliği çözümlerine yönelmeniz önerilir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir