حملات SQL INJECTION

27 فروردین 1404 25 بازدید
حملات SQL INJECTION

حمله SQL Injection یکی از مهمترین و کاربردی‌ترین روش‌هایی است که یک هکر می‌تواند از آن برای نفوذ به سایت شما استفاده کند و در این مقاله قصد داریم به بررسی جزئیات این حمله و روش‌های جلوگیری و مهار آن بپردازیم.

نقطه آسیب‌پذیری که حمله SQL Injection از آن استفاده می‌کند پایگاه داده‌ی سایت شما است. پس بهتر است قبل از هر اقدامی به بررسی این اصل مهم از برنامه‌های کامپیوتری و سایت‌های اینترنتی بپردازیم و ببینیم که زمین بازی ما کجاست و هکرها برای نفوذ با استفاده از حمله‌ی SQL Injection کجا را انتخاب کرده‌اند و می‌توانند با یک حمله‌ی موفق چه چیزی بدست بیاورند.

آشنایی با ساختار پایگاه داده‌ها

پایگاه داده‌ها یا Database را می‌توان یکی از اصلی‌ترین بخش‌های یک برنامه و یا یک سایت معرفی کرد که مسئولیت داده‌های شما و اطلاعاتی که برنامه و یا سایت نیاز دارد تا به صورت پایدار در خود ذخیره کند را بر عهده دارد. اطلاعات پایدار اطلاعاتی هستند که شما انتظار دارید مدت زیادی روی سایت شما باقی بمانند و در موقع نیاز به روش‌های ممکن از آنها استفاده شوند. همین مقاله‌ای که اکنون در حال مطالعه آن هستید یکی از اطلاعات پایدار به‌شمار می‌آید. در این داده ما یک داده‌ی عمومی را شاهد هستیم که هر کسی می‌تواند وارد سایت شده و به آن دستیابی داشته باشد.

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

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

در یک سایت جدول‌های مختلفی وجود دارد که هر کدام از آنها می‌تواند حاوی اطلاعاتی عمومی باشد و یا اطلاعات محرمانه را برای ما ذخیره‌سازی کند. اما در پایگاه داده‌های غیررابطه‌ای اوضاع کمی متفاوت است. یک پایگاه داده غیررابطه‌ای داده‌های خود را بر اساس ساختاری درختی و شبیه به XML ذخیره‌سازی می‌کند که به صورت سطری بوده و در هر سطر یکی از عناصر پایگاه داده و مقداری که دارد قرار خواهد گرفت. به‌عنوان مثال می‌توان برای پایگاه داده رابطه‌ای، پایگاه داده MariaDB و برای غیررابطه‌ای، پایگاه داده MongoDB را معرفی نمود.

برای برقراری ارتباط با پایگاه داده باید از زبان‌های مخصوص به پایگاه داده‌ها استفاده کنید که برای پایگاه داده‌های رابطه‌ای از زبان پرس‌وجوی رابطه‌ای که به اختصار 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 را پاک خواهد کرد. استفاده از ماژول‌های هوشمند و تکمیلی می‌تواند تا حد زیادی از این مسئله جلوگیری کند.

روش جلوگیری از حمله‌ SQL Injection چیست؟

در مورد اینکه حمله SQL Injection را چگونه باید خنثی کنیم باید بگوییم که می‌توان روش‌های این کار را به دو صورت تعیین نمود. در اولین اقدام باید مطمئن باشید که سایت شما آن‌قدر امن می‌باشد که صرفا کوئری‌های صحیح را به پایگاه داده ارسال کند و بتواند در مقابل موارد ناخواسته مقاومت کند. به طور کلی به این‌صورت ‌می‌باشد که درز و سوراخی برای تزریق روی آن وجود نداشته باشد. در مورد دوم نیز پایگاه داده شما باید کمی هوشمند باشد و بتواند تشخیص دهد که چه دستوری را نباید اجرا کند و این هم باز بستگی به تنظیمات و طراحی‌ای است که شما روی آن انجام می‌دهید.

به طور کلی می‌توان روش‌های جلوگیری از حمله SQL Injection را به این صورت معرفی کرد:

نصب پچ‌ها و آپدیت‌های امنیتی

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

کنترل ورودی‌ها

مورد کاربردی دیگری که باید به سراغ آن بروید این است که ورودی‌های خود را کنترل کنید و مطمئن باشید امکان ارسال کوئری‌های از پیش تعیین‌نشده و دور از انتظار در آنها وجود ندارد. در صورتی که از سایت‌های شخصی‌سازی شده و یک CMS اختصاصی استفاده می‌کنید باید توجه داشته باشید که این کار را حتما در اولویت قرار دهید. اگر این سوال برای شما وجود دارد که چگونه باید این مورد رفع شود باید بگوییم که در اینجا خلاقیت برنامه‌نویس در میان است و برنامه‌نویس شما باید از روش‌هایی که بلد است استفاده کند و یا روش های جدیدی را یاد بگیرد.

عموما با کمی بازی با کدها می‌توان از این مشکلات جلوگیری کرد و کار زیاد سختی در پیش نخواهد بود. اما در نظر داشته باشید همین کار ساده بسیار حیاتی و مهم است.

ایجاد سطوح دسترسی روی پایگاه داده

یکی از اصلی‌ترین کارهایی که باید انجام شود این است که با استفاده از پرمیشن‌ها و سطوح دسترسی پایگاه داده خود را محدود کنید. در این حالت تنها کسانی که دسترسی‌های بالا داشته باشند می‌توانند عملیات‌های مهم مانند مشاهده جداول خاص و یا حذف یک جدول از روی پایگاه داده را انجام دهند. و تقریبا می‌توان گفت اگر حمله‌ی SQL Injection انجام شود و کوئری‌های مخرب به پایگاه داده‌ها هم برسد مجوز انجام اعمالی که می‌خواهد صادر نمی‌شود.

باید توجه داشته باشید که تایید اکانت‌ها و احراز هویت در این پایگاه داده‌ها باید به شدت قوی باشد وگرنه این کار می‌تواند بی‌فایده باشد.

تنظیم امکانات پایگاه داده برای برخورد

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

دقت کردن به ارورها

یکی دیگر از موارد که می‌تواند به شما بگوید که یک حمله‌ی SQL Injection روی سایت شما در حال اجراست و باید فکری به حال آن بکنید، ارورهایی است که پایگاه داده به شما باز می‌گرداند. در موراد زیادی پایگاه داده متوجه دستورات بی‌معنی‌ای که به آن می‌رسد شده و خطاهایی را مبنی بر اطلاعات و دستورات ناقص باز می‌گرداند. اگر به این خطاها بی‌توجه باشید ممکن است حمله‌ی SQL Injection بالاخره به ثمر برسد و پایگاه داده شما را منهدم کند!

اما اگر به پیغام‌ها و ارورهایی که پایگاه داده به شما می‌دهد توجه کنید می‌توانید قبل از اینکه این اتفاق بیفتد آن را شناسایی کرده و دسترسی حمله‌کننده یا حمله‌کنندگان را مسدود کنید. به طور کلی در مورد روش‌های جلوگیری از حمله SQL Injection می‌توانیم بگوییم که این نوعی از حمله است که بر پایه خلاقیت و پیدا کردن نقاط ضعف انجام می‌شود و برای اینکه بتوانید آنها را برطرف کنید باید شما هم خلاق باشید و از سیستم‌هایی استفاده کنید که به هیچ عنوان راه ورود و تزریقی باقی نمی‌گذارد.

میلاد فداکار

میلاد فداکار

کارشناس امنیت اطلاعات