SQL Enjeksiyonu

Top  Previous  Next

Veritabanı uygulamaları önlemler alınmadığı takdirde SQL Enjeksiyonu saldırılarına karşı savunmasızdırlar. Veritabanı tablo yapısını bilen veya tahminde bulunan bir saldırgan, girdi alanlarında beklenmeyen girişler yaparak normal yollardan erişemediği bilgilere erişebilir veya veri tabanındaki bilgilere ciddi zararlar verebilir.

Örnek:

SELECT * FROM EMPLOYEE 
  WHERE DEPT = '@vof(DEPT)' 

 

Eğer kullanıcı, sayfadaki form alanındaki DEPT adlı girdi alanına aşağıdaki gibi bir değer girerse 

 
[x' or 1 = 1 -- ]

 

Çözümlenenen SQL söyle olacaktır.
 
SELECT * FROM EMPLOYEE 
  WHERE DEPT = 'x' or 1 = 1 -- '

 

Bu şekilde bir müdahale ile EMPLOYEE tablosondaki tüm kayıtlara erişebilme ihtimali vardır.

 

Gerekli önlemler alınmadığı durumda MoreMotion uygulamaları da bu tür saldırılara karşı savunmasız kalabilir. MoreMotion bu tür saldırıların büyük bir çoğunluğunu kendiliğinden önleyecektir. Diğer kalan kısmı için ise neler yapılması gerektiği aşağıda açıklanmıştır.

SQL Enjeksiyonu hakkında daha fazla bilgi...

Not: Lütfen bölümü sonuna kadar okuyun.

Bu tür saldırıları önlemek için MScript sembolleri kullanırken 'n:', 'b:' gibi veri tipi tanımlayıcıları veya 'q' tanımlayıcısını kullanılmalıdır.

Örnek:
SELECT * FROM EMPLOYEE 
  WHERE DEPT = '@vof(q:DEPT)' 

 

Çözümlenen SQL:
SELECT * FROM EMPLOYEE 
  WHERE DEPT = 'x'' or 1 = 1 -- '

 

'q' tanımlayıcısı çözümlenen değer içinde bulunan tırnak karakterlerini çiftleyerek, tırnağın SQL ifadesinde metin sabitinin bir parçası olmasını sağlar.
 

Bir başka örnek:
UPDATE EMPLOYEE SET
  NAME = '@vof(q:NAME)'  

WHERE ID = @vof(n:ID) 

 

ID alanına "5; DROP TABLE EMPLOYEE" gibi bir değer girilerek çok tehlikeli bir saldırı yapılsa da, 'n:' veri tipi tanımlayıcısı sayesinde bir hata oluşacak ve SQL işletilmeyecektir.

Girdi alanına girilen değerlerin, doğal olarak, form gönderilmeden önce kontrol edilmesi gerekir. Ancak uygulamayı çökertmek isteyen biri form üzerinden değilde tarayıcının adres çubuğuna yazacağı komutlar ile bu tür saldırıları gerçekleştirebilir.

display.doms?pg=ShowEmployee&ID=15  (Beklenen Komut)

display.doms?pg=ShowEmpoyee&ID=15 or 1 = 1 (Müdahale edilmiş Komut)

 
O nedenle, numara beklenen durumlarda 'n:', metin beklenen durumlarda ise 'q:' tanımlayıcısı kullanarak SQL Enjeksiyonu saldırılarına karşı önlem almak en emin yoldur.

SELECT * FROM PRODUCTS
  WHERE ID = @vof(n:ID) OR NAME = '@vof(q:NAME)'

 

Yerleşik Önlemler

MoreMotion aşağıdaki kuralları uygulayarak, SQL Enjeksiyonlarına karşı kendiliğinden önlemler alır.

Kural 1: Bir MScript fonksiyonu, satır üzerinde tırnaklar içinde (SQL metin sabitinin içinde) kullanılmış ise fonksiyonun döndürdüğü değer içinde yer alan tırnaklar çiftlenir.

Kural 2: Bir MScript fonksiyonu satır üzerinde tırnaklar içinde kullanılmamış ise ve öncesinde '=', ',' veya '(' karakterinde biri varsa fonksiyonun döndürdüğü değer kontrol edilir. Eğer değer özel karakterler veya boşluk içeriyorsa hata oluşturularak SQL'in işletilmesi önlenir.

Bu kuralların geçerli olmadığı durumlarda, geliştirici gerekli tanımlayıcıları açıkça kullanarak önlem almalıdır.

Örnekler:

SELECT * FROM PRODUCTS
WHERE 

  NAME = '@vof(NAME)' @// Kural 1. Fonksiyon tırnaklar içinde. Sorun yok. 

  AND ID = @vof(ID)   @// Kural 2. Foksiyon öncesinde "=" karakteri var. Sorun yok.

 

 

 

INSERT INTO EMPLOYEE

  (ID, NAME) VALUES(

  @vof(ID), '@vof(NAME)') @// Ne Kural 1'e ne de Kural 2'ye uyuyor. Geliştirici kendisi önlem almalı.

 

  @vof(n:ID), '@vof(NAME)') @// 'n' tanımlayıcısı ile önlem alınmış. Değer olarak numara bekleniyor.