SQL Injection – حالتهای حمله و دفاع

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

بخش اول – اصول تزریق

تزریق SQL یکی از روشهای هک در وب است ، که جز پورت “۸۰” چیز دیگری نیاز ندارد.

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

اصل اساسی تزریق SQL ، استفاده از کدهای نا امن برروی سیستمی است که به اینترنت متصل شده است.

هک کردن رشته پرس و جو

یک آدرس وب معمولی مربوط به یک شعر ، همانند مثال زیر را در نظر بگیرید :

http://stuart/homebase/practical/index.asp?story=1

وقتی شما صفحه وب بالا را باز می کنید با یک عنوان صفحه مورد استقبال قرار می گیرید. (Welcome to Bangkok’s Worst Poetry.com ) ، عنوان شعر ( The Mating of the Mongolian Butterfly ) ، نام شاعر ( Stuart ) ، ملیت ( Australian ) و سن ( ۳۲ ) و خلاصه ای از شعر.

از این رو شما می توانید به این پی ببرید که “۱” در رشته پرس و جو نوعی مرجع برای شعر اصلی است. بنابراین با شکستن رشته پرس و جو به رشته زیر می رسیم :

Story=1

مقدار  رشته “Story” را به “۴” تغییر می دهیم و صفحه را با آدرس زیر بارگذاری می کنیم :

http://stuart/homebase/practical/index.asp?story=4

 

ما الان شعر “Cheese” را مشاهده می کنیم.

کد اسکریپت که برای ساخت این صفحه استفاده شده ، در زیر آمده است :

<%

storyID=request(“story”)

StrSql0=”SELECT s.sID,s.title ,s.blurb,s.story,a.aName FROM story s, author a

WHERE sID=”&storyID&” AND a.aID=s.aID”

Rs0.Open StrSql0,oConn

%>

متغیری که ما با آن کار می کنیم “story” است ، مقدار “story” بدون اعتبار سنجی ورودی مستقیماً به پرس و جو برمی گردد ، که اطلاعات را بازیابی می کند. در این قسمت ما هرچیزی را به عنوان ارزش برای “StoryID” می توانیم ، قرار دهیم و این امر به عبارت SQL برمی گردد. ما می توانیم دستوراتی را به پایگاه داده بفرستیم که توسعه دهنده هرگز در نظر نگرفته باشد.

شکستن رشته پرس و جو

در اینجا دو راه مستقیم برای شکستن یک آدرس وب وجود دارد. در ابتدا شما می توانید دستورات SQL را به آدرس وب اضافه کنید ، مانند مثال زیر :

http://stuart/homebase/practical/in dex.asp?story=3 AND someothercolumn=3

در این مثال با خطای زیر مواجه می شویم :

Error Type:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)

[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name

‘someothercolumn’.

/homebase/practical/index.asp, line 33

این نشان دهنده این است که تزریق SQL آسان تر است از اینکه ما دستور SQL را از :

SELECT s.sID,s.title,s.b lurb,s.story,a.aName FROM story s, author a WHERE sID=3

AND a.aID=s.aID

تغییر دهیم به :

SELECT s.sID,s.title,s.blurb,s.story,a.aName FROM story s, author a WHERE sID=3

AND someothercolumn=3 AND a.aID=s.aID

ستون “someothercolumn” وجود ندارد ، بنابراین با یک خطای SQL مواجه می شویم.

دومین راه برای شکستن یک صفحه ، استفاده از یک (‘) است.

http://stuart/homebase/practical/index.asp?story=3′

لینک بالا خطای زیر را برمی گرداند :

Error Type:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)

[Microsoft][ODBC SQL Server Driver][SQL Server]Unclo sed quotation mark before

the character string ‘ AND a.aID=s.aID’.

/homebase/practical/index.asp, line 20

اسکریپت بدلیل اینکه بعد از “۳” یک علامت (‘) قرار داده ایم بسته شده است ، که باعث شکسته شدن دستور SQL می شود. با اضافه کردن علامت (:) ، دستور SQL که به سرور باز می گردد ،  از :

SELECT s.sID,s.title,s.blurb,s.story,a.aName FROM story s, author a WHERE sID=3

AND a.aID=s.aID

به :

SELECT s.sID,s.title,s.blurb,s.story,a.aName FROM story s, author a WHERE sID=3′

AND a.aID=s.aID

تغییر می کند

علامت (:) موجب بروز خطای “علامت نقل قول باز” می شود.

کمی غیر معمول است ، که یک عدد صحیح در دستور SQL استفاده نشود.

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

http://stuart/homebase/practical/index_co untry.asp?country=laos

SQL مربوطه به این آدرس چنین است :

SELECT a,aID,a.aName FROM author a WHERE a.aNationali ty=’laos’

توجه داشته باشید که مقدار “laos” یک رشته است ، بنابراین هنگامی که آدرس وب را دوباره تغییر می دهیم ، یک علامت (‘) در “laos” اضافه می کنیم ، این علامت به SQL می رود و آن را می شکند ، مانند زیر :

http://stuart/homebase/practical/index_count ry.asp?country=la’os

SELECT a,aID,a.aName FROM author a WHERE a.aNati onality=’la’os’

دستور SQL بدلیل “علامت نقل قول باز” از کار خواهد افتاد.

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

بخش دوم – محافظت

از سایت خود در برابر تزریق SQL محافظت کنید ، هیچ راه حلی همه مسائل را حل نمی کند. اما یک سری دیوار های کوچک با یکدیگر تشکیل دیواری قدرتمند را می دهند.

حداقل دیوارهای لازم جهت جلوگیری از مهاجمین :

۱٫ از نامهای اصلی و سخت برای نام جداول و ستونها استفاده کنید تا قابل حدس زدن نباشند.

این واقعیتی است که هر شخصی نام جدول کاربران خود را “users” می نامد و این می تواند دلیل بزرگی باشد برای این که چرا شما این کار را انجام ندهید. اگر یک سایت شخصی دارید ، آنرا با هر عنوانی می توانید بسازید ، اما برای یک مجموعه بزرگ بهتر است متفاوت باشد :

Table: user_Details

Columns: u_uID,u_user_Name,u_user_Password etc

۲٫ از نامهای مستعار استفاده کنید.

مثال زیر را درنظر بگیرید :

SELECT s.sID,s.title,s.blu rb,s.story,a.aName,a.aNationality,a.aAge FROM story s,

author a WHERE sID=3 AND a.aID=s.aID

با این مثال مقایسه کنید :

SELECT story.sID, story.title, story.blurb, story.story, author.aName,

author.aNationality, author.aAge FROM story s, author a WHERE sID=3 AND

author.aID= story.aID

اگر یک مهاجم این دستور را بشکند ، در انتها با یک پیغام خطا مواجه می شود. کدامیک اطلاعات بیشتری به مهاجم می دهد؟ هنگامی که شما از نام های مستعار استفاده می کنید ، کوتاه شده آنها را بکار گیرید (s به جای story). اینکار باعث می شود مهاجم به اطلاعات ناقص دست یابد.

۳٫ در هر فرم محدودیت طول تنظیم کنید و از نامهای واقعی برای ستونها استفاده نکنید.

اگر سایت شما صفحه ورود کاربران داشته باشد ، دوگزینه برای ورود وجود دارد : ۱- نام کاربری ۲- رمز ورود

این دو را به یک شماره واقعی محدود کنید.

<input type=”text” name=”member_name” size=”12″ maxlength=”۶۰”>

<input type=”text” name=”member_pa ssword” size=”12″ maxlength=”۶۰”>

نام واقعی ستون را برای فیلد نام ها استفاده نکنید ، زیرا کار برای مهاجم آسان می شود. در قطعه کد بالا ، مهاجم ستونهای “u_user_Name” و “u_user_Password” را در جدول “user_Details” تطبیق می دهد.

۴٫ حداقل اعتبار را برای اطلاعات خود در سمت سرور برای محتوا ، طول و قالب تنظیم کنید.

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

از یک اعتبار اسکریپت برای کل سایت استفاده نکنید. اطلاعات مختلف نیازمند اعتبار سنجی مختلف هستند. به عنوان مثال اعتبارسنجی برای “username” با “story ID” متفاوت خواهد بود.

حداقل پردازشهای لازم که در زیر به آنها اشاره شده است را برروی داده های خود اعمال کنید :

الف – حذف علامت ()

اگر این عمل امکان پذیر نیست آنها را دو برابر کنید و مانند مثال زیر از دستور جایگزینی استفاده کنید :

function quotehandle(data)

quotehandle=replace(data,”‘”,”””)

end function

ب – حذف علامتهای (;) و (–)

function sqldash(data)

sqldash=replace(data,”–“,””)

end function

function sqlcolon(data)

sqlcolon=replace(data,”;”,””)

end function

پ – بررسی نوع داده ها

اگر شما در انتظار یک عدد صحیح هستید ، بررسی کنید که آیا ورودی یک عدد صحیح است. اگر اینطور نیست آن را رد کنید.

ت – تنظیم نوع داده ها

تقویت مرحله قبل و تنظیم نوع داده ها به طور صریح

storyID=CInt(request(“storyID”))

authorname=CStr(request(“authorname”))

ث – اعتبارسنجی داده ها

مطمئن شوید که داده ها صحیح هستند.

ج – بررسی طول داده ها

طول داده ها را بررسی کنید. اگر بیش از حد طولانی است آن را کوتاه کنید. به عنوان مثال اگر شما انتظار میزبانی بیش از ۱۰۰۰۰ شعر در سایت خود را دارید ، “poemID” نیازی نیست بیش از ۴ کارکتر باشد. تابع زیر ، یک مثال ساده از نحوه انجام این کار است :

data=left(data,4)

و برای داده های طولانی تر :

data=left(data,125)

۵٫ اگر از محصولی استفاده می کنید که سورس کد آن در دسترس است ، آنرا در رابطه با آسیب پذیری ها به روز نگه دارید.

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

۶٫ طرح خود را منحصر به فرد کنید. به عنوان مثال اگر اجازه ایجاد نام جدول داده شده است مطمئن شوید که تغییرات از پیش فرض سایت متمایز باشد.

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

۷٫ در صورت امکان از رویه های ذخیره شده استفاده کنید.

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

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

۸٫ کدهای سایت را بررسی کنید.

هیچ کس کد کاملی نمی نویسد. اعضای یک تیم باید کد یکدیگر را مطالعه کنند تا احتمال وجود نقص در کدها کاهش یابد.

۹٫ سرور خود را امن نمایید.

روش های زیر را در سرور اعمال کنید :

الف – حداقل دسترسی برای کابران

ب – حذف حسابهای غیرضروری

پ – حذف یا غیرفعال کردن رویه های ذخیره شده غیرضروری و توسعه یافته

ت – حذف اطلاعات غیرضروری

ث – به روز رسانی

منبع : sans.org

شما ممکن است علاقه داشته باشید:

0 تفکر بر روی “SQL Injection – حالتهای حمله و دفاع”

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شبکه های مجازی ما

دسته بندی ها