مسیر سایت

حملات تزریق در پایگاه داده (SQL Injection Attack) – بخش دوم

  چکیده:

  همانطور که در بخش قبلی اشاره نمودیم، لازمه پیشگیری و مقابله با حملات تزریق، شناخت صحیح آنهاست . در این بخش ، درباره حملات سرریز و روش های پیشگیری و مقابله با انواع حملات صحبت می نماییم، سپس تکنیک هایی را که بصورت خودکار تا حدی می توانند این حملات را شناسایی نمایند، معرفی می کنیم.

  Truncation and Modification attack

  همان طور که مشاهده نمودید در تمامی مثال های قبلی آنچه سبب می شود فرد حمله کننده بتواند عبارت مورد نظر خود را به دستور SQL تزریق نماید و جواب گیرد، استفاده از کاراکتر (‘) است . چنانچه کاربر مجاز به استفاده از این کاراکتر باشد، مکانیزمی برای هندل کردن آن باید در نظر گرفته شود. برای این منظور SQL دو متد معرفی کرده است :

  1- QuoteName(character-string , quote-character)

  این تابع قبل از کاراکتر ‘ ، یک کاراکتر ‘ دیگر اضافه می نماید

  2- Replace (string-expression, string-expression2, string-expression3)

  با استفاده از این تابع به جای هر کاراکتر ‘ ، دو کاراکتر ‘ قرار می دهیم.

  فرض کنید در مثال زیر برای مقابله با حملات تزریق، از دستور QuoteName استفاده نمودیم :

Create Procedure  sp-setPassword

