SQL Injection چیست ؟

چهارشنبه 6 خرداد 1394

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

 حملات تزریق زمانی رخ می دهد که برنامه داده هایی را از کاربر دریافت کند و از آنها در ساخت جملات SQL استفاده نماید ،بی آنکه روی داده ها اعتبار سنجی (validating) و پاکسازی (sanitizing) صورت گیرد. در واقع هدف از اینگونه حملات ،داده های ساکن در یک پایگاه داده می باشد که از طریق Firewall محافظت می شوند. از این روش برای سرقت داده های حساس، تغییر یا تخریب داده، اجرای دستورات admin روی دیتابیس و یا حتی در مواردی در اختیار گرفتن مکانیزم کل ماشین، استفاده می شود.

  دسته بندی حملات تزریق:

  1- حملات مرتبه اول ( First-order injection )

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

  2- حملات مرتبه دوم ( Second-order injection )

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

  3- حملات تزریق از طریق بریدن قسمتی از دستورات  ( SQL injection by truncation )

  مثال هایی از انواع حملات :

  1- Tautologies attack

  در این نوع حملات به قسمت شرطی دستور، کدهایی اضافه می شود و بیشتر بمنظور فرار از اهراز هویت و استخراج داده ها از دیتابیس است. بعنوان مثال بجای نام کاربری در ورودی می توان عبارت هایی نظیر ‘or 1=1 ({, ‘ or 1=1--,’ or 1=1/* وارد نمود.

=Select accounts from Users where login =’’or 1=1 -- and pass =’’ and pin

  نتیجه اینگونه حملات در همان لحظه قابل مشاهده است.

  2- Illegal/logically incorrect queries attack

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

((’Convert (int, (select top1 name from sysobjects where xtype =’u

  دستور sql بصورت زیر اجرا می گردد:

Select accounts from Users where login = ’’ and pass =’’ and pin = Convert (int, (select top1 name from) sysobjects where xtype =’u’)

  پیام خطایی که sql میدهد بصورت زیر می باشد که بیانگر نام پایگاه داده ، نام جدول و نوع ستون است:

Microsoft OLE DB provider for sql server (0x80040E07) Error converting nvarchar value ‘CreditCards’ to a column of data type.

  از نتیجه حاصل شده ، فرد مهاجم برای حملات بعدی خود استفاده می نماید.

  3- Union query attack

  به منظور تغییر رکوردهای برگشتی از پایگاه داده برای فرار از احراز هویت و یا استخراج داده، مورد استفاده قرار می گیرد. بعنوان مثال فرض کنید عبارت زیر را در قسمت login وارد نماییم:

‘Union Select cardNo from CreditCards where accountNo = 10032--

  دستور sql بصورت زیر اجرا می گردد:

Select accounts from Users where login =’’Union Select cardNo from CreditCards where accNo = 10032--and pass=’’ and pin = ‘’

  با اجرای این دستور اطلاعات جدول دوم نیز برای شرط مورد نظر نمایش داده می شود.

  4- Piggy-Backed queries attack

  در این روش query های دیگری به query اصلی اضافه می شوند با هدف منع سرویس، تغییر داده، استخراج داده و یا اجرای دستورات از راه دور. بعنوان مثال فرض کنید عبارت زیر را درفیلد pass وارد نماییم:

‘; drop table User--

  دستور sql بصورت زیر اجرا می گردد:

Select accounts from Users where login=’doe’ and pass=’ ‘; drop table User--and pin = 123

  نتیجه این دستور پاک شدن تمام جداول کاربران است.

  5- Store procedures attack

  اینگونه حملات شبیه به حملات قبلی هستند با این تفاوت که یکی از روالهای استاندارد دیتابیس به بخشی از query اضافه می شود . بعنوان مثال استفاده از روال SHUTDOWN در فیلد pass :

Select accounts from Users where login = ‘doe’ and pass = ‘’; SHUTDOWN --and pin=

  با اجرای این دستور پایگاه داده خاموش می شود و برای مدتی نمی توان استفاده نمود.

  6- Inference attack

  از این روش بیشتر به منظور شناسایی پارامترهای آسیب پذیر برنامه و کسب اطلاعات استفاده می شود. به مثال زیر توجه کنید، در این مثال سعی بر این است که از طریق وارد کردن دستورات مختلف متوجه شد که آیا برنامه امن است یا ناامن:

  1)    Select accounts from Users where login = ‘legalUser’ and 1=0 -- ‘ and pass =’’ and pin =0

  2)    Select accounts from Users where login=’legalUser’ and 1=1 -- ‘ and pass=’’ and pin = 0

  چنانچه صفحه امن باشد پیام خطای نامعتبر بودن Login را می دهد ولی اگر صفحه ناامن باشد دستور دوم بدون خطا اجا می شود و نشان دهنده آسیب پذیر بودن پارامتر login است.

  در مثال بعدی نشان می دهیم که چگونه می توان از طریق تاخیر در جواب query اطلاعاتی را بدست آورد. فرض کنید مقدار زیر را در فیلد login وارد نماییم :

LegalUser’ and ASCII (Substring ((select top 1 name from sysobjects) 1, 1))>x Wait for 5--

  دستور sql بصورت زیر اجرا می گردد:

Select accounts from Users where login=’ LegalUser’ and ASCII (Substring ((select top 1 name from sysobjects) 1, 1))>x Wait for 5-- and pass=’’ and pin=0

  با تغییر مقادیر x و میزان تاخیر در جواب ، طی چند مرحله می توان نام اولین جدول را بدست آورد.

محمد طاهری

نویسنده 6 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید