حمله تزریق SQL یا SQL Injection چیست و چگونه انجام می شود؟
تزریق SQL یا به اصطلاح SQL Injection که همچنین با عنوان SQLI نیز شناخته میشود، یکی از رایج ترین حملات به پایگاه داده است که از کد SQL مخرب جهت دستکاری پایگاه داده پشتیبان برای دسترسی به اطلاعاتی استفاده میکند که قرار نبود نمایش داده شوند. این اطلاعات ممکن است شامل هر تعداد مورد، از جمله داده های حساس شرکت، لیست کاربران یا جزئیات مشتری خصوصی باشد. تاثیری که تزریق SQL می تواند بر یک کسب و کار داشته باشد بسیار گسترده است. ما در این مقاله قصد داریم بیشتر به بررسی آن بپردازیم:
کوئری های SQL چیست؟
SQL یک زبان استاندارد است که برای دسترسی و تغییر پایگاه های اطلاعاتی و ایجاد ساختار داده قابل تنظیم برای هر کاربر استفاده میشود. پرس و جو یا کوئری های SQL برای اجرای دستوراتی مانند بازیابی داده ها، به روز رسانی ها و حذف رکوردها استفاده می شوند. عناصر مختلف SQL این وظایف را اجرا می کنند، به عنوان مثال، کوئری هایی که از دستور SELECT تشکیل شده اند، برای بازیابی داده ها، بر اساس پارامترهای ارائه شده توسط کاربر اجرا می شوند. یک کوئری پایگاه داده SQL معمولی ممکن است به شکل زیر باشد:
SELECT ItemName, ItemDescription
FROM Item
WHERE ItemNumber = ItemNumber
از این طریق، برنامه وب یک کوئری رشته ای را ایجاد می کند که به عنوان یک دستور SQL به پایگاه داده ارسال می شود.
sql_query= "
SELECT ItemName, ItemDescription
FROM Item
WHERE ItemNumber = " & Request.QueryString("ItemID")
سپس یک ورودی ارائه شده توسط کاربر، می تواند کوئری SQL زیر را ایجاد کند:
SELECT Itemname, ItemDescription
FROM Item
WHERE ItemNumber = 999
این کوئری نام و توضیحات مورد شماره 999 را ارائه می دهد. در واقع زبان اس کیو ال این امکان را به ما می دهد تا در یک زمان کوتاه، در تمام پایگاه داده جستجو کنیم و اطلاعاتی که می خواهیم را ایجاد، بازخوانی، حذف یا تغییر دهیم.
SQL Injection چیست؟
تزریق SQL تکنیکی است که مهاجمان برای دسترسی غیر مجاز به پایگاه داده برنامه وب، با افزودن رشته ای از کدهای مخرب به کوئری پایگاه داده استفاده می کنند. یک حمله موفقیت آمیز ممکن است منجر به مشاهده غیر مجاز لیست کاربران، حذف کل جداول و در موارد خاص، به دست آوردن دسترسی مدیریتی برای یک پایگاه داده توسط مهاجم شود که همه این موارد برای یک تجارت بسیار مضر است.
حملات تزریق SQL را می توان برای هدف قرار دادن هر برنامه ای که از پایگاه داده SQL استفاده می کند، استفاده کرد. رایج ترین طعمه ها وب سایت ها و سرورها هستند. پایگاه داده های رایج SQL شامل دیتابیس MySQL و Oracle و یا SQL Server است.
تزریق SQL به عنوان یکی از رایج ترین سوء استفاده های امنیتی در نظر گرفته می شود. به همین علت است که این نوع حملات در لیست 10 تهدید برتر OWASP درباره امنیت برنامه های کاربردی وب قرار دارد.
امروزه با در دسترس بودن ابزارهای خودکار برای اجرای حمله تزریق SQL خطر سوء استفاده های ناشی از حمله SQLi و آسیبی که می تواند ایجاد کند، بسیار افزایش یافته است و حتی کسانی که آشنایی چندانی نیز با مباحث امنیت و هک ندارند نیز، می توانند با این ابزارها یک حمله تمام عیار را به پایگاه داده، انجام دهند! در گذشته، احتمال اینکه یک شرکت با تزریق SQL مورد هدف قرار گیرد تا حدودی محدود بود زیرا مهاجمان مجبور بودند این اکسپلویت ها را به صورت دستی اجرا کنند.
SQL Injection چگونه کار می کند؟
کوئری های SQL درخواستی برای انجام برخی اقدامات در پایگاه داده برنامه است. همچنین می توان از کوئری ها برای اجرای دستورات سیستم عامل استفاده کرد. هر پرس و جو شامل مجموعه ای از پارامترها است که اطمینان حاصل می کند که تنها زمانی که کاربر کوئری را اجرا می کند، رکوردهای مورد نظر بازگردانده می شود. در طول تزریق SQL، مهاجمان با تزریق کد مخرب به فرم ورودی کوئری، از این موضوع سوء استفاده می کنند.
اولین مرحله SQL Injection، مطالعه نحوه عملکرد پایگاه داده هدفمند است. این کار با ارسال انواع مقادیر تصادفی به عنوان کوئری انجام می شود تا نحوه پاسخ سرور را مشاهده کنید. سپس مهاجمان از آنچه در مورد پایگاه داده یاد گرفته اند استفاده می کنند تا یک کوئری مخرب را ایجاد کنند تا سرور آن را پردازش کند و سپس به عنوان یک دستور SQL اجرا نماید.
به عنوان مثال، یک پایگاه داده ممکن است اطلاعات مشتریانی را که خریدی را با شماره شناسه مشتری منحصر بفرد خود انجام داده اند، ذخیره کند. مهاجم ممکن است به جای جستجوی شناسه یک مشتری خاص، “CustomerID = 1000 OR 1=1” را در قسمت ورودی وارد کند. از آنجایی که عبارت 1=1 همیشه درست است، پرس و جوی SQL همه شناسه های مشتری موجود و هر داده مربوطه را بر می گرداند! این به مهاجم اجازه می دهد تا احراز هویت را دور بزند و دسترسی در سطح مدیریت را به دست آورد. علاوه بر بازگرداندن اطلاعات غیر مجاز، حملات SQL را می توان برای حذف کل پایگاه داده، دور زدن احراز هویت، حذف سوابق یا افزودن داده ها استفاده کرد.
این اکسپلویت یکی از ساده ترین روش های تزریق اس کیو ال محسوب می شود و امروزه بسیاری از سرورها، به صورت پیشفرض، جلوی اجرای دستورات اینچنینی رو می گیرند. با این حال، باز هم ممکن است با کدهای پیچیده تر، این فرایند را دور زد و به پایگاه داده، نفوذ کرد.
انواع حملات اس کیو ال اینجکشن
SQLi درون باند (In-band)
همچنین به عنوان SQLi کلاسیک شناخته می شود، SQLi درون باند زمانی است که هکرها از همان کانال (یا باند) برای راه اندازی خطاهای پایگاه داده و جمع آوری نتایج یک حمله استفاده می کنند. یک SQLi درون باند معمولاً از طریق دو روش به دست میآید: حملات مبتنی بر خطا و حملات مبتنی بر اتحاد.
تکنیک های تزریق مبتنی بر خطا، پایگاه داده را مجبور می کند تا پیام های خطایی تولید کند که اطلاعاتی در مورد ساختار پایگاه داده را نشان می دهد.
حملات مبتنی بر اتحاد از عبارات آماده شده استفاده می کنند که از تابع SQL Union سوء استفاده کرده و نتایج چند کوئری را در یک نتیجه ترکیب می کند.
SQLi استنباطی (Inferential SQLi)
همچنین به عنوان تزریق SQL کور نیز شناخته می شود، یک SQLi استنتاجی زمانی است که هکرها محموله های داده را به سرور پایگاه داده ارسال می کنند تا پاسخ و رفتار آن را مشاهده کنند بدون اینکه قادر به دیدن آنچه در پایگاه داده واقعاً رخ می دهد. پاسخ سرور سرنخ هایی را در اختیار مهاجم قرار می دهد که می توانند از آنها برای تنظیم استراتژی حمله خود استفاده کنند.
یک SQLi استنتاجی می تواند بولین یا مبتنی بر زمان باشد. یک SQLi Boolean از عبارات درست یا نادرست برای درخواست پاسخ استفاده می کند، در حالی که SQLi مبتنی بر زمان یک دوره پاسخ مشخص را تعیین می کند.
SQLi خارج از باند (Out-of-band)
SQLi خارج از باند زمانی است که هکرها از سیستم نام دامنه یا درخواست های HTTP برای بازیابی داده ها استفاده می کنند. SQLi خارج از باند معمولاً فقط زمانی انجام می شود که یک وب سرور خیلی کند باشد یا زمانی که SQLi درون باند امکان اجرا نداشته باشد.
پیشگیری و کاهش حملات SQL Injection
چندین راه موثر برای جلوگیری از وقوع حمله SQL Injection و افزایش امنیت سرور وجود دارد. اولین مرحله اعتبار سنجی ورودی است (معروف به پاکسازی)، که شامل نوشتن کدی است که می تواند ورودی های نامعتبری که کاربر وارد می کند را شناسایی کند. اگر چه با وجود این روش نیز حملات شکل می گیرند. به همین دلیل، یک فایروال وب (WAF) معمولاً برای فیلتر کردن SQLI و همچنین سایر تهدیدات آنلاین استفاده می شود. برای انجام این کار، WAF معمولاً به لیستی بزرگ و دائماً به روز شده از امضاهایی که با دقت ساخته شده است، متکی است که به آن اجازه می دهد تا درخواست های SQL مخرب را با جراحی حذف کند. معمولاً، چنین فهرستی دارای امضاهایی برای رسیدگی به بردارهای حمله خاص است و به طور منظم برای معرفی قوانین مسدودسازی برای آسیبپذیریهای تازه کشف شده وصله میشود.
فایروال های وب می توانند با راه حل های امنیتی دیگر ادغام می شوند. یک WAF می تواند اطلاعات اضافی را دریافت کند که قابلیت های امنیتی آن را بیشتر می کند. به عنوان مثال، یک فایروال وب که با ورودی مشکوک، اما نه آشکار مخرب روبرو می شود، ممکن است قبل از تصمیم به مسدود کردن درخواست، آن را با داده های IP تأیید کند. فقط در صورتی ورودی را مسدود می کند که خود IP سابقه بدی داشته باشد.
WAF مبتنی بر ابر Imperva از تشخیص امضا، شهرت IP و سایر روشهای امنیتی برای شناسایی و مسدود کردن تزریقهای SQL با حداقل مقدار مثبت کاذب استفاده میکند. قابلیتهای WAF توسط IncapRules افزایش مییابد – یک موتور قوانین امنیتی سفارشی که سفارشیسازی دقیق تنظیمات امنیتی پیشفرض و ایجاد سیاستهای امنیتی مورد خاص را امکانپذیر میسازد.