Kategoriler
CloudFlare

SQL enjeksiyonu (SQi) nedir?

SQL Enjeksiyonu Öğrenme hedefleri

Yapılandırılmış Sorgu Dili (SQL *) Enjeksiyonu, SQL veritabanlarından verileri değiştirmek veya almak için kullanılan bir kod enjeksiyon tekniğidir. Bir saldırgan, bir giriş alanına özelleştirilmiş SQL ifadeleri ekleyerek, veritabanından verilerin alınmasına, hassas verilerin yok edilmesine veya diğer manipülatif davranışlara izin veren komutları yürütebilir.

Yetkisiz kullanıcı, uygun SQL komutunun çalıştırılmasıyla, daha ayrıcalıklı bir kullanıcının kimliğini taklit edebilir, kendilerini veya başkalarını veritabanı yöneticileri yapabilir, mevcut verileri kurcalayabilir, işlemleri ve bakiyeleri değiştirebilir ve tüm sunucu verilerini alabilir ve / veya yok edebilir.

Modern bilgi işlemde, SQL enjeksiyonu genellikle bir web sitesi veya hizmet tarafından sağlanan bir API uç noktasına kötü amaçlı SQL sorguları göndererek İnternet üzerinden gerçekleşir (bu konu hakkında daha sonra daha fazlası). En ciddi haliyle, SQL enjeksiyonu, bir saldırganın bir makineye kök erişimi kazanmasına ve tam kontrol sağlamasına izin verebilir.

* SQL, çoğu veritabanını korumak için kullanılan bir programlama dilidir.

SQL enjeksiyon saldırısı nasıl çalışır?

Bob adında bir adamın yargılandığı ve bir yargıç karşısına çıkmak üzere olduğu bir mahkeme odası hayal edin. Duruşmadan önce evrakları doldururken, Bob ismini “Bob gitmekte özgür” olarak yazar. Yargıç davasına ulaştığında ve yüksek sesle “Şimdi Bob’u aramak serbesttir” dediğinde, icra memuru Bob’un gitmesine izin verir çünkü yargıç öyle dedi.

SQLi’nin biraz farklı çeşitleri olsa da, temel güvenlik açığı esasen aynıdır: belirli bir veri türü için ayrılması beklenen bir SQL sorgu alanı, bunun yerine komut gibi beklenmedik bilgiler aktarılır. Komut çalıştırıldığında, amaçlanan sınırların ötesine geçerek potansiyel olarak hain davranışlara izin verir. Bir sorgu alanı genellikle bir web sayfasındaki bir forma girilen verilerden doldurulur.

Normal ve kötü amaçlı SQL ifadeleri arasındaki basit bir karşılaştırmaya bakalım:

Normal SQL sorgusu:

Bu normal SQL sorgusunda, öğrenciKimliği dizesi bir SQL deyimine geçirilir. Amaç, girilen öğrenci kimliği ile eşleşen bir öğrenci için öğrenci listesine bakmaktır. Bulunduğunda, o öğrencinin kaydı iade edilecektir. Basitçe söylemek gerekirse, komut “git bu kullanıcıyı bul ve bana verilerini ver” diyor.

Kod şunun gibi görünebilir:

studentId = getRequestString("studentId");
lookupStudent  = "SELECT * FROM students WHERE studentId = " + studentId

Bir öğrenci, ‘Lütfen öğrenci kimlik numaranızı girin’ etiketli bir web sayfası formuna 117 öğrenci kimliği girerse

normal form alanı

sonuçta ortaya çıkan SQL sorgusu şöyle görünecektir:

SELECT * FROM students WHERE studentId = 117;

Bu komut, bir öğrenci kimliğine sahip belirli bir öğrenci için kaydı döndürür; bu, API’yi yazan geliştiricinin olmasını beklediği şeydir.

SQL Enjeksiyon sorgusu:

Bu örnekte, bir saldırgan bunun yerine giriş alanına bir SQL komutu veya koşullu mantık girer, aşağıdaki gibi bir öğrenci kimlik numarası girer:

SQL enjeksiyon örneği form alanı

Normalde sorgu, eşleşen kimlik için veritabanı tablosunda arama yaparsa, şimdi bir kimlik arar veya 1’in 1’e eşit olup olmadığını görmek için test eder. Beklediğiniz gibi, ifade sütundaki her öğrenci için her zaman doğrudur ve Sonuç olarak, veritabanı öğrenciler tablosundaki tüm verileri sorguyu yapan saldırgana geri döndürecektir.

SELECT * FROM students WHERE studentId = 117 OR 1=1;

SQLi, savunmasız bir Uygulama Programlama Arayüzü veya API’yi hedefleyerek çalışır. Bu durumda bir API, bir sunucunun istekleri aldığı ve yanıtladığı yazılım arabirimidir.

Kötü niyetli bir aktörün formları arayan bir web sitesinde otomatik olarak arama yapmasına ve ardından web sitesinin yazılım geliştiricilerinin veritabanından yararlanmak için niyet etmediği bir yanıt oluşturabilecek çeşitli SQL sorgularını girmeye çalışmasına olanak tanıyan yaygın olarak kullanılan araçlar vardır.

