فهرست محتوا
وقتی صحبت از اینترنت به میان میآید، امنیت و مطمئن بودن از اینکه اطلاعات شما دست نخورده باقی میماند یکی از مواردی بوده است که همراه با وب در ذهن تداعی میشود. در مقابل آن هک شدن سایتها و اطلاعات کاربران مورد دیگری است که به همین اندازه مهم است و این مورد نیز از بحثهای داغ اینترنت است. در این مقاله قصد داریم تا به یکی از انواع حملات مهم در وب و اینترنت بپردازیم و ببینیم که چگونه میتوان از آن جلوگیری نمود. حمله SQL Injection یکی از مهمترین و کاربردیترین روشهایی است که یک هکر میتواند از آن برای نفوذ به سایت شما استفاده کند و در این مقاله قصد داریم به بررسی جزئیات این حمله و روشهای جلوگیری و مهار آن بپردازیم.
نقطه آسیبپذیری که حمله SQL Injection از آن استفاده میکند پایگاه دادهی سایت شما است. پس بهتر است قبل از هر اقدامی به بررسی این اصل مهم از برنامههای کامپیوتری و سایتهای اینترنتی بپردازیم و ببینیم که زمین بازی ما کجاست و هکرها برای نفوذ با استفاده از حملهی SQL Injection کجا را انتخاب کردهاند و میتوانند با یک حملهی موفق چه چیزی بدست بیاورند.
ساختار پایگاه دادهها
پایگاه دادهها یا Database را میتوان یکی از اصلیترین بخشهای یک برنامه و یا یک سایت معرفی کرد که مسئولیت دادههای شما و اطلاعاتی که برنامه و یا سایت نیاز دارد تا به صورت پایدار در خود ذخیره کند را بر عهده دارد. اطلاعات پایدار اطلاعاتی هستند که شما انتظار دارید مدت زیادی روی سایت شما باقی بمانند و در موقع نیاز به روشهای ممکن از آنها استفاده شوند. همین مقالهای که اکنون در حال مطالعه آن هستید یکی از اطلاعات پایدار بهشمار میآید. در این داده ما یک دادهی عمومی را شاهد هستیم که هر کسی میتواند وارد سایت شده و به آن دستیابی داشته باشد.
اما دادههایی نیز وجود دارند که دسترسی به آنها نباید به همین سادگی امکانپذیر باشد. به عنوان مثال یوزرنیم و پسوردی که شما در سایت ثبتنام کردهاید و یا حتی شماره تماس و ایمیلی که با آن ثبتنام خود را انجام دادهاید. اینگونه موارد که باید مخفی بماند و قرار نیست در اختیار کسی قرار بگیرد، در پایگاههای داده کم نیستند و میتوان گفت که لو رفتن اطلاعات پایگاه داده یکی از بزرگترین شکستهای امنیتی برای یک سایت تلقی خواهد شد.
پایگاه دادهها به دو صورت کلی رابطهای و غیررابطهای وجود دارند. در پایگاه داده رابطهای شما یک ساختار جدولی را شاهد هستید. به این صورت که پایگاه داده از جدولهایی تشکیل شده است که همه اطلاعات در خانههای این جدول ذخیره میشود. ذخیرهسازی به این صورت انجام میگیرد که ستونهای جدول، متغیرها بوده و در هر ردیف یک رکورد از اطلاعات قرار میگیرد. به عنوان مثال جدولی از پایگاه داده که مربوط به کاربران است به این صورت خواهد بود که ستونها اطلاعات مربوط به یوزرنیم، پسورد، ایمیل و اطلاعات اینچنینی بوده و در هر ردیف اطلاعات مربوط به یک کاربر ذخیره میگردد.
در یک سایت جدولهای مختلفی وجود دارد که هر کدام از آنها میتواند حاوی اطلاعاتی عمومی باشد و یا اطلاعات محرمانه را برای ما ذخیرهسازی کند. اما در پایگاه دادههای غیررابطهای اوضاع کمی متفاوت است. یک پایگاه داده غیررابطهای دادههای خود را بر اساس ساختاری درختی و شبیه به XML ذخیرهسازی میکند که به صورت سطری بوده و در هر سطر یکی از عناصر پایگاه داده و مقداری که دارد قرار خواهد گرفت. بهعنوان مثال میتوان برای پایگاه داده رابطهای، پایگاه داده MariaDB و برای غیررابطهای، پایگاه داده MongoDB را معرفی نمود. (برای اطلاعات بیشتر در خصوص این پایگاه دادهها میتوانید به مقالات MariaDB چیست و مانگودیبی چیست مراجعه کنید.)
برای برقراری ارتباط با پایگاه داده باید از زبانهای مخصوص به پایگاه دادهها استفاده کنید که برای پایگاه دادههای رابطهای از زبان پرسوجوی رابطهای که به اختصار SQL نامیده میشود استفاده میشود. برای پایگاه دادههای غیررابطهای نیز این زبان غیررابطهای بوده و NOSQL نامیده میشود. البته تفاوت زبانهای SQL و NOSQL خیلی بیشتر از اضافه شدن یک «NO» در اول یکی از آنها میباشد و با دو مقوله کاملا مجزا طرف هستیم. حمله SQL Injection اصطلاحی است که عموما برای زبانها و پایگاه دادههای رابطهای بهکار میرود اما این به این معنی نیست که پایگاههای غیررابطهای از دست آن فرار کردهاند.
حملهی SQL Injection چیست؟
حمله SQL Injection یا همان تزریق کد SQL نوعی حمله است که در آن فرد یا گروه مهاجم سعی دارند با ارسال کدهای مختلف برای پایگاه داده راهی را برای نفوذ و یا بدست آوردن اطلاعات و یا حتی تخریب اطلاعاتی که نمیدانند چیست و در کجا قرار دارد، انجام دهند. این نوع از حملات یک نوع خطرناک بهشمار میآید و از خانوادهی حملات Code Injection هستند که همان تزریق کد میباشد. عموما URLهایی که کوئریهای مختلفی را درون خود دارند، صفحههای وارد کردن اطلاعات به فرمها و همینطور صفحههای لاگین از مواردی هستند که میتوانند اهداف مناسبی برای اجرای حمله SQL Injection باشد.
اجرای حمله SQL Injection به این صورت است که یک فهرست از دستورات و کوئریهای مختلف برای پایگاه داده تهیه شده و از روزنهای که تشخیص داده شده است و هکرها فکر میکنند که ممکن است کدهایی که از آنجا وارد میشود روی پایگاه داده پردازش شوند به سایت تزریق میشود. این تزریقها میتواند به وسیله ابزارهای خاصی مانند پکهای نرم افزاری موجود روی Kali Linux ،jSQL Injection برای پلتفرمهای جاوا و NoSQLMap برای پایگاه دادههای NOSQL انجام بگیرد.
همانطور که دیدیم اجرای حمله SQL Injection روی پایگاه دادههای غیر رابطهای نیز ممکن میباشد و واژه حمله SQL Injection دقیقا به معنی تزریق کد SQL نیست. بلکه هدف تزریق کوئریهایی است که بتواند از پایگاه داده اطلاعاتی را بهدست بیاورد. تشخیص و جلوگیری از این حملات کار سادهای نیست و معمولا پایگاه داده کوئریای را که به آن برسد بررسی کرده و آن را اجرا میکند. خیلی از این کوئریها حتی ممکن است که خروجی خاصی نداشته باشند و فقط به دنبال حذف پایگاه داده و مواردی از این دست باشند.
در ادامه به معرفی مهمترین روشها و انواع حملهی SQL Injection خواهیم پرداخت و میبینیم که چند نوع از این حمله وجود دارد.
انواع حملهی SQL Injection کدامند
روشهای مختلفی برای به اجرا درآوردن حمله SQL Injection وجود دارد اما میتوان گفت که چهار روش اصلی و پایه وجود دارد و اگر روش دیگری هم باشد از ترکیب این روشها با هم صورت خواهد گرفت. برای بررسی این روشها باید کمی بیشتر در مورد ساختار زبانهای پرسوجوی رابطهای و SQL صحبت کنیم. یک کوئری SQL از سه بخش اصلی تشکیل شده است در اولین بخش از کوئریها که عموما با Select شروع میشود، بخشی که مدنظر شما است که برگردانده و به شما نمایش داده شود را انتخاب میکنید. این قسمت یک و یا چند تا از ستونهای جدول شما میباشد.
قسمت دوم مشخصکننده جدولی است که شما از آن استفاده میکنید و میخواهید دادهها را از آن دریافت کنید. قسمت بعدی هم که در واقع شرط این دستور میباشد با عبارت Where جدا میشود. در این قسمت یک شرط مورد بررسی قرار میگیرد که میتواند به هر چیزی اشاره داشته باشد. به طور کل این ساختار را میتوان برای این دستورات معرفی نمود:
SELECT column1, column2, …
FROM table_name
WHERE condition;
در بخش اول ستونهای 1 و 2 معرفی شده و بعد از آن نام جدول مورد نظر شما قرار گرفته است که در این نمونه table_name نام دارد و در بخش سوم نیز شرایط قرار خواهند داشت که خود این شرایط و Conditionها میتواند خود روی چند جدول به صورت همزمان به اجرا در بیاید.
این ساختار بهصورت پیشفرض میتواند کاراییهای سطح بالایی را در عین سادگی داشته باشد که اگر برنامهنویس به این موارد دقت نکند میتواند آسیبپذیریهای مختلفی در سیستم ایجاد شود. به صورت کلی میتوان این حملهها را ناشی از این ساختار و بیدقتیهای مربوط به آن معرفی کرد:
فیلترهای اشتباه در بخش Where
در این تکنیک میتوان از بخش Condition که در مورد متغیر بودن آن و چند دستوره بودن صحبت کردیم سو استفاده کرد به این صورت که به جای داده ورودیای که در این بخش چک میشود، یک کوئری وارد میشود و از روشهای مختلفی برای اجرایی کردن این کد استفاده میشود. بهعنوان مثال کدی را در نظر بگیرید که به این صورت اجرا خواهد شد که موضوع جستجویی را که از شما دریافت میکند بهعنوان شرط در بخش Where ارسال میکند تا اطلاعاتی که مربوط به داده درخواستی شما میباشد را نمایش دهد.
در این قسمت اگر بیدقتی انجام گرفته باشد ممکن است در این بین یک کد وارد شود که میتواند تعدادی از جدولهای شما را تخریب کند یا همهی آنها را به نمایش بگذارد. به عنوان مثال برای کاراکتر متنیای که آن را کنترل میکنید. یک کاراکتر ارسال کرده و بعد از آن دستور را با «;» میبندد، دستور بعدی را برای حذف و یا دراپ کامل یک جدول نوشته و شرط منطقی آخر را نیز با یک عبارت همیشه درست کاراکتری تعیین میکند که میتواند تکمیلکننده باقی عبارتی باشد که قرار بوده است واقعا اجرا شود. به این صورت یک کوئری که قرار بود به عنوان شرط چک شده در Where انتخاب شود تبدیل به یک کد کاملا مخرب میشود که کل پایگاه داده را به هم میریزد.
ورودیهای کنترل نشده
مورد دیگری که میتواند بسیار خطرناک باشد این است که ورودیها از لحاظ نوعی که دارند کنترل نشده باشند. در این مورد میتوان به راحتی کدهای مخرب را در یک محل ورود داده وارد کرده و با زدن کلید اینتر و ارسال پارامترها با ارسال واژه مورد نظر یک کد مخرب را نیز ارسال کرد. به عنوان مثال ورودی زیر را در نظر بگیرید که میتواند به عنوان نام کاربری ارسال شود:
;1DROP TABLE users
در این ارسال عدد 1 به عنوان نام کاربری معرفی شده و بعد از آن دستور DROP TABLE وارد عمل شده و کل جدول users را پاک خواهد کرد. استفاده از ماژولهای هوشمند و تکمیلی میتواند تا حد زیادی از این مسئله جلوگیری کند.
تزریق بهصورت Blind Attack
حمله SQL Injection به روش کور یا همان Blind Attack را میتوان یکی از پرکاربردترین انواع این حملهها دانست. خصوصا اکنون که ماژولهای هوشمند توانستهاند جای خود را بیشتر پیدا کنند و مانند موراد قبلی به مشکلی بر نخواهند خورد.
در این حالت وقتی روزنهای برای ورود کد پیدا شود، بدون این که نتیجه تخریب و یا کدی که ارسال میشود به هکر نمایش داده شود حمله در ابعاد وسیعی شروع شده و کوئریهای مختلفی به داخل سایت فرستاده میشود. ممکن است خیلی از این کوئریها توسط ماژولهای مختلف مهار شده و اجرا نشوند اما این امکان نیز وجود دارد که این مشکلات وجود داشته باشند که یکی از آنها عمل کرده و پایگاه داده سایت را دچار اختلال کند.
خیلی از ابزارهایی که برای حمله SQL Injection استفاده میشوند، از این نوع از حمله استفاده میکنند. خودکارسازی این نوع از حملات و سرعت آنها این موضوع که استفاده از آنها بیشتر از سایر نوع حملات میباشد را نیز بیشتر میکند.
تغییر مقادیر شرطی
یکی دیگر از موراد پرکاربرد حمله SQL Injection تغییر شرطهای بررسی شده است که به پایگاه داده ارسال میشود. اگر به URLهایی که کوئریهای خود را دارند دقت کرده باشید موارد مختلفی را اجرا میکنند که میتواند شامل کدهایی مانند ID ،NAME و موارد مختلف باشد که به فایل PHP خاصی ارسال شده و مورد پردازش قرار میگیرد. امتحان مقادیر مختلف در این URLها میتواند منجر به دریافت نتیجههای مختلف برای این عمل باشد.
اکنون که دیدیم انواع روشهای حمله SQL Injection چه هستند و چگونه این حملات اتفاق میافتد وقت آن رسیده است تا ببینیم که چگونه میتوان از آنها جلوگیری کرد و برای اینکه از این نوع از حملات در امان بمانیم باید چه کار کنیم.
روش جلوگیری از حملهی SQL Injection چیست؟
در مورد اینکه حمله SQL Injection را چگونه باید خنثی کنیم باید بگوییم که میتوان روشهای این کار را به دو صورت تعیین نمود. در اولین اقدام باید مطمئن باشید که سایت شما آنقدر امن میباشد که صرفا کوئریهای صحیح را به پایگاه داده ارسال کند و بتواند در مقابل موارد ناخواسته مقاومت کند. به طور کلی به اینصورت میباشد که درز و سوراخی برای تزریق روی آن وجود نداشته باشد. در مورد دوم نیز پایگاه داده شما باید کمی هوشمند باشد و بتواند تشخیص دهد که چه دستوری را نباید اجرا کند و این هم باز بستگی به تنظیمات و طراحیای است که شما روی آن انجام میدهید.
به طور کلی میتوان روشهای جلوگیری از حمله SQL Injection را به این صورت معرفی کرد:
نصب پچها و آپدیتهای امنیتی
وقتی که برای شما پیامی مبنی بر اینکه افزونههای شما و یا سیستم مدیریت محتوای شما نیاز به آپدیت دارد به دست شما میرسد بهتر است تعلل نکنید. زیرا خیلی از باگها که به صورت ناگهانی پیدا میشوند روی خیلی از سایتها وجود داشته و این حملات جدید در ابعاد وسیعی اتفاق میافتد که دردسر ساز خواهد بود. در صورتی که پچها و آپدیتها را به موقع نصب کنید میتوانید امنیت سایت خود را هم در مقابل حملهی SQL Injection و هم هر حملهی دیگری بالا ببرید.
کنترل ورودیها
مورد کاربردی دیگری که باید به سراغ آن بروید این است که ورودیهای خود را کنترل کنید و مطمئن باشید امکان ارسال کوئریهای از پیش تعییننشده و دور از انتظار در آنها وجود ندارد. در صورتی که از سایتهای شخصیسازی شده و یک CMS اختصاصی استفاده میکنید باید توجه داشته باشید که این کار را حتما در اولویت قرار دهید. اگر این سوال برای شما وجود دارد که چگونه باید این مورد رفع شود باید بگوییم که در اینجا خلاقیت برنامهنویس در میان است و برنامهنویس شما باید از روشهایی که بلد است استفاده کند و یا روش های جدیدی را یاد بگیرد.
عموما با کمی بازی با کدها میتوان از این مشکلات جلوگیری کرد و کار زیاد سختی در پیش نخواهد بود. اما در نظر داشته باشید همین کار ساده بسیار حیاتی و مهم است.
ایجاد سطوح دسترسی روی پایگاه داده
یکی از اصلیترین کارهایی که باید انجام شود این است که با استفاده از پرمیشنها و سطوح دسترسی پایگاه داده خود را محدود کنید. در این حالت تنها کسانی که دسترسیهای بالا داشته باشند میتوانند عملیاتهای مهم مانند مشاهده جداول خاص و یا حذف یک جدول از روی پایگاه داده را انجام دهند. و تقریبا میتوان گفت اگر حملهی SQL Injection انجام شود و کوئریهای مخرب به پایگاه دادهها هم برسد مجوز انجام اعمالی که میخواهد صادر نمیشود.
باید توجه داشته باشید که تایید اکانتها و احراز هویت در این پایگاه دادهها باید به شدت قوی باشد وگرنه این کار میتواند بیفایده باشد.
تنظیم امکانات پایگاه داده برای برخورد
یکی دیگر از مواردی که باید در نظر داشته باشید برخوردهای پایگاه داده با کوئریهای نامشخص میباشد که میتواند بسیار کمککننده باشد. گاهی اوقات پایگاه دادههای شما میتوانند در صورت مشاهده کوئریهای عجیبوغریب که از مکانهای نامشخص رسیدهاند واکنشهایی را نشان دهند. به این صورت که علاوه بر اجرا نشدن آن، کاربر موردنظر میتواند به عنوان یک کاربر مشکوک و مخرب بن شده و دسترسی آن به سایت قطع شود. بهکارگیری این مکانیزمها میتواند بسیار کمککننده باشد.
دقت کردن به ارورها
یکی دیگر از موارد که میتواند به شما بگوید که یک حملهی SQL Injection روی سایت شما در حال اجراست و باید فکری به حال آن بکنید، ارورهایی است که پایگاه داده به شما باز میگرداند. در موراد زیادی پایگاه داده متوجه دستورات بیمعنیای که به آن میرسد شده و خطاهایی را مبنی بر اطلاعات و دستورات ناقص باز میگرداند. اگر به این خطاها بیتوجه باشید ممکن است حملهی SQL Injection بالاخره به ثمر برسد و پایگاه داده شما را منهدم کند!
اما اگر به پیغامها و ارورهایی که پایگاه داده به شما میدهد توجه کنید میتوانید قبل از اینکه این اتفاق بیفتد آن را شناسایی کرده و دسترسی حملهکننده یا حملهکنندگان را مسدود کنید.
به طور کلی در مورد روشهای جلوگیری از حمله SQL Injection میتوانیم بگوییم که این نوعی از حمله است که بر پایه خلاقیت و پیدا کردن نقاط ضعف انجام میشود و برای اینکه بتوانید آنها را برطرف کنید باید شما هم خلاق باشید و از سیستمهایی استفاده کنید که به هیچ عنوان راه ورود و تزریقی باقی نمیگذارد.
تشخیص آسیبپذیری در برابر حملهی SQL Injection
یکی از مهمترین مواردی که مدیران سایتها و طراحان باید به آن توجه ویژهای داشته باشند این است که آیا اکنون سایت آنها از حمله SQL Injection به دور است و در برابر این نوع از حمله مقام است یا راههایی وجود دارد که میتوان با استفاده از این روش به سایت آنها حمله کرد. در این بخش از مقاله میخواهیم راههایی را برای تشخیص آسیبپذیری در برابر حملهی SQL Injection معرفی کنیم که شما با استفاده از آنها میتوانید از سلامت سایت خود مطمئن شوید.
برای تشخیص حملهی SQL Injection مانند هر نقطه ضعف دیگری در سیستمهای رایانهای ابزارها و اسکنرهای مخصوصی وجود دارد که میتواند این کار را برای شما انجام دهد. یکی از معروفترین و موثرترین ابزارهایی که میتواند برای اسکن سایت شما در برابر حملهی SQL Injection مورد استفاده قرار گیرد، OWASP ZAP نام دارد. این ابزار یکی از ابزارهای حرفهای برای بررسی دقیق سایت شما است که توسط انجام OWASP ارائه شده است. این انجمن در سال 2001 به عنوان یک مجتمع امنیتی از طرف مهندسین کامپیوتر با تخصص امنیت تاسیس شد و هدف آن ارائه راهکارها و ابزارهایی برای بالاتر بردن سطح امنیت سایت بود.
OWASP ابزارهای زیادی را در زمینههای مختلفی مانند حملهی SQL Injection، مشکلات احراز هویت، حملات دیکشنری و مواردی از این دست ارائه میکند. تمامی ابزارهای ارائه شده در این انجمن اوپنسورس بوده و با استفاده از آنها میتوانید مطمئن باشید که یک ابزار خوب را برای امنیت سایت خود در اختیار دارید. OWASP ZAP یکی از اسکنرهایی است که این انجمن به طور خاص برای بررسی حملهی SQL Injection ارائه کرده است و شما با بهرهگیری از آن میتوانید سایت خود را بهصورت کامل تحلیل کنید.
کار این ابزار به این صورت خواهد بود که شما آدرس سایت خود را به آن داده و این ابزار تمامی صفحات سایت شما را بهصورت جزبهجز بررسی میکند. در این بررسیها هر جایی که ممکن است هکرها امکان تزریق کد به سایت شما را داشته باشند و به صورت احتمالی بتوان از آنها برای حمله استفاده نمود، برای شما مشخص میشود. معمولا این محلهای شناسایی شده که برای وارد کردن اطلاعاتی مانند کلمات موردنظر برای جستوجو یا اطلاعات لاگین هستند با تزریق کدهای ساده خود OWASP ZAP کنترل میشود تا اطلاعات دقیقتری در اختیار شما قرار گیرد.
ابزار OWASP ZAP را میتوان بهترین ابزار امنیتی برای چک کردن آسیبپذیری سایت در برابر حملهی SQL Injection معرفی کرد، اما باید در نظر داشته باشید ابزارهای دیگری که برای هک سایت استفاده میشود نیز همین قابلیتها را میتوانند به شما بدهند.
نتیجهگیری
در این مقاله در مورد حملهی SQL Injection و چگونگی کارکرد آن صحبت کردیم. معمولا یک حملهی SQL Injection برای کاربردهای مختلف مانند ورودهای غیرمجاز و تخریب مورد استفاده قرار میگیرد و از آنجایی که پایگاه داده را درگیر میکند، میتواند صدمات بسیار بالایی را در کیسهای مختلف به سایت شما وارد کند. بهترین راه برای مقابله با حمله SQL Injection این است که از پیش برای اینکار آماده شوید و قبل از اینکه این حمله روی سایت شما اتفاق بیفتد فکر آن را بکنید. زیرا ماهیت خودکار این حملات زیاد به شما وقت نخواهد داد که کاری انجام دهید و اگر قرار باشد این حمله موفقیتآمیز باشد قبل از اینکه شما اصلا متوجه ارورهای پایگاه داده شوید، آن را برای شما از کار خواهد انداخت.