,(@userName varchar (25

,(@old varchar (25

(@new varchar (25

AS

(Declare @command varchar (100

Set @command = ‘update Users set password=’’’ + QuoteName (@new,’’’’) + ‘’’ where username=’’’+ QuoteName (@userName,’’’’) + ‘’’ and password=’’’+ QuoteName (@old, ‘’’’)

  همانطور که مشاهده می نمایید متغیر command می تواند پذیرای رشته ای بطول 100 کاراکتر باشد. فرض نماید مهاجم عبارت ‘’’’’’’’’’’’’’’’’’!Abb1 را در فیلد پسورد وارد می نماید (18 تا کاراکتر ‘ ،یک علامت، یک حرف بزرگ، دو حرف کوچک و یک عدد) و عبارت administrator را در فیلد username ، بدلیل استفاده از متد QuoteName ، قبل از هر کاراکتر ‘ یک کاراکتر دیگر قرار می گیرد و این سبب افزایش طول رشته می گردد و سرریز رخ می دهد و مقدار متغیر command  بصورت زیر می شود:

Update Users set password =’‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’!Abb1’ where userName=’administrator’

  بنابراین کاربر تنها با دانستن نام کاربری می تواند پسورد همه کاربران را تغییر دهد. بنابراین در هنگام استفاده از این متدها باید حداکثر دقت را به خرج داد.

  روش های پیشگیری و مقابله با حملات :

  به منظور پیشگیری از حملات ومقابله با آنها، موارد زیر در هنگام طراحی برنامه های کاربردی باید در نظر گرفته شوند :

  •   bullet اعتبار سنجی و فیلتر کردن داده های ورودی و پاک سازی از یک سری از لیترال ها

  داده ورودی باید عاری از هرگونه کاراکتری باشد که سبب ایجاد حملات تزریق می گردد. البته این روش به تنهایی نمی تواند مقابل همه ی حملات را بگیرد مانند حملات XSS و یا حملات ناشی از سرریز بافر. برای این منظور می توان اقدامات زیر را انجام داد:

  •   bullet استفاده از لیست سفید (White List)
  •   bulletتعریف کاراکترهای مجاز و قابل قبول برای ورودی مورد نظر مثلا استفاده از regular expression ها
  •   bulletتعیین فرمت برای داده ورودی، مثل email,Date,zipCode
  •   bulletانتخاب یکی از مقادیر در ورودی های ثابت مثل لیست ها
  •   bulletمحدود کردن طول ورودی یا عدم استفاده از کاراکترهای non printable

 

  •   bullet استفاده از دستور Escape

استفاده از این متد در پایگاه داده نیاز به دقت بالایی دارد.بطور معمول تلاش باید بر این باشد که اصلا اجازه ورود کاراکترهای مشکل زا به پایگاه داده نشود که بعد لازم به کنترل آنها باشیم.

  •   bullet استفاده از پارامتر ورودی برای  query ها.

 ساخت دستورات SQL بصورت پویا و از طریق الحاق چندین رشته با هم ، این اجازه را به حمله کننده می دهد که query دلخواه خود را بسازد و اجرا نماید ، در حالیکه استفاده از پارامتر به میزان قابل توجهی جلوی اینگونه حملات را می گیرد.

  •   bullet استفاده از روال ها ( store procedure ) .

  در هنگام استفاده از روال ها، بدلیل چک کردن نوع پارامترهای ورودی، تا حد زیادی می توان به کاهش تهدید تزریق کد در پایگاه داده، کمک کرد. اگر حمله کننده داده ای وارد نماید که با نوع در نظر گرفته شده برای روال مطابقت نداشته باشد، برنامه پیام خطا می دهد و از اجرای دستور خودداری می کند . طبیعتا هندل کردن این موارد باید در داخل نرم افزار صورت گیرد. با این حال در صورتیکه روال از یک رشته دستکاری شده در کد استفاده کند و دستور EXECSQL را فراخوانی نماید، هندل کردن نامناسب ورودی کاربر در کد منجر به حملات تزریق می گردد.

  •   bullet مزیت امنیتی : محدود کردن دسترسی کاربران به استفاده از روال ها و جلوگیری ار ساخت query های دینامیک در بدنه برنامه
  •   bullet مزیت غیر امنیتی: نگهداری و جمع آوری کدهای SQL دریک مکان و دور از دسترسی کاربران

 نکته: توجه داشته باشید که این خود روال نیست که از حملات جلوگیری می نماید بلکه بدلیل پنهان کردن لایه های دیتابیس از دید حمله کننده، به جلوگیری و مقابله با اینگونه حملات کمک می کند.

  •   bullet رمزنگاری داده های حساس
  •   bullet صدور مجوز برای استفاده از دستورات SQL  (Grant command).

  این یک روش دفاعی در عمق کار است. فرض کنید که حمله کننده به هر طریقی موفق شود باگی در سیستم پیدا کند و وارد شود، حال چه باید کرد؟ در این روش به هر روال مجوزی اعطا می شود و مشخص می نماید چه کاربران  و برنامه هایی می توانند روال مورد نظر را اجرا نمایند. این یک روش دفاعی فوق العاده است چرا که اگر مهاجم تلاش برای دسترسی به هر شی از پایگاه داده داشته باشد، پایگاه داده با استفاده از مجوزها، جلوی حمله را می گیرد.

  با پیاده سازی موارد ذکر شده در  برنامه، از حملات تزریق مرتبه اول تا حد زیادی جلوگیری می شود اما بمنظور تامین امنیت بیشتر و کاهش حملات انواع دیگر، دوشرط دیگر هم باید رعایت شوند:

  •   bullet استفاده صحیح و مناسب از لیترال ها و جداکننده ها در تعریف شناسه ها در SQL. (استفاده از دستور Escape)
  •   bullet کنترل سایز بافر و هندل کردن آن بمنظور جلوگیری از سرریز شدن و بریدن قسمتی از دستور

  معرفی تکنیک های خودکار برای تشخیص و جلوگیری از حملات SQL :

  •   bullet Waves : یک تکنیک جعبه سیاه برای تست برنامه های وب. این تکنیک با استفاده از یک web crawler ، تمامی نقاط یک برنامه وب را که می تواند برای تزریق sql مورد استفاده قرار گیرد، معرفی می کند. سپس براساس فهرستی از الگوها و تکنیک های حمله، حملاتی را که این نقاط را هدف قرار می دهند،طراحی میکند. سپس waves پاسخ برنامه را به این حملات بررسی کرده و با استفاده از تکنیک یادگیری ماشین، روش های شناسایی حمله خود را بهبود می بخشد.
  •   bullet JDBC_checker : تکنیکی است که نوع تصحیح پرس و جوهای sql تولید شده بصورت پویا را، به شکل ایستا بررسی می کند. این تکنیک با هدف تشخیص و جلوگیری از حملات معمول sql طراحی نشده است، ولی می ت واند برای جلوگیری از حملاتی که از امتیاز عدم تطابق انواع، بهره می گیرند، در یک رشته پرس و جویی که بصورت پویا تولید شده است، مورد استفاده قرار گیرد.

  JDBC_checker قادر است یکی از علت های اصلی آسیب پذیریهای حملات تزریق sql، یعنی بررسی نامناسب بودن نوع ورودی را تشخیص دهد.

  •   bullet AMNESIA : مبتنی بر مدلی است که تحلیل ایستا و نظارت زمان اجرا را ترکیب می کند. در فاز ایستای این تکنیک، از تحلیل ایستا برای ساختن مدل هایی ار انواع مختلف پرس و جوهایی که یک برنامه به طور طبیعی می تواند در هر نقطه دسترسی به پایگاه داده تولید کند، استفاده می شود. در فاز پویا، این تکنیک تمامی پرس و جوها را پیش از ارسال شدن به پایگاه داده نگه داشته و هر پرس و جو را در مورد مدل هایی که بصورت ایستا ساخته شده اند، بررسی می کند، پرس و جوهایی که مدل را نقض می کنند، به عنوان حملات تزریق sql شناسایی شده و از اجرای آنها در پایگاه داده جلوگیری می شود.