SQL enjeksiyonlarının uygulanması kolaydır ve ilginç bir şekilde, uygun geliştirme uygulamaları göz önüne alındığında önlenmesi oldukça kolaydır. Sıkı son tarihler, deneyimsiz geliştiriciler ve eski kod genellikle değişken kod kalitesi ve güvenlik uygulamaları ile sonuçlandığından, gerçek daha belirsizdir. Veritabanına erişimi olan bir web sitesindeki herhangi bir form veya API uç noktasındaki tek bir güvenlik açığını ortaya çıkarmak için yeterli olabilir.

SQL Injection saldırısı nasıl önlenir?

SQL enjeksiyonu nedeniyle veri ihlali riskini azaltmak için çeşitli yöntemler vardır . En iyi uygulama olarak birkaç strateji kullanılmalıdır. Daha yaygın uygulamalardan birkaçını inceleyelim:

  • Hazırlanmış İfadelerin Kullanımı (Parametreli Sorgularla) – Veritabanı girişlerini temizlemenin bu yöntemi, geliştiricileri önce tüm SQL kodunu tanımlamaya ve ardından yalnızca belirli parametreleri SQL sorgusuna geçirmeye zorlamayı içerir; girilen verilere açıkça, ötesine genişletilemeyecek sınırlı bir kapsam verilir. Bu, veritabanının, girdi alanında sağlanan veri türüne bakılmaksızın, girilen veriler ile çalıştırılacak kod arasında ayrım yapmasına olanak tanır. Bazı sürümler veritabanı girdilerini otomatik olarak sterilize edeceğinden, bazı nesne ilişkisel haritalama (ORM) kitaplıkları bu amaç için yaygın olarak kullanılır.
  • Tüm Kullanıcı Tarafından Sağlanan Girişlerden Kaçış – SQL yazarken, belirli karakterlerin veya kelimelerin belirli bir anlamı vardır. Örneğin, “*” karakteri “herhangi biri” anlamına gelir ve “VEYA” kelimesi bir koşulludur. Veritabanına bir API isteğine yanlışlıkla veya kötü niyetle bu karakterleri giren kullanıcıları atlatmak için, kullanıcı tarafından sağlanan giriş öncelenebilir. Bir karakterden kaçış, veritabanına onu bir komut veya koşullu olarak ayrıştırmamasını, bunun yerine onu değişmez girdi olarak ele almasını söylemenin bir yoludur.
  • Depolanan Prosedürlerin Kullanımı – Tek başına sağlam bir güvenlik stratejisi olmasa da, depolanan prosedürler SQL enjeksiyonu ile ilişkili riski sınırlamaya yardımcı olabilir. SQL sorgularını çalıştıran veritabanı hesabının izinlerini uygun şekilde sınırlandırarak, SQL enjeksiyonuna karşı savunmasız olan güçlü olmayan uygulama kodu bile ilgisiz veritabanı tablolarını işlemek için gerekli izinlere sahip olmayacaktır. Depolanan prosedürler ayrıca, alanın almak üzere tasarlandığı türü ihlal eden verilerin girilmesini önleyerek girdi parametrelerinin türünü kontrol edebilir. Statik sorguların yetersiz olduğu durumlarda, depolanan prosedürlerden genellikle kaçınılmalıdır.
  • En Az Ayrıcalığı Zorla – Genel bir kural olarak, bir web sitesinin dinamik SQL kullanması gereken tüm durumlarda, izinleri ilgili sorguyu yürütmek için gereken en dar kapsamla sınırlandırarak SQL enjeksiyonuna maruz kalmayı azaltmak önemlidir. En açık haliyle, bu, bir yönetici hesabının, yetkisiz bir talepten gelen bir API çağrısının sonucu olarak hiçbir durumda SQL komutlarını yürütmemesi gerektiği anlamına gelir. Depolanan prosedürler statik sorgular için en iyi şekilde kullanılırken, en az ayrıcalığın zorlanması dinamik SQL sorgularının risklerini azaltmaya yardımcı olabilir.

Bileşik SQL enjeksiyon saldırısı nedir?

Akıllı saldırganlar, güvenlik önlemlerini aşmak için bazen hedeflenen bir web sitesine çoklu vektör saldırıları uygular. Tek bir saldırı hafifletilebilirken, aynı zamanda veritabanı yöneticileri ve bilgi güvenliği ekipleri için de ilgi odağı haline gelebilir. DDoS saldırıları , DNS kaçırma ve diğer kesinti yöntemleri bazen kapsamlı SQL enjeksiyon saldırıları uygulamak için dikkat dağıtıcı olarak kullanılır. Sonuç olarak, kapsamlı bir tehdit azaltma stratejisi en geniş koruma yelpazesini sağlar. Cloudflare’nin web uygulaması güvenlik duvarı , DDoS azaltma ve DNS güvenliği , bütünsel bir güvenlik stratejisinin temel unsurlarını oluşturur.

Spreading Love by Sharing