تعریف حمله SQL Injection
حملات تزریق به پایگاهداده (SQL Injection) از قدیمیترین حملات است که در آن از آسیبپذیریهای برنامههای تحت وب سوءاستفاده میشود. حمله SQL Injection از اواخر دهه 1990 مورد شناسایی قرار گرفته اما امروزه همچنان در حملات سایبری از سوی مهاجمان در حال استفاده بوده و متداول است.
در ادامه توضیح میدهیم که حملات تزریق اس کیوال چه نوع حملاتی میباشند، چگونه کار میکنند و چگونه میتوانید از وقوع آنها جلوگیری نمائید.
حمله تزریق اسکیوال
به طور خلاصه می توان گفت تزریق SQL عبارت است از قرار دادن کدهای مخرب در دستورات SQL، از طریق ورودی صفحه وب.
حمله SQL Injection یا به فارسی حمله تزریق SQL که گاهی اوقات به اختصار SQLi نیز نامیده میشود، نوعی آسیبپذیری است که در آن مهاجم از یک Structured Query Language – به اختصار SQL – برای دستکاری پایگاهداده، تزریق کد مخرب و در نتیجه دسترسی به اطلاعات بالقوه ارزشمند آن استفاده میکند. این اطلاعات ممکن است شامل اطلاعات حساس سازمان، فهرست کاربران یا جزئیات مشتریان باشد. SQLi یکی از رایجترین و مخربترین انواع حملات است زیرا میتواند به طور بالقوه علیه هر برنامه تحت وب یا وبسایتی که از پایگاه داده مبتنی بر SQL استفاده میکند، بکار گرفته شود.
مثالی از یک حمله SQL Injection
فرض کنید یک وب سایت دارید که از پایگاه داده MySQL برای ذخیره اطلاعات استفاده می کند. حمله SQL Injection می تواند به وسیله ورود یک عبارت مخرب به فیلد ورودی یا پارامتر URL صورت گیرد. به عنوان مثال، فرض کنید کاربران وب سایت شما می توانند نام و نشانی را برای جستجوی کاربر ارائه دهند.
حمله SQL Injection می تواند به شکل زیر صورت گیرد:
SELECT * FROM users WHERE name = 'input_name' AND address = 'input_address';
اگر یک حمله کننده بتواند ورودی های کاربر را تغییر دهد و یک کد مخرب به جای input_name و input_address قرار دهد، می تواند پایگاه داده را دستکاری کرده و اطلاعات حساس را به سرقت ببرد.
به عنوان مثال، اگر حمله کننده ورودی های زیر را به جای input_name و input_address قرار دهد:
name = 'admin'; DROP TABLE users; -- '
address = '123 Main St'
استعلام نهایی به شکل زیر خواهد بود:
SELECT * FROM users WHERE name = 'admin'; DROP TABLE users; -- ' AND address = '123 Main St';
در اینجا، عبارت `– ‘` که علامتی است که در SQL از آن به عنوان کامنت استفاده می شود، برای پایان دادن به عبارت SELECT اولیه و جلوگیری از خطاهای ناشی از دستور DROP TABLE، استفاده می شود.
این حمله باعث حذف کل جدول users در پایگاه داده می شود که می تواند منجر به از بین رفتن اطلاعات وب سایت شود.
حملات SQL Injection چگونه کار میکنند؟
برای درک حمله تزریق اسکیوال، ابتدا باید بدانیم که SQL چیست. SQL یک زبان پرسوجو (Query Language) است که در برنامهنویسی جهت دسترسی، اصلاح و حذف دادههای ذخیره شده در پایگاهدادههای رابطهای (Relational Database) مورد استفاده قرار میگیرد. از آنجایی که اکثر سایتها و برنامههای کاربردی تحت وب به پایگاهدادههای SQL متکی هستند، حمله SQL Injection میتواند عواقب جدی برای سازمانها به همراه داشته باشد.
SQL Query فرامینی است که دادههای مورد نظر را از بانک داده استخراج میکند. یک نمونه از آن زمانی است که اطلاعات اصالتسنجی ورود به سیستم از طریق یک فرم تحت وب ارسال میشود تا به کاربر اجازه دسترسی به یک سایت را بدهد. به طور معمول، این نوع فرم تحت وب برای پذیرش انواع خاصی از دادهها مانند نام و/یا رمز عبور طراحی شده است. هنگامی که نام کاربری و رمز عبور ثبت میشود، در پایگاه داده مورد بررسی قرار میگیرد و در صورت تطابق داشتن، به کاربر اجازه ورود داده میشود. در غیر این صورت، از دسترسی به آنها ممانعت به عمل میآید.
SQLi احتمالاً به این دلیل به وجود میآیند که اکثر فرمهای تحت وب دارای قابلیت پیشگیری از ورود فرامین مخرب به این فرمها نمیباشند. مهاجمان نیز از این ضعف سوءاستفاده کرده و با وارد نمودن فرامین غیرمجاز در فرمها، درخواستهای خود را به پایگاه داده ارسال میکنند.
این ضعف امنیتی به طور بالقوه میتواند مهاجمان را قادر سازد تا طیف وسیعی از فعالیتهای مخرب را انجام دهند. حملات SQL Injection به مهاجمان اجازه میدهد هویت افراد را جعل نموده، دادههای موجود در پایگاهداده را تغییر دهند، دادههای موجود در سیستمها را سرقت و افشا کنند – از سرقت دادههای حساس گرفته تا دستکاری اطلاعات موجود در پایگاهداده برای اهداف خود -، دادهها را از بین ببرند یا آنها را غیرقابل دسترس نمایند و حتی مهاجمان قادر خواهند بود همانند ادمین، راهبری سرور پایگاه داده را در اختیار بگیرند. حملات SQL Injection میتوانند باعث آسیب جدی به کسبوکارها شده و در صورت نشت اطلاعات محرمانه کاربران، منجر به از دست دادن اعتماد مشتریان و از بین رفتن شهرت کسبوکار شوند.
به دلیل گسترش بکارگیری وبسایتها و سرورهایی که از پایگاه داده SQL استفاده میکنند، آسیبپذیریهای SQL Injection یکی از قدیمیترین و گستردهترین انواع حملات سایبری میباشند. از طرفی پیشرفت در حملات هکری، خطر حمله SQL Injection را افزایش داده که مهمترین آنها ظهور ابزارهایی برای شناسایی و بهرهجویی از آسیبپذیریهای SQL Injection است. این ابزارها که به صورت رایگان توسط توسعهدهندگان کد باز (Open source developer) در دسترس هستند، به مجرمان سایبری اجازه میدهند تا به طور خودکار حملات را تنها در چند دقیقه انجام داده و تنها با یک کلیک و صرفاً در یک حمله، به هر جدول یا هر یک از ستونهای پایگاهداده دسترسی پیدا کنند.
علائم SQLi
یک حمله تزریق اسکیوال موفقیتآمیز ممکن است هیچ علامتی نداشته باشد. با این حال، گاهی اوقات دارای نشانههای زیر است:
- دریافت تعداد زیادی درخواست (Request) در یک بازه زمانی کوتاه. برای مثال، ممکن است ایمیلهای بیشماری را از فرم تماس صفحه وب خود دریافت کنید.
- هدایت تبلیغات به وب سایتهای مشکوک.
- پنجرههای Popup عجیب و غریب و پیامهای خطای متعدد.
انواع حمله تزریق اسکیوال
بسته به نحوه دسترسی آنها به دادههای Back-end و میزان آسیب احتمالی که ایجاد میکنند، حملات SQL Injection به سه دسته تقسیم میشوند:
In-band SQLi
اجرای این نوع حمله SQLi برای مهاجمان بسیار ساده است زیرا در آنها از کانال ارتباطی مشابه و یکسانی برای راهاندازی حملات و جمعآوری نتایج استفاده میشود. حمله In-band SQLi دارای دو متغیر فرعی زیر میباشد:
- SQLi مبتنی بر خطا (Error-based SQLi): پایگاهداده به دلیل اقدامات مهاجم پیام خطا تولید میکند. مهاجم اطلاعات مربوط به زیرساخت پایگاهداده را بر اساس دادههای تولید شده توسط این پیامهای خطا، جمع آوری مینماید.
- SQLi مبتنی بر اجتماع (Union-basedSQLi): مهاجم با بکارگیری عملگر UNION SQL و ترکیب چند دستور انتخابی در یک پاسخ HTTP در تلاش برای دستیابی به دادههای مورد نظر خود میباشد.
SQLi استنتاجی (SQLi کور)
مهاجمان در این نوع از حملات SQLi، دادههای مخرب (Payload) را به سرور ارسال میکنند تا با مشاهده پاسخ و الگوهای رفتاری سرور پس از ارسال Payload، اطلاعات بیشتری در مورد ساختار آن کسب کنند. در حملات SQLi استنتاجی، دادهها از پایگاه داده وبسایت به مهاجم منتقل نمیشوند، بنابراین مهاجم قادر به مشاهده اطلاعات مربوط به حمله In-band SQLi نیست از این رو به اصطلاح «SQLi کور» نیز نامیده میشود.
SQLi استنتاجی را میتوان به دو زیر گروه طبقهبندی کرد:
- SQLi مبتنی بر زمان (Time-based SQLi): مهاجمان یک Query به پایگاهداده SQL ارسال میکنند و پایگاهداده را برای چند ثانیه در حالت انتظار نگه میدارند و بر اساس مدت زمان پاسخ پایگاهداده، درست یا نادرست بودن Query را نتیجه میگیرند.
- Boolean SQLi: مهاجمان یک Query را به پایگاهداده SQL ارسال نموده و منتظر میمانند تا برنامه، نتیجه درست یا نادرست را برگرداند.
Out-of-band SQLi
این نوع حمله SQL تحت دو سناریو صورت میگیرد:
- زمانی که مهاجمان نمیتوانند از کانال یکسان برای اجرای حمله و همچنین جمعآوری اطلاعات استفاده کنند.
- زمانی که سرور برای انجام این اقدامات بسیار کند یا ناپایدار است.
تاثیر حملات SQL Injection
یک حمله موفقیتآمیز SQL Injection میتواند عواقب جدی برای یک کسبوکار به همراه داشته باشد به این دلیل که میتواند منجر به رویدادهای زیر شود:
- افشای دادههای حساس و حیاتی: مهاجمان میتوانند دادهها را بازیابی نموده که این خود خطر افشای دادههای حساس ذخیره شده در سرور SQL را به همراه دارد.
- از بین رفتن یکپارچگی دادهها: مهاجمان میتوانند اطلاعات سیستم شما را تغییر داده یا حذف کنند.
- به خطر انداختن حریم خصوصی کاربران: بسته به دادههای ذخیره شده در سرور SQL، یک حمله میتواند اطلاعات حساس کاربر مانند نشانی، شماره تلفن و جزئیات کارت اعتباری را در معرض سرقت قرار دهد.
- سرقت اطلاعات اصالتسنجی ادمین: اگر کاربر پایگاه داده دارای امتیازات سطح بالا و اختیارات مدیریتی باشد، مهاجم میتواند با استفاده از کدهای مخرب به سیستم او دسترسی پیدا کند.
- دادن دسترسی عمومی به مهاجم: چنانچه از فرامین ضعیف SQL برای بررسی نام کاربری و رمز عبور استفاده میکنید، مهاجم میتواند بدون نیاز به اطلاعات اصالتسنجی کاربر، به سیستم شما دسترسی پیدا کرده و از این طریق با دستیابی و دستکاری اطلاعات حساس، آنها را مخدوش نماید.
حملات تزریق اسکیوال تنها زیان مالی به همراه ندارند؛ در صورتی که اطلاعات شخصی مانند نام، نشانی، شماره تلفن و جزئیات کارتهای بانکی و اعتباری به سرقت برود، میتواند باعث از بین رفتن اعتماد مشتری و آسیب به شهرت او شود. هنگامی که اعتماد مشتری خدشهدار شود، کسب آبرو و اعتبار مجدد بسیار دشوار است.
حملات SQL Injection چقدر رایج هستند؟
از آنجا که پیادهسازی حملات SQL Injection نسبتاً آسان است و سود هنگفتی برای مهاجمان به همراه دارد، حملات SQLi چندان غیرمعمول نمیباشند. آمار وقوع حملات SQL Injection نسبتاً متفاوت است، اما تخمین زده میشود که SQLi اکثر حملات به برنامههای نرمافزاری را شامل میشود. گزارشات حاکی از آن است که، حملات تزریقی که شامل SQL Injection میشود، سومین خطر جدی امنیتی در برنامههای تحت وب در سال 2021 و سال 2022 بوده است.
نمونه حملات SQL Injection
در طول سالهای اخیر، بسیاری از سازمانها قربانی حملات SQLi شدهاند. برخی از نمونههای برجسته این حملات عبارتند از:
Fortnite, 2019
Fortnite یک بازی آنلاین با بیش از 350 میلیون کاربر است. در سال 2019، یک آسیبپذیری SQL Injection در آن شناسایی شد که اجازه دسترسی به حسابهای کاربری را برای مهاجمان فراهم مینمود؛ پس از مدتی این آسیبپذیری ترمیم شد.
Cisco, 2018
یک آسیبپذیری از نوع SQL Injection در Cisco Prime License Manager در سال 2018 شناسایی شد. این آسیبپذیری به مهاجمان اجازه میداد که در سیستمهایی که License Manager روی آنها نصب شده، قابلیت دسترسی به Shell را داشته باشند. سیسکو پس از مدتی وصله این آسیبپذیری را ارائه کرد.
Tesla, 2014
در سال 2014، محققان امنیتی اعلام کردند که مهاجمان توانستهاند با استفاده از SQL Injection به وبسایت تسلا نفوذ کنند، امتیازات مدیریتی را به دست آورند و اطلاعات کاربران را در این فرآیند به سرقت ببرند.
چگونه از حملات SQL Injection جلوگیری کنیم؟
توصیه میشود سازمانهایی که سعی در پیشگیری از وقوع حملات تزریق اسکیوال دارند، جهت حفاظت از وبسایتها و برنامههای کاربردی تحت وب اصول کلیدی زیر را رعایت کنند:
آموزش کارکنان
آموزش در خصوص خطرات حملات SQLi به تیم فناوری اطلاعات سایت شما و ارائه آموزشهای لازم مبتنی بر نقش (Role) به تمامی کاربران.
کنترل اطلاعات وارد شده توسط کاربران
هر یک از Queryهای ارسالی کاربر به پایگاهداده SQL، خود تهدیدی به شمار میآید. نشانی ورودی از کاربران احراز هویت شده و/یا کاربران داخلی باید همانند سایر ورودیهای عمومی کنترل، بررسی و تائید شوند. به حسابهایی که به پایگاهداده SQL متصل میشوند، حداقل امتیازات لازم را اختصاص بدهید. جهت کنترل ورودیهای کاربران، بهجای Blacklist، از Whitelist استفاده نمائید.
بکارگیری جدیدترین و آخرین نسخه نرمافزارها
استفاده از آخرین نسخه بسترهای توسعهوب جهت محافظت حداکثری از درجه اهمیت بالایی برخوردار است؛ نسخههای قدیمی ممکن است فاقد ویژگیهای ایمنی ضروری باشند. همواره از نصب آخرین نسخه نرمافزارها و اعمال جدیدترین وصلههای امنیتی موجود اطمینان حاصل شود.
پویش مداوم برنامههای تحت وب
از ابزارهای جامع مدیریت عملکرد اپلیکیشن استفاده کنید. با پویش منظم برنامههای کاربردی تحت وب، آسیبپذیریهای احتمالی را قبل از بهرهجویی از آنها شناسایی و برطرف نمائید.
بکارگیری فایروال قدرتمند و بهروز
فایروال برنامه وب اغلب برای فیلتر کردن SQLi و همچنین سایر تهدیدات آنلاین مورد استفاده قرار میگیرد. یک WAF متکی به فهرست بزرگی از امضاءها (Signature) است که به طور مکرر بهروزرسانی شده و منجر به مسدودسازی درخواستهای مخرب ارسالی به پایگاهداده SQL میشود. معمولاً این فهرست دارای امضاهایی برای رسیدگی به بردارهای خاص حمله است و به طور منظم با توجه به آسیبپذیریهای تازه کشف شده اصلاح و بهروزرسانی میشود.