پيش تر درباره مسائل ابتدايي هک چيز هايي گفته بودم و قول دادم تا بيشتر مسائل را بررسي کنيم . حالا به يکي از معروف ترين حملاتي که اکثرا هکر ها مورد استفاده قرار مي دهند مي پردازيم .
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 بسيار راحت خواهد بود . براي اين کار به دو گونه مي توان عمل کرد . روش اول : مقدار را به صورت 4’ به عنوان پارامتر به query string مي دهيم تا از طريق برنامه به پايگاه داده فرستاده شود که به طور قطع در برنامه يک خطا رخ خواهد داد . اما روش دوم : براي اين کار مقدار را به صورت 3 + 1 به 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
— کنترل تمام ورودي هايي که کاربر وارد مي کند
با استفاده از روش هاي بالا مي توانيد برنامه خود را تا 90 در صد از اين نوع حملات محافظت کنيد . در آينده بيشتر در اين مورد بحث مي کنيم و روش هاي مقابله به طور کامل توضيح داده مي شود .
ممنون از مطلب خوبتون
بله علی جان ایمیلتون رو هم تازه دیدم چشم مواردی که گفتی رعایت می شه
سلام
ممنون محمد جان ،مطلب خوبی بود.
+ اینکه در mysql با استفاده از تابع mysql_real_scape_string میشه تا حد زیادی امنیت sql رو بالا برد.
موفقیت