امنیت خود را تضمین کنید ( قسمت دوم )

۳ دیدگاه

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

SQL INJECTION چیست ؟

در همه جا می توانید یک تعریف کلی از sql injection پیدا کنید . ولی sql injection در واقع به عملی گفته می شود که طی آن یک فرد نفوذگر کدهای دلخواه خود را به query های برنامه اضافه می کند و از آن بهره می برد . همان طور که قبلا هم گفته شد در اکثر برنامه های تحت وب برای حفظ و نگهداری اطلاعات از یک بانک اطلاعاتی یا پایگاه داده استفاده می شود که این پایگاه های داده هم برای ارتباط با برنامه ها از query های SQL استفاده می کنند . حال اگر برنامه بخواهد مستقیم داده هایی که از کاربر توسط فرم های Html دریافت می کند را به query  بدهد و query هم به پایگاه داده اینجاست که براحتی کدهای مخرب هم قابلیت اجرا خواهند داشت .

آموزش SQL INJECTION :

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

تشخیص برنامه های آسیب پذیر :

معمولا در اکثر مواقع query هایی از جنس sql می توانند دارای مقادیری از نوع عددی – رشته ای یا تاریخی باشند که به آنها به ترتیب Integer – String یا Date هم گفته می شود . در زبان های sql معمولا مقادیر عددی همان طور به پایگاه داده فرستاده می شوند ولی مقادیر رشته ای و تاریخ ها با quote هایی در دو طرفشان گذر داده می شوند . برای مثال :

Select * From MyTable Where ID = 4
Select * From MyTable Where Name = ‘Mohammad’

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

MyPage/ProductList.aspx?PID = 4

در اینگونه مثال ها تست برنامه برای حملات Sql Injection بسیار راحت خواهد بود . برای این کار به دو گونه می توان عمل کرد . روش اول : مقدار را به صورت ۴’ به عنوان پارامتر به query string می دهیم تا از طریق برنامه به پایگاه داده فرستاده شود که به طور قطع در برنامه یک خطا رخ خواهد داد . اما روش دوم : برای این کار مقدار را به صورت ۳ + ۱ به query string تزریق می کنیم . اما در اکثر مواقع مورد دوم به آرامی اجرا خواهد شد و این نشان از آسیب پذیر بودن برنامه دارد . دو گزارش Sql ما در نهایت به شکل زیر به برنامه فرستاده می شوند .

Select * From MyTable Where ID = 4’
Select * From MyTable Where ID = 3 + 1

پس اگر در مورد اول برنامه یک خطای کنترل نشده توسط برنامه نویس تولید نمی کند یا در مورد دوم برنامه به درستی عمل کرد نتیجه آسیب پذیر بودن برنامه می باشد . حالا موضوع را برای مقادیر رشته ای (String) مورد بررسی قرار می دهیم .

در همین رابطه :   هکرهای ناشناخته ،وب سایت وزارت دفاع سوریه را هک کردند !

در مورد رشته ها تنها دو تفاوت وجود دارد . اول اینکه عبارات رشته ای درون quote هایی نگه داری می شوند بنابراین انجام عمل breaking out از quote ها الزامی می باشد . دوم اینکه سرور های مختلف Sql از روش های متفاوتی برای الحاق رشته ها به هم استفاده می کنند . برای مثال Microsoft Sql Server از + برای الحاق رشته ها استفاده می کند در صورتی که Oracle از || استفاده می کند . به جز این دو مورد می توان گفت اکثر تکنیک ها بین رشته و اعداد مشابه می باشد . برای مثال :

MyPage/ProductList.aspx?PName = ‘mohammad’

برای تست کردن این مورد برای Sql Injection ناچار به تعویض پارامتر های PName می شویم . یکبار با یک رشته غیر معتبر همچون m’ و یکبار دیگر با یک رشته معتبر تر همچون m’+’ohammad مورد استفاده قرار میگیرد . نتیجه query نهایی به شکل زیر به برنامه گزارش می شود :

Select * From MyTable Where PName = ‘m’’
Select * From MyTable Where PName = ‘m’ + ‘ohammad’

در اینجا گزارش اول تولید خطا می کند ولی دومی در صورت آسیب پذیر بودن اجرا می شود .

راهکار های جلوگیری از Sql Injection  :

— استفاده از پارامتر ها برای پاس دادن query به سرور

— استفاده از Stored procedure ها در sql server

— کنترل تمام ورودی هایی که کاربر وارد می کند

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

در همین رابطه :   نکات جالب و کاربردی برای تازه کاران php
دسته بندی : ASP.netPHPامنيت

3 نظر

  1. سلام

    ممنون محمد جان ،مطلب خوبی بود.

    + اینکه در mysql با استفاده از تابع mysql_real_scape_string میشه تا حد زیادی امنیت sql رو بالا برد.

    موفقیت

دیدگاهتان را بنویسید

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