مسیر سایت

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

  چکیده:

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

  مقدمه :

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

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

  شکل زیر بیانگر یک نمونه از اینگونه حملات می باشد:

 

 sql injection

  چه کسانی و در چه سطحی باید با اینگونه حملات آشنایی داشته باشند؟

  در هر سازمان مهندسی چهار گروه اصلی وجود دارند که هریک به نحوی با موضوع امنیت داده ها سر و کار دارند. این چهار گروه عبارتند از : مسئول پروژه ، معمار ، توسعه دهنده برنامه ، تستر

  1- مسئول پروژه (Business Decision Maker)

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

  به منظور تعیین اولویت های کاری در زمینه امنیت، بر اساس نیازهای مشتری و بودجه تعریف شده برای کار، مسئول پروژه باید با حملاتی که بر روی سایر پروژه های مشابه صورت گرفته، آشنایی کامل داشته باشد. یعنی بداند که چه مواردی پروژه اش را تهدید می کنند.

  2- معمار (Architect)

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

  3- توسعه دهنده (Developer)

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

  4- تستر (Tester/QA)

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

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

  حملات تزریق دستورات SQL را می توان به سه نوع متفاوت دسته بندی کرد:

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

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

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

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

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

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

  انواع معمول حملات تزریق در دستورات SQL :

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

  •   bullet استفاده از دستور UNION Select ، بمنظور دزدیدن اطلاعات حساس از پایگاه داده
      bullet استفاده از چندین دستور SQL در کنار هم، بمنظور از بین بردن دیتاها یا اجرای دستورات مورد نظر حمله کننده بر روی دیتابیس سرور.

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

  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 و میزان تاخیر در جواب ، طی چند مرحله می توان نام اولین جدول را بدست آورد.

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