آشنایی با SQL Injection (بخش نخست)

چگونه از برنامه خود در برابر هکرها محافظت کنیم

با گذشت بیش از ده سال از حمله به پورت‌های باز و سرویس‌های رخنه‌پذیر توسط مهاجمین، امروزه مدیران سیستم با نصب دیواره‌های آتش و انجام برخی موارد امنیتی، تنها امکان مشاهده برخی سرویس‌های ضروری را فراهم می‌کنند که بسیاری از این سرویس‌ها هم پچ شده و غیرقابل نفوذ هستند. بنابراین امروزه مهاجمین سیستم‌های رایانه‌ای، استراتژی خود را از تهاجم به سیستم عامل به‌سوی تهاجم علیه برنامه‌های در حال اجرا روی سیستم عامل‌ها تغییر داده‌اند. آنچه مسلم است انگیزه اصلی این افراد در سرقت اطلاعات، سرویس‌ها و به‌طور کلی هر آنچه منفعتی برای ایشان ایجاد کند تمرکز یافته است.
کد خبر: ۲۷۷۱۹۹

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

سه‌کوئل اینجکشن

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

با ارایه چند مثال به بررسی عملی این تکنیک می‌پردازیم:

صفحه وبی را در نظر بگیرید که برای انجام عملیاتی خاص، اقدام به دریافت شماره شناسایی از کاربر می‌کند. در صورتی که کاربر اقدام به تایپ شماره "1234" در فیلد مورد نظر کند، دستور زیر به بانک اطلاعاتی ارسال خواهد شد:

SELECT A,B

FROM testTable

WHERE id = 1234

در نتیجه دستور فوق، فیلدهای  Aو B که شماره شناسایی آنها "1234" است، از جدول testTable انتخاب خواهند شد.

حال در صورتی که مهاجم اقدام به تایپ عبارت "1234 OR 1=1" در فیلد فوق کند، دستور SQL به شکل زیر ارسال خواهد شد:

SELECT A,B

FROM testTable

WHERE id = 1234 OR 1=1
 
از آنجا که "1=1" موجود در قسمت شرطی دستور SELECT فوق همواره برقرار است، این عبارت منجر به خنثی شدن قسمت شرطی دستور شده و معادل با دستور زیر خواهد بود:

SELECT A,B

FROM testTable

همان‌طور که مشخص است، در نتیجه این دستور تمام رکوردهای موجود در جدول انتخاب خواهد شد.

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

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

حال در صورتی‌که مهاجم عبارت "1234; DROP TABLE users" را در فیلد شماره شناسایی وارد سازد، دستور SQL‌ زیر اجرا خواهد شد:

SELECT A,B

FROM testTable

WHERE id = 1234; DROP TABLE users;
دستور فوق متشکل از دو دستور SQL است که دستور اول برای انتخاب فیلدهای  Aو B از جدول testTabe است، اما دستور دوم صرف‌نظر از دستور اول، منجر به حذف جدول users‌ خواهد شد. بی‌شک در پی این حمله، ورود کاربران به سیستم مختل خواهد شد.

حال به بررسی روش‌های معمول در مقابله با سه‌کوئل اینجکشن می‌پردازیم:

* اعتبارسنجی مقادیر با تعیین نوع و تعداد کاراکترهای مجاز، انتخاب نوع داده‌ای مناسب و تعیین دامنه معتبر برای فیلدها.

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

نسبت به کاراکترها، نشانه‌ها و واژگان وارد شده توسط کاربر، به‌ویژه در موارد کلمات و نشان‌های مورد استفاده در دستورات SQL، حساسیت نشان دهیم.

انتخاب نوع داده‌ای مناسب در ساختار تشکیل دستور SQL‌:

"SELECT A,B FROM testTable
WHERE id = " + testVariable + ";"
در اینجا مقدار متغیر testVariable به‌عنوان مقدار id‌ در نظر گرفته می‌شود. حال اگر مقدار id‌ از نوع عددی باشد، انتخاب نوع داده رشته‌ای برای متغیر testVariable منجر به افزایش آسیب‌پذیری برنامه خواهد شد، چراکه در این‌صورت کاربر مجاز به وارد کردن هر ترکیبی از کاراکترها علاوه بر اعداد است.
 

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

* استفاده از پارامترها و رویه های ذخیره شده در بانک اطلاعاتی.

در این‌صورت پارامترها از نظر نوع ارسال شده و طول مجاز بررسی می‌شوند، همچنین مقادیر ارسالی از نوع دستورات اجرایی در نظر گرفته نمی‌شوند.

* و سرانجام، پرهیز از نمایش صریح خطاهای موجود در اجرای دستورات به کاربر.

منابع: msdn.microsoft.com و  wikipedia

محمد غفاری

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها