نقطه آسیبپذیری که حمله SQL Injection از آن استفاده میکند دیتابیس سایت شما است. پس بهتر است قبل از هر اقدامی به بررسی این اصل مهم از برنامههای کامپیوتری و سایتهای اینترنتی بپردازیم و ببینیم که زمینبازی ما کجاست و هکرها برای نفوذ با استفاده از حملهٔ SQL Injection کجا را انتخاب کردهاند و میتوانند با یک حملهٔ موفق چه چیزی به دست بیاورند.
ساختار دیتابیسها
دیتابیسها را میتوان یکی از اصلیترین بخشهای یک برنامه و یا یک سایت معرفی کرد که مسئولیت دادههای شما و اطلاعاتی که برنامه و یا سایت نیاز دارد تا بهصورت پایدار در خود ذخیره کند را بر عهده دارد. اطلاعات پایدار اطلاعاتی هستند که شما انتظار دارید مدت زیادی روی سایت شما باقی بمانند و در موقع نیاز به روشهای ممکن از آنها استفاده شوند. همین مقالهای که اکنون در حال مطالعه آن هستید یکی از اطلاعات پایدار به شمار میآید. در این داده ما یک دادهٔ عمومی را شاهد هستیم که هرکسی میتواند وارد سایت شده و به آن دستیابی داشته باشد.
اما دادههایی نیز وجود دارند که دسترسی به آنها نباید به همین سادگی امکانپذیر باشد. بهعنوانمثال نام کاربری و رمز عبور که شما در سایت ثبتنام کردهاید و یا حتی شماره تماس و ایمیلی که با آن ثبتنام خود را انجام دادهاید. اینگونه موارد که باید مخفی بماند و قرار نیست در اختیار کسی قرار بگیرد، در پایگاههای داده کم نیستند و میتوان گفت که لورفتن اطلاعات دیتابیس یکی از بزرگترین شکستهای امنیتی برای یک سایت تلقی خواهد شد.
دیتابیسها به دو صورت کلی رابطهای و غیررابطهای وجود دارند. در دیتابیس رابطهای شما یک ساختار جدولی را شاهد هستید. به این صورت که دیتابیس از جدولهایی تشکیل شده است که همه اطلاعات در خانههای این جدول ذخیره میشود. ذخیرهسازی به این صورت انجام میگیرد که ستونهای جدول، متغیرها بوده و در هر ردیف یک رکورد از اطلاعات قرار میگیرد. بهعنوانمثال جدولی از دیتابیس که مربوط به کاربران است به این صورت خواهد بود که ستونها اطلاعات مربوط به یوزرنیم، پسورد، ایمیل و اطلاعات اینچنینی بوده و در هر ردیف اطلاعات مربوط به یک کاربر ذخیره میگردد.
در یک سایت جدولهای مختلفی وجود دارد که هرکدام از آنها میتواند حاوی اطلاعاتی عمومی باشد و یا اطلاعات محرمانه را برای ما ذخیرهسازی کند. اما در دیتابیسهای غیررابطهای اوضاع کمی متفاوت است. یک دیتابیس غیررابطهای دادههای خود را بر اساس ساختاری درختی و شبیه به 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
در بخش اول ستونهای ۱ و ۲ معرفی شده و بعد از آن نام جدول موردنظر شما قرار گرفته است که در این نمونه table_name نام دارد و در بخش سوم نیز شرایط قرار خواهند داشت که خود این شرایط و Conditionها میتواند خود روی چند جدول بهصورت همزمان به اجرا در بیاید.
این ساختار بهصورت پیشفرض میتواند کاراییهای سطح بالایی را در عین سادگی داشته باشد که اگر برنامهنویس به این موارد دقت نکند میتواند آسیبپذیریهای مختلفی در سیستم ایجاد شود. بهصورت کلی میتوان این حملهها را ناشی از این ساختار و بیدقتیهای مربوط به آن معرفی کرد:
فیلترهای اشتباه در بخش Where
در این تکنیک میتوان از بخش Condition که در مورد متغیر بودن آن و چند دستوره بودن صحبت کردیم سو استفاده کرد به این صورت که بهجای داده ورودیای که در این بخش چک میشود، یک کوئری وارد میشود و از روشهای مختلفی برای اجراییکردن این کد استفاده میشود. بهعنوانمثال کدی را در نظر بگیرید که به این صورت اجرا خواهد شد که موضوع جستجویی را که از شما دریافت میکند بهعنوان شرط در بخش Where ارسال میکند تا اطلاعاتی که مربوط به داده درخواستی شما میباشد را نمایش دهد.
در این قسمت اگر بیدقتی انجامگرفته باشد ممکن است دراینبین یک کد وارد شود که میتواند تعدادی از جدولهای شما را تخریب کند یا همهٔ آنها را به نمایش بگذارد. بهعنوانمثال برای کاراکتر متنیای که آن را کنترل میکنید. یک کاراکتر ارسال کرده و بعد از آن دستور را با «;» میبندد، دستور بعدی را برای حذف و یا دراپ کامل یک جدول نوشته و شرط منطقی آخر را نیز با یک عبارت همیشه درست کاراکتری تعیین میکند که میتواند تکمیلکننده باقی عبارتی باشد که قرار بوده است واقعاً اجرا شود. به این صورت یک کوئری که قرار بود بهعنوان شرط چک شده در Where انتخاب شود تبدیل به یک کد کاملاً مخرب میشود که کل دیتابیس را به هم میریزد.
ورودیهای کنترل نشده
مورد دیگری که میتواند بسیار خطرناک باشد این است که ورودیها از لحاظ نوعی که دارند کنترل نشده باشند. در این مورد میتوان بهراحتی کدهای مخرب را در یک محل ورود داده وارد کرده و با زدن کلید Enter و ارسال پارامترها با ارسال واژه موردنظر یک کد مخرب را نیز ارسال کرد. بهعنوانمثال ورودی زیر را در نظر بگیرید که میتواند بهعنوان نام کاربری ارسال شود:
;1DROP TABLE users
در این ارسال عدد ۱ بهعنوان نام کاربری معرفی شده و بعد از آن دستور 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 ارائه شده است. این انجمن در سال ۲۰۰۱ بهعنوان یک مجتمع امنیتی از طرف مهندسین کامپیوتر با تخصص امنیت تأسیس شد و هدف آن ارائه راهکارها و ابزارهایی برای بالاتر بردن سطح امنیت سایت بود.
OWASP ابزارهای زیادی را در زمینههای مختلفی مانند حملهٔ SQL Injection، مشکلات احراز هویت، حملات دیکشنری و مواردی از این دست ارائه میکند. تمامی ابزارهای ارائه شده در این انجمن اوپنسورس بوده و با استفاده از آنها میتوانید مطمئن باشید که یک ابزار خوب را برای امنیت سایت خود در اختیار دارید. OWASP ZAP یکی از اسکنرهایی است که این انجمن به طور خاص برای بررسی حملهٔ SQL Injection ارائه کرده است و شما با بهرهگیری از آن میتوانید سایت خود را بهصورت کامل تحلیل کنید.
کار این ابزار به این صورت خواهد بود که شما آدرس سایت خود را به آن داده و این ابزار تمامی صفحات سایت شما را بهصورت جز بهجز بررسی میکند. در این بررسیها هرجایی که ممکن است هکرها امکان تزریق کد به سایت شما را داشته باشند و بهصورت احتمالی بتوان از آنها برای حمله استفاده نمود، برای شما مشخص میشود. معمولاً این محلهای شناسایی شده که برای واردکردن اطلاعاتی مانند کلمات موردنظر برای جستوجو یا اطلاعات لاگین هستند با تزریق کدهای ساده خود OWASP ZAP کنترل میشود تا اطلاعات دقیقتری در اختیار شما قرار گیرد.
ابزار OWASP ZAP را میتوان بهترین ابزار امنیتی برای چککردن آسیبپذیری سایت در برابر حملهٔ SQL Injection معرفی کرد، اما باید در نظر داشته باشید ابزارهای دیگری که برای هک سایت استفاده میشود نیز همین قابلیتها را میتوانند به شما بدهند.
نتیجهگیری
در این مقاله در مورد حملهٔ SQL Injection و چگونگی کارکرد آن صحبت کردیم. معمولاً یک حملهٔ SQL Injection برای کاربردهای مختلف مانند ورودهای غیرمجاز و تخریب مورداستفاده قرار میگیرد و ازآنجاییکه دیتابیس را درگیر میکند، میتواند صدمات بسیار بالایی را در کیسهای مختلف به سایت شما وارد کند. بهترین راه برای مقابله با حمله SQL Injection این است که از پیش برای این کار آماده شوید و قبل از اینکه این حمله روی سایت شما اتفاق بیفتد فکر آن را بکنید. زیرا ماهیت خودکار این حملات زیاد به شما وقت نخواهد داد که کاری انجام دهید و اگر قرار باشد این حمله موفقیتآمیز باشد قبل از اینکه شما اصلاً متوجه ارورهای دیتابیس شوید، آن را برای شما از کار خواهد انداخت