SQL Enjeksiyon Nedir? SQLi Saldırıları Nasıl Önlenir?
Yayınlanan: 2023-09-15Web uygulamaları çevrimiçi deneyimimizi her gün güçlendiriyor. Web uygulamalarını kullanarak bağlanıyor, etkileşimde bulunuyor, alışveriş yapıyor ve komik kedi videoları izliyoruz. Hayati önem taşıyan ticari hizmetler sunuyorlar ve hassas veriler barındırıyorlar; ancak bir şeyi ne kadar çok kullanırsak, o şey saldırılara o kadar açık hale gelir.
Yapılandırılmış sorgu dilindeki (SQL) güvenlik açıklarından yararlanan uygulamalarda dikkat edilmesi gereken siber saldırılardan biri, yaygın ve tehlikeli SQL enjeksiyonudur.
SQL enjeksiyonu nedir?
SQL enjeksiyonu (SQLi), siber saldırganların web uygulamalarındaki güvenlik açıklarından yararlanmak için kullandıkları zararlı bir kod enjeksiyon tekniğidir. Bir veritabanı sorgusuna bir dizi kötü amaçlı kod ekleyerek yetkisiz erişim elde etmek için zayıf noktalardan yararlanırlar.
SQL enjeksiyon saldırıları, uygunsuz veri erişimine, manipülasyona, kimlik hırsızlığına, mali kayba, itibarın zarar görmesine ve yasal sonuçlara yol açar. Geliştiriciler ve kuruluşlar bunun risklerini anlamalı ve tam güvenlik önlemlerini uygulamalıdır. Web uygulaması güvenlik duvarları (WAF) yazılımı ve dijital adli tıp yazılımı gibi araçlar, SQL enjeksiyon saldırılarına karşı koruma sağlayacak şekilde tasarlanmıştır. İşletmeler, uygulamalarını korumak için kapsamlı web sitesi güvenlik paketlerine de güvenebilir.
SQL saldırılarının örneklerle nasıl yürütüldüğünü, bunların varyasyonlarını ve bu tür saldırıların nasıl önleneceğini öğrenmek için bu SQL enjeksiyon hile sayfasını okuyun.
SQL enjeksiyon saldırıları neden tehlikelidir?
SQL enjeksiyonu, yıllardır Açık Dünya Uygulama Güvenliği Projesi'nin (OWASP) web uygulaması güvenlik riskleri arasında ilk 10 listesinde yer almaktadır. OWASP, yalnızca 2022 yılında test ettikleri uygulamalarda 274.000'den fazla enjeksiyon türünün gerçekleştiğini tespit etti; SQL enjeksiyonu ve siteler arası komut dosyası çalıştırma (XSS) en yaygın olanlardı.
Saldırganlar SQl enjeksiyonlarını şu amaçlarla kullanabilir:
- Bir veritabanındaki bilgilerin değiştirilmesi veya silinmesi nedeniyle web uygulamalarındaki hatalar .
- Bilgisayar korsanlarının veritabanlarında saklanan kişisel bilgiler, mali kayıtlar veya parolalar gibi hassas verilere yetkisiz erişim sağlaması durumunda veri ihlalleri meydana gelir .
- Aynı paylaşılan veritabanlarını kullanan ek, yetkisiz sistemlere erişerek sistemlerin güvenliğini ihlal etmek . Bu, saldırganların saldırılarını aynı ağdaki diğer sistemlere yükseltmelerine veya dağıtılmış hizmet reddi (DDoS) gerçekleştirmelerine olanak tanır.
Bu yıkıcı eylemler işletmelere geri dönülemez biçimde zarar verir. Suçlar mahremiyet ve veri bütünlüğünü tehlikeye atarak müşterinin güveninin ve ticari itibarın kaybolmasına neden olur. Bu aynı zamanda sonrasındaki sorunlarla uğraşan şirkete de mali yük getirmektedir.
Gerçek hayattaki SQL enjeksiyon saldırısı örnekleri
SQL enjeksiyonunun ilk kez sahneye çıkmasından bu yana yirmi yıldan fazla zaman geçti. Yirmi yıl sonra, aşağıdaki önemli SQL enjeksiyon olaylarının da gösterdiği gibi, kötü şöhretli olmaya devam ediyor.
- Heartland Ödeme Sistemleri: 2008 yılında, Heartland Ödeme Sistemleri tarihteki en büyük veri ihlallerinden birine maruz kaldı ve bir SQLi saldırısı yoluyla 130 milyondan fazla kredi ve banka kartı detayı açığa çıktı. Heartland milyonlarca para cezası ödedi.
- Yahoo : 2012'de bir SQL enjeksiyon saldırısı, e-posta adresleri ve şifreler de dahil olmak üzere yaklaşık 5 milyon Yahoo kullanıcısının hesap ayrıntılarını ele geçirdi.
- Freepik: Bilgisayar korsanları, 2020 yılında şirketin Flaticon web sitesine yapılan SQL enjeksiyon saldırısı sırasında 8,3 milyon Freepik ve Flaticon kullanıcısının e-postalarını ve şifrelerini çaldı.
- WooCommerce: Popüler WordPress eklentisi, 5 milyon siteyi veri hırsızlığına maruz bırakan bir SQL enjeksiyon güvenlik açığını düzeltti.
- BillQuick: Siber suçlular, fidye yazılımını yaymak için popüler faturalandırma platformundaki kör bir SQL güvenlik açığından yararlandı.
- MOVEit: Mayıs 2023'te Cl0p fidye yazılımı çetesi, yönetilen dosya aktarım yazılımı aracı MOVEit'te bir SQL enjeksiyon güvenlik açığı kullandı ve 1.000'den fazla kuruluşu ve en az 60 milyon kişiyi etkiledi ve bu, yılın şimdiye kadarki en büyük veri ihlali oldu.
SQL enjeksiyon saldırısı nasıl çalışır?
Modern web uygulamalarında kullandığımız veritabanlarının ve SQL sorgularının temellerine bakalım. Bu, SQL enjeksiyonunun iç işleyişini daha iyi anlamamıza yardımcı olacaktır.
Tüm web siteleri, kullanıcıları ve uygulamaları hakkındaki verileri depolamak için SQL veritabanları olarak da adlandırılan ilişkisel veritabanlarını kullanır. Kullanıcı bilgileri, oturum açma bilgileri, ödeme bilgileri veya şirketle ilgili başka herhangi bir şey olabilir. Örneğin bir e-ticaret sitesini ele alalım. Ürün verilerini, kullanıcı hesaplarını, sipariş verilerini ve ödeme bilgilerini veritabanında saklar.
Web siteleri daha sonra bu veritabanlarından verileri alır ve kullanıcılara özel içerik veya hizmetler sunar. Bu süreç, veritabanlarını yönetmek için kullanılan standartlaştırılmış bir programlama dili olan SQL sayesinde gerçekleşir. Bir uygulamadan bir şey almanız gerektiğinde, örneğin satın alma geçmişiniz gibi, aslında, veritabanına belirli bir eylemi gerçekleştirmesi talimatını veren SQL sorgularını kullanarak veritabanına bir istekte bulunuyorsunuz.
Web etkileşimlerini kusursuz hale getirmek amacıyla birçok web sitesi, kullanıcıların SQL sorguları yapmak için veri girmesine izin verir. Bu, arama terimleri, kullanıcı adları veya ödeme ayrıntıları gibi şeyleri içerebilir.
E-ticaret web sitesinin örneğini düşünün. Veritabanındaki sipariş geçmişinizi "siparişler" tablosu (o) ve "ürünler" tablosu (p) ile görüntülemek için basit bir SQL sorgusu aşağıdaki gibi olacaktır:
SEÇ o.sipariş_kimliği, o.sipariş_tarihi, p.ürün_adı, p.fiyat
siparişlerden itibaren o
Ürünlere KATILIN p ON o.product_id = p.product_id
NEREDE o.user_id = 12345;
Bu SQL kodu, web sitesi veritabanındaki KULLANICI ID 12345 için ürün tablosundan ürün adı ve fiyatının yanı sıra siparişler tablosundan sipariş kimliğini ve tarihini alır. Tipik olarak kimlik, kullanıcıdan gelen girdiye dayalı olacaktır. Giriş düzgün bir şekilde kontrol edilmediğinde ve kontrol edilmediğinde sorunlar ortaya çıkar. Saldırganlar bu güvenlik açığından yararlanarak SQL enjeksiyon saldırısı gerçekleştirir.
İşte tipik olarak nasıl ortaya çıktığı.
- Güvenlik açığı bulunan giriş alanlarının belirlenmesi: Saldırganlar, web uygulamasında potansiyel olarak kötü amaçlı kod yerleştirebilecekleri giriş alanlarını bularak başlar. Farklı değerler gönderirler ve uygulamanın nasıl yanıt verdiğini görürler. olup olmadığını öğrenmek için. Uygulama kullanıcı girişini doğru şekilde doğrulamaz veya temizlemezse uygulama, girişini SQL kodu olarak işler. Bu potansiyel güvenlik açığı kod enjeksiyonu için kullanılır.
- Kullanıcı girişi yoluyla kod enjeksiyonu: Saldırganlar, uygulamanın girdiyle nasıl ilgilendiğini anladıktan sonra, bu güvenlik açığından yararlanan kötü amaçlı SQL kodu parçası olan bir veri yükü oluşturur. Bu, SQL sorgu yapısını değiştirmek için tek tırnak ('), çift tırnak (“) veya eşit (=) gibi SQL kontrol karakterlerinin eklenmesini içerir. Bu kontrol karakterlerini SELECT ve FROM gibi yaygın SQL komutlarıyla kullanmak, saldırganların veritabanı sunucusuna erişmesine veya veriyi almasına olanak tanır.
Daha sonra meşru taleplerle birlikte özel hazırlanmış girdiler göndererek uygulamayı, gölgeli kodu sorgunun meşru bir parçası olarak ele alacak şekilde kandırırlar. - Yürütme: Veritabanı, saldırının farkında olmadan sorguyu işler ve enjekte edilen kodu sanki okunaklı bir istekmiş gibi çalıştırır.
- Suistimal: Saldırganın amacına bağlı olarak, enjekte edilen SQL kodu hassas verileri alabilir, bilgileri değiştirebilir veya silebilir, hatta yetkisiz erişim sağlayabilir. Bu, uygulamanın güvenliğini tehlikeye atar ve potansiyel olarak hassas bilgilerin açığa çıkmasına neden olur.
SQL enjeksiyon örneği
Ürün kimliğini temel alarak ürün ayrıntılarını getirmek için URL parametresi kullanan bir web uygulamasını düşünün:
http://example.com/products?id=1
Saldırgan, hataya neden olmak ve şuna benzer bilgileri almak için kötü amaçlı SQL kodu yerleştirmeyi deneyebilir: http://example.com/products?id=1' VEYA 1=1; –
Uygulama kullanıcı girişini yeterince doğrulayamaz ve temizleyemezse, SQL sorgusu aşağıdaki gibi değiştirilebilir:
* NEREDE VEYA 1=1 olan ürünlerden SEÇİN; - - ';
Bu durumda, orijinal sorgu, kimliği 1 olan bir ürünü almak üzere tasarlanmıştır, ancak saldırganın girişi, 1=1 eklenmesi ve eklenen çift tire (- -) nedeniyle sorguyu tüm ürünleri döndürecek şekilde değiştirir. Orijinal kapanış tek teklifini geçersiz kılar ve tüm ürün ayrıntılarını görüntüleyen veya saldırganların yararlanabileceği hata mesajlarını açığa çıkaran sonuçlara yol açar.
%33
2022'de web uygulamalarındaki kritik güvenlik açıklarının büyük bir kısmı SQL enjeksiyonlarından kaynaklanıyordu.
Kaynak: Statista
SQL güvenlik açıklarının yaygınlığı ve web uygulaması veritabanının tüm iş açısından kritik verilerle birlikte çekiciliği, SQL enjeksiyonunu en kalıcı siber saldırılardan biri haline getiriyor.
Kaynak: Spiceworks
SQL enjeksiyon saldırısı türleri
Saldırganların bilgileri nasıl elde ettiğine veya veritabanıyla nasıl etkileşime girdiğine bağlı olarak üç ana SQL enjeksiyon saldırısı türü vardır:
- Klasik veya bant içi SQLi
- Kör veya çıkarımsal SQLi
- Bant dışı SQLi
1. Klasik veya bant içi SQLi
Bant içi SQL enjeksiyon saldırısının en yaygın türüdür. Klasik bilgisayar korsanı, kötü amaçlı SQL kodunu enjekte etmek ve sonuçları almak için aynı iletişim kanalını (bant içi) kullanır. Bant içi SQLi'nin iki ana çeşidi şunlardır:
Union tabanlı bant içi SQLi
Bu saldırı, iki veya daha fazla SELECT ifadesinin sonucundan elde edilen verileri birleştirmek için kullanılan UNION SQL operatöründen yararlanır. Saldırganlar bunu yaparak doğrudan erişimlerinin olmadığı tablolardan veri alabilir.
Hata tabanlı bant içi SQLi
Bu teknikte, bir saldırgan, veritabanının döndürdüğü hata mesajlarından yararlanmak için bir SQL sorgusunda kasıtlı olarak hatalar tetikler. Hatalar veritabanı yapısı, tablo adları, sütun adları ve bazen de verinin kendisi hakkında değerli bilgileri ortaya çıkarabilir. Hata tabanlı SQLi, bant dışı SQLi olarak da çalıştırılabilir.
2. Çıkarımsal (kör) SQLi
Kör bir SQLi'de saldırgan, saldırısının sonuçlarını doğrudan göremez. Bunun yerine, uygulama davranışını veya sorgularına yanıt veren hata mesajlarını gözlemleyerek bilgi çıkarımı yaparlar. Bu tür saldırılar zaman alıcıdır çünkü bilgisayar korsanlarının yararlanabilecekleri potansiyel güvenlik açıklarını bulmak için bir dizi SQL sorgusu yapması gerekir. Kör SQLi'nin iki çeşidi şunlardır:
Zamana dayalı kör SQLi
Burada saldırganlar, veritabanının tepki vermeden önce yanıt vermesini geciktiren sorgular sorar. Yanıt süresine dikkat ederek veritabanı hakkında bilgi çıkarırlar.
Boolean kör SQLi
Boolean kör SQLi için saldırganlar, bir uygulamanın SQL sorgularındaki doğru veya yanlış koşullara yanıt verme şeklinden yararlanır. Web uygulamasının yanıtlarına dayanarak, veritabanından hiçbir veri döndürülmese bile veritabanı hakkında bilgi çıkarırlar.
3. Bant dışı SQLi
Bant dışı bir SQLi saldırısı, uygulamanın bilgisayar korsanları tarafından kontrol edilen uzak bir uç noktaya veri göndermesine neden olur. Bunun gibi bir saldırı, SQL sunucularının, Köprü Metni Aktarım Protokolü (HTTP) istekleri gibi harici ağ isteklerini başlatabilme gibi belirli özelliklere sahip olmasını gerektirir.
SQL enjeksiyon saldırıları nasıl önlenir: kısa bilgi sayfası
SQL enjeksiyonunun önlenmesi, güvenli kodlama uygulaması ve sürekli izlemeyi içeren çok katmanlı bir yaklaşım gerektirir. SQL enjeksiyon saldırılarına karşı korunmanıza yardımcı olacak temel adımları içeren bir kısa notu burada bulabilirsiniz.
Hazırlanan ifadeleri kullanın
SQL enjeksiyon saldırılarına karşı birincil savunma, parametreli sorgularla hazırlanmış ifadelerdir. Hazırlanan ifadeler, kullanıcı girişlerinin yürütülebilir kod yerine veri olarak değerlendirilmesini sağlar.
Geliştiriciler, sorgulara yönelik SQL kodlarını, kullanıcıdan gelen giriş değerleri için yer tutucularla birlikte şablonlar halinde önceden derler. Sorgu yürütme zamanında hazırlanan ifadeler yer tutucular yerine gerçek değerleri bağlar. Bu, kötü amaçlı kod yürütülmesini durdurur.
Hazırlanan ifadeler dinamik SQL ifadelerine göre tercih edilir. Yürütme süresi boyunca SQL sorguları yazarlar, bu da onları enjeksiyon saldırılarına karşı zayıflatır.
Popüler programlama dillerinde hazırlanmış ifadeler:
Popüler veritabanı programlamasında hazırlanmış ifadelerin (parametreli sorgular) kullanılmasına yönelik dile özgü öneriler şunlardır:
- Java kurumsal sürümü (EE): Java.sql paketindeki PrettyStatement sınıfını kullanın. setString , setInt vb. yöntemleri kullanarak parametreleri bağlayın.
- Python (SQLite3) : Sorgularda yer tutucuları ( ? ) kullanın. Parametreleri bir tuple veya list kullanarak bağlayın.
- PHP: PHP veri nesneleri (PDO) uzantısını kullanın. Hazırlanan ifadeleri yer tutucularla (:) kullanın. ParametreleribinValue veyabinParam ile bağlayın.
- .NET : MySqlCommand nesnesini kullanın. Parameters.AddWithValue kullanarak parametreleri bağlayın.
Başka bir SQL enjeksiyon önleme yöntemi, saklı prosedürlerin veya tekrar tekrar kullanılabilen bir grup önceden derlenmiş SQL kodunun kullanılmasıdır.
Giriş doğrulama alıştırması yapın
Giriş doğrulama, işlemden önce belirli kriterleri karşıladığından emin olmak için kullanıcı girişinin kontrol edilmesini içerir. Beyaz liste olarak da bilinen izin verilenler listesi, giriş doğrulamanın önemli bir yönüdür. Burada SQL sorgularının bir parçası olarak yalnızca önceden tanımlanmış güvenli değerler veya modeller kabul edilir. Belirlenen kriterlere uymayan herhangi bir giriş reddedilir. Bu, kötü niyetli veya beklenmedik girdilerin sisteme girmesini aktif olarak önler.
Nesne ilişkisel eşleme kitaplıklarını kullanma
Nesne-ilişkisel haritalama (ORM) kitaplıkları, ilişkisel veritabanlarıyla çalışan geliştiriciler için değerli araçlardır. Geliştiricilerin kendi seçtikleri programlama dilini kullanarak veritabanlarıyla etkileşime girmelerine olanak tanır ve böylece ham SQL sorguları yazma ihtiyacını azaltır. ORM kitaplıkları, SQL ekleme saldırılarına karşı yerleşik koruma sağlar.
Geliştiricileri ve BT ekiplerini güvenli kodlama uygulamaları konusunda eğitin. Güvenlik açıklarını bulmak için düzenli güvenlik denetimleri ve sızma testleri yaptığınızdan emin olun.
İpucu: Güvenli kod eğitim araçlarıyla programcılarınızın ve geliştiricilerinizin güvenli kodlamayı daha hızlı öğrenmesine yardımcı olun.
En az ayrıcalık ilkesini uygulayın
En az ayrıcalık ilkesi, veritabanı kullanıcılarına yalnızca işlerini yapmak için gereken minimum izni verir. Bu prensibe uymak, potansiyel SQL enjeksiyon saldırılarının veya herhangi bir siber saldırının etkisini azaltır. Ayrıca veritabanınıza sıkı erişim kontrolü uygulayın.
Web uygulaması güvenlik duvarı (WAF) dağıtma
WAF, uygulamaların gelen ağ trafiğini izler ve iyi bilinen saldırı imzalarının bir listesine dayanarak potansiyel kötü amaçlı trafiği engeller.
En iyi 5 web uygulaması güvenlik duvarı (WAF) aracı:
- Azure Web Uygulaması Güvenlik Duvarı
- AWS WAF
- Imperva Web Uygulaması Güvenlik Duvarı (WAF)
- Bulut Parlaması Spektrumu
- Symantec Web Uygulaması Güvenlik Duvarı ve Ters Proxy
* Yukarıda G2'nin Yaz 2023 Grid Raporunda yer alan önde gelen beş WAF çözümü yer almaktadır.
WAF, gelen trafikteki SQL anahtar sözcükleri ve kötü amaçlı yükler gibi şüpheli kalıpları ve anormallikleri tespit etmek için önceden tanımlanmış kurallar kullanır. Kullanıcı girişlerini arındırır ve doğrular ve zararlı istekleri engeller veya filtreler. Bu, tehlikeli SQL sorgularının sisteme girerken durdurulmasına yardımcı olur.
Modern WAF'ler, makine öğrenimini kullanarak yeni saldırı yöntemlerine uyum sağlar.
SQL enjeksiyon saldırısını önleyen diğer güvenlik araçları
WAF'a ek olarak diğer bazı güvenlik platformları da SQL enjeksiyon saldırılarını engeller.
- Güvenlik açığı tarayıcıları, web uygulamalarındaki bilinen ve bilinmeyen güvenlik açıklarını arar.
- Statik uygulama güvenlik testi (SAST) araçları ve statik kod analiz yazılımı, kodu gerçekten çalıştırmadan güvenlik açıklarını bulur.
- Dinamik uygulama güvenliği test yazılımı, çalışan uygulamalara yönelik saldırıları simüle eder ve zayıf yönleri belirler.
- İzinsiz giriş tespit ve önleme sistemleri ve dijital adli tıp yazılımı, uygulamalardaki anormallikleri ve saldırıları gerçek zamanlı olarak araştırır.
Veri kalelerinizi koruyun
SQL enjeksiyon saldırıları web uygulaması güvenliği için ciddi bir tehdit oluşturur. Saldırılar başarılı olursa şirketler değerli verilerini, kullanıcı gizliliğini ve iyi itibarlarını kaybetme riskiyle karşı karşıya kalır.
Hiçbir çözüm tek başına SQL enjeksiyonuna karşı mutlak güvenliği garanti etmezken, burada bahsettiğimiz önleyici tedbirlerin birleştirilmesi saldırı olasılığını önemli ölçüde azaltır. Web geliştiricileri ve veritabanı yöneticileri, sıkı savunmalar uygulamalı ve web uygulamalarını olası istismarlara karşı güçlendirmelidir.
Web sitenizin güvenliğini sağlamak için kapsamlı bir çözüm mü istiyorsunuz? Web güvenliği yazılımını ve veri ihlallerine yol açan siber saldırılara karşı nasıl yardımcı olduğunu keşfedin.