SQL Injection چیست؟
اگر SQL Injection را بصورت فارسی بخواهیم ترجمه کنیم ، میتوانیم از لغت تزریق SQL استفاده کنیم. ولی معنی این تزریق چیست و از چه طریقی انجام میگیرد؟
برنامه ها و یا سایتهایی که بصورت آنلاین اطلاعات آنها در پایگاه داده ای ذخیره میگردد، برای دستیابی به اطلاعات یا جهت ورود و آپدیت اطلاعات از دستوراتی استفاده میکنند که به آنها Query گفته میشود. در واقع Query دستوراتی برای SQL میباشد که باعث ایجاد عملیاتی بر روی دیتاهای موجود در دیتابیس میگردد.
هنگامی که برنامه نویس یک وب سایت از طریق فرم های موجود در سایت، قصد دارد اطلاعاتی را به کاربر نمایش دهد، از طریق اجرای Query در بک گراند برنامه خود، اطلاعات مورد نظر را از دیتابیس استخراج و عملیات مورد نیاز را بر روی آن انجام میدهد.
وقتی وب سایت دارای فرم ورود به سایت باشد و اطلاعاتی از کاربر دریافت و با اطلاعات موجود دیتابیس مقایسه میگیرد، آسیب پذیری دیتابیس و اطلاعات موجود در آن بسیار بالا میرود. بصورت ساده اگر بخواهیم بیان کنیم، هکر ها هنگام برخورد با این فرم ها، همانند فرم های ورود به سایت، اقدام به وارد کردن یکسری کد های مخرب در فیلدهای نام کاربری و یا رمز عبور میکنند. این کدهای مخرب SQL بهمراه کدهای برنامه نویس یک وب سایت، وارد SQL شده و نتیجه دلخواه هکر بدست می آید. به این عملیات که به اصطلاح تزریق کد مخرب SQL بر روی فیلد های ورودی یک وب سایت انجام میگیرد، در اصطلاح SQL Injection گفته میشود.
عملکرد SQL injection به چه صورت هست؟
یک مثال خیلی ساده که شما را با نحوه عملکرد SQL Injection ها آشنا میکند:
فرض کنیم یک صفحه ورود به سایت داریم که از طریق وارد نمودن نام کاربری فرد میتوانیم به قسمتی از اطلاعات جدول مد نظر دسترسی پیدا کنیم. برای این منظور در این صفحه وب، نیاز هست که یک فیلد ورودی از نوع Text در قسمت ورود به سایت داشته باشیم، که اطلاعات وارد شده در این فیلد با قسمتی از اطلاعات جدول مرتبط با کاربران بررسی گردد. بعد از وارد نمودن نام کاربری، اطلاعات دریافتی در این فیلد ورودی صفحه وب را با اطلاعات نام کاربری جدول دیتابیس مقایسه کنیم. به عنوان مثال بعد از وارد کردن نام کاربری و انتخاب کلید بررسی یک Query توسط برنامه نویس به دیتابیس ارسال میگردد. بصورت ساده کد زیر را در نظر بگیرید:
SELECT * FROM users WHERE uname = ‘” + UserName + “‘
ظاهر این کد بسیار ساده صحیح میباشد، اما مشکل کار در این کد نیست. بلکه هکر بصورت بسیار ساده میتوانید به جای نام کاربری در فیلد UserName از کدهای مخربی استفاده کند که نتیجه را بصورت هوشمندانه تحت هر شرایطی مثبت دریافت کنید. به عنوان مثال در صورتی که هکر کد زیر را در نام کاربری صفحه ورود وارد کند، این کد به جای نام کاربری در Query اجرا میگردد و نتیجه صحیح میباشد. همانند اینکه نام کاربری وارد شده وجود ندارد ولی با مثبت کردن نتیجه توسط کد مخرب، ظاهرا نام کاربری صحیح وارد شده است:
‘ OR ‘a’=’a
Query ارسال شده بعد از ورود این مقدار در فیلد ورودی به شکل زیر خواهد بود که تزریق SQL یا SQL Injection هر چند بسیار ساده و کاملا ابتدایی، طلقی میگردد.
SELECT * FROM users WHERE uname = ” OR ‘a’=’a’;
البته حملات و کدهای مخرب SQL Injection بسیار زیاد میباشد و دارای ترفند ها و عملکرد های متفاوتی هستند ،که بسته به هدف هکر میتواند خروجی کامل یک دیتابیس باشد یا حذف اطلاعات قسمتی از دیتابیس بدون دسترسی ادمین!
چطور میتوانیم از حملات SQL Injection در امان باشیم؟
اساس کار هکر ها در ضعف برنامه نویسی یک سیستم میباشد. به طوری که برنامه نویس در هنگام دریافت اطلاعات ورودی از کاربر، محدودیتی در نوع ورودی و کارکترهای مجاز اعمال نکند، هکر یک قدم به اطلاعات دیتابیس در سرور نزدیکتر میگردد. برنامه نویس یک وب سایت بایستی در نظر داشته باشد که کلیه اطلاعات ورودی یک فیلد درگیر با دیتابیس، بایستی قبل از اعتبار سنجی کامل، به هیچ عنوان در کنار Query به دیتابیس ارسال نگردد.
قبل از ارسال فیلد ها به دیتابیس، بایستی از طریق الگوریتم های پیچیده، کارکترهای ورودی را بدقت چک و بعد از فیلتر چندگانه کاراکتر ها، نسبت به اضافه نمودن فیلد به Query اقدام کنیم.
از روش های غیر مرسوم، ایجاد کاربرهای مختلف در بخش های متفاوت Query ها میباشد که Query های اجرا شده هر بخش دسترسی های محدود به بخش مد نظر را دارند و حتی در صورتی که مورد نفوذ قرار گیرند، کل دیتابیس در اختیار هکر قرار نخواهد گرفت.
هکر را راهنمایی نکنید! خطاهایی که برخی از برنامه نویسان به هنگام ورود اطلاعات اشتباه به کاربر نمایش میدهند میتواند، راهنمای هکرها باشد. مثلا استفاده از “.” در نام کاربری مجاز نمیباشد! در واقع شما به هکر کمک کردید که یکی از کلماتی که نباید استفاده کند دات میباشد.
استفاده از مود سکیوریتی های معتبر با رول های در حال آپدیت میتوانید به شما کمک کند، تا همراه با کشف باگهای جدید این رول ها نیز آپدیت و جلوی حملات خرابکارانه گرفته شود.