حمله SQL Injection یک تکنیک تزریق کد است که توسط هکرها برای دسترسی و اصلاح اطلاعات در پایگاه داده Back-End استفاده میشود. SQL Injection یک تکنیک هک متداول است، پس مهم است که از کسبوکار خود در مقابل آن حفاظت کنیم. با توجه به Open Web Application Security Project، حملات تزریق، از جمله حملات SQL Injection سومین ریسک امنیتی بزرگ برنامه کاربردی وب در سال ۲۰۲۱ بودند. در برنامههای کاربردی تست شده، ۲۷۴۰۰۰ بار تزریق رخ داده بود.
برای حفاظت از خود در مقابل حملات SQL Injection، باید چگونگی انجام این حملات درک شود تا بتوان بهترین راهکارها را دنبال کرد، آسیبپذیریها را تست کرد و در نرمافزارهایی سرمایهگذاری کرد که بهطور فعال از حملات پیشگیری میکنند.
تأثیرات مخرب حملات SQL Injection موفق
حملات SQL Injection میتوانند تأثیر منفی قابلتوجهی روی سازمان داشته باشند. سازمانها به دادههای حساس شرکتی و اطلاعات خصوصی مشتری دسترسی دارند و حملات SQL Injection معمولاً همان اطلاعات محرمانه را هدف قرار میدهند. وقتی که کاربر مخربی با موفقیت یک حملهی SQL Injection را به انجام میرساند، امکان رخ دادن هر یک از تأثیرات مخرب زیر وجود دارد:
- حمله میتواند دادههای حساس شرکتی را افشا کند. مهاجمین میتوانند با استفاده از حمله SQL Injection دادهها را بازیابی کرده و تغییر دهند و همین امر ریسک افشای دادههای حساس شرکتی ذخیره شده بر روی SQL Server را به همراه دارد.
- حمله میتواند حریم خصوصی کاربران را نقض کند. بسته به نوع دادهای که روی SQL Server ذخیره میشود، یک حمله SQL Injection میتواند دادههای خصوصی کاربر مثل شمارهی کارت اعتباری را در معرض افشا قرار دهد.
- حمله میتواند به مهاجم دسترسی ادمین بر روی سیستم قربانی بدهد. اگر یک کاربر دیتابیس دارای سطح دسترسی ادمین باشد، مهاجم میتواند با استفاده از کد مخرب به آن دسترسی پیدا کند. برای حفاظت از خود در مقابل این نوع آسیبپذیری، میتوان یک کاربر دیتابیس با حداقل سطح دسترسی ایجاد کرد.
- حمله SQL Injection میتواند به مهاجم دسترسی در سطح عمومی بر روی سیستم قربانی بدهد. اگر برای چک کردن نامهای کاربری و رمزهای عبور از دستورات SQL ضعیف استفاده شود، مهاجم میتواند بدون دانستن اطلاعات اعتباری کاربر به سیستم دسترسی پیدا کند. با وجود دسترسی کلی به سیستم، مهاجم میتواند موجب دسترسی آسیبزای بیشتر و دستکاری اطلاعات حساس شود.
- مهاجم میتواند یکپارچگی داده را نقض کند. مهاجم میتواند با استفاده از SQL Injection تغییراتی را در اطلاعات سیستم انجام دهد یا اطلاعات را حذف کند.
ازآنجاییکه تأثیرات یک حملهی SQL Injection موفق میتواند بسیار شدید باشد، مهم است که کسبوکارها پیشگیریهای لازم را انجام دهند و پیش از رخ دادن حمله، آسیبپذیریها را محدود کنند. به همین جهت، باید درک کنیم که حملات SQL Injection چطور رخ میدهد تا متوجه شویم که با چه چیزی روبهرو هستیم.
حملات SQL Injection چگونه انجام میشوند
SQL زبانی است که در برنامهنویسی از آن استفاده میشود و برای دادهها در یک سیستم مدیریت جریان دادهی رابطهای طراحی شده است. SQL دستورات اجرا را ازجمله دستورات لازم برای بازیابی داده، بروزرسانی داده و حذف آمار Query میکند. یک مهاجم برای اجرای دستورات مخرب میتواند کد مخربی را وارد رشتههایی کند که برای اجرا به یک SQL Server منتقل میشوند. چندین راه وجود دارد که کاربران مخرب میتوانند از طریق آن حملهای را اجرایی کنند، اما ورودیهای آسیبپذیر متداول در یک برنامه کاربردی وب یا صفحهی وب Fieldهای ورودی کاربر هستند، مثل فرمهایی که امکان نوشتن آزادانهی متن را میدهند.
با درک تهدیدات امنیت سایبری، سازمانها میتوانند خود را برای حملات آماده و آسیبپذیریها اصلاح کنند. در ادامه به انواع حملات SQL Injection میپردازیم که در سه دسته قرار میگیرند: In-Band SQL Injection، SQL Injection استنباطی و Out-of-Band SQL Injection.
حملات In-band SQL Injection
In-band SQL Injection متداولترین نوع حمله است. با این نوع از حملهی SQL Injection، یک کاربر مخرب از کانال ارتباطی یکسانی برای حمله و جمعآوری نتایج استفاده میکند. تکنیکهای زیر متداولترین انواع حملات In-band SQL Injection هستند:
- SQL Injection مبتنی بر پیام خطا. در این تکنیک، مهاجمین برای ایجاد یک پیام خطا از سرور دیتابیس، از یک دستور SQL استفاده میکنند و بدین صورت در مورد ساختار دیتابیس اطلاعاتی بدست میآورند. پیامهای خطا در زمان توسعهی یک برنامه کاربردی وب یا صفحهی وب مفید هستند اما میتوانند در آینده یک آسیبپذیری محسوب شوند، زیرا اطلاعاتی را در مورد دیتابیس افشا میکنند. برای پیشگیری از این آسیبپذیری، میتوان پس از فعال شدن یک وبسایت یا برنامه کاربردی، پیامهای خطا را غیرفعال کرد.
- SQL Injection مبتنی بر Union. در این تکنیک، مهاجمین از اپراتور UNION SQL استفاده میکنند تا چند بیانیه (Statement) را ترکیب کرده و یک پاسخ HTTP واحد را بازگردانند. یک مهاجم میتواند با استفاده از این تکنیک اطلاعاتی را از دیتابیس استخراج کند. این تکنیک متداولترین نوع حمله SQL Injection است و مقابله با آن نسبت به یک حمله SQL Injection مبتنی بر خطا نیاز به اقدامات امنیتی بیشتری دارد.
حملات SQL Injection استنباطی
SQL Injection استنباطی SQL Injection کور نیز نامیده میشود، زیرا دیتابیس وبسایت مثل In-band SQL Injection، دادهها را به مهاجمین منتقل نمیکند. در عوض، یک کاربر مخرب میتواند با ارسال Payloadهای داده و مشاهدهی پاسخ در مورد ساختار سرور اطلاعاتی کسب کند. حملات SQL Injection استنباطی نسبت به حملات In-band SQL Injection کمتر رخ میدهند، زیرا انجام آنها بیشتر زمان میبرد. دو نوع از حملات SQL Injection استنباطی از تکنیکهای زیر استفاده میکنند:
- تزریقBoolean با این تکنیک، مهاجمین یک SQL Query را به دیتابیس میفرستند و نتایج را مشاهده میکنند. مهاجمین میتوانند با توجه به اینکه آیا اطلاعات در پاسخ HTTP اصلاح شده است یا نه، متوجه شوند که نتیجه درست است یا غلط.
- تزریق مبتنی بر زمان. با این تکنیک، مهاجمین یک SQL Query را به دیتابیس میفرستند و دیتابیس را مجبور میکنند که چند ثانیه قبل از پاسخ دادن صبر کند. با توجه به تعداد ثانیههایی که قبل از پاسخ میگذرد، مهاجمین میتوانند مشخص کنند که آیا نتیجه درست است یا غلط. مثلاً یک هکر میتواند از یک SQL Query استفاده کند که اگر حرف اول اسم دیتابیس اول A باشد دستور تأخیر میدهد. سپس اگر پاسخ دچار تأخیر شود، مهاجم میداند که Query حقیقی است.
حملات Out-of-Band SQL Injection
Out-of-Band SQL Injection حملهای است که کمتر از همه رایج است. با این نوع از حملهی SQL Injection، کاربر مخرب برای حمله از کانال ارتباطی متفاوتی نسبت به آنچه برای جمعآوری نتایج استفاده میشود، استفاده میکند. اگر سروری بیش از حد کند یا ناپایدار باشد که بتواند از SQL Injection استنباطی یا In-band SQL Injection استفاده کند، مهاجمین از این روش بهره میبرند.
اقدامات امنیتی برای حفاظت از دیتابیس در مقابل SQL Injection
حملات SQL Injection یک ریسک امنیت سایبری متداول هستند، اما همیشه راههایی برای حفاظت از دیتابیس خود در مقابل SQL Injection وجود دارد. با دنبال کردن برخی اقدامات و راهکارهای امنیتی عمومی، سازمانها بهتر میتوانند از خودشان در مقابل این نوع حملات حفاظت کنند. وقتی که وبسایت یا برنامه کاربردی وب توسعه داده میشود، میتوان اقداماتی امنیتی را به کار گرفت که خطر حملات SQL Injection را کاهش میدهند. مثلاً اقدامات امنیتی زیر کارآمدترین راهکارها برای پیشگیری از حملات SQL Injection هستند:
- استفاده از بیانیههای آماده با Queryهای دارای پارامتر. وقتی که توسعهدهندهای از Queryهای دارای پارامتر استفاده میکند، باید تمام کد SQL را تعریف کرده و سپس هر پارامتر را عبور دهد. درنتیجه یک مهاجم نمیتواند در آینده هدف یک Query را تغییر دهد.
- استفاده از فرایندهای ذخیرهشده. وقتی توسعهدهندهای یک فرایند ذخیرهشده را مورداستفاده قرار دهد، بیانیههای SQL را با پارامترهایی میسازند که در دیتابیس ذخیرهشده و از برنامه کاربردی فراخوانده شدهاند. این تکنیک راهکار جایگزینی برای استفاده از بیانیههای آماده است و بهطور مشابهی در مقابل حملات SQL Injection کارآمد است.
- استفاده از تائید ورودی Allowlist در برخی از مکانها، توسعهدهندگان میتوانند یک مقدار مورد انتظار را تعریف کنند، مثلاً نام مجاز برای یک جدول یا ستون. این تأییدیه باعث میشود که یک کاربر غیرمجاز را نتوان به یک Query اضافه کرد.
- Escape ورودی کاربر پیش از قرار دادن آن در یکQuery . این تکنیک تمام ورودیهای کاربر را Escape میکند تا ورودی با کد SQL از طرف توسعهدهنده اشتباه گرفته نشود. روشهای دیگر در این فهرست مورد ترجیح هستند و حفاظت قدرتمندی را ارائه میدهند. اما گاهی اوقات اگر تائید ورودی بیش از حد گرانقیمت باشد، سازمانها در زمان مجهزسازی کد قدیمی از این روش استفاده میکنند.
علاوه بر استفاده از اقدامات امنیتی در زمان توسعه یا مجهزسازی یک وبسایت و برنامه کاربردی وب، میتوان از نرمافزارهایی استفاده کرد که بهطور فعال به دنبال تهدیدات سایبری میگردند. ابزارهایی مثل نرمافزارهای شناسایی و پاسخ مدیریتشده و شکار تهدید مدیریتشده میتوانند به سازمانها کمک کنند که اقدامهای پیشگیرانه موفقی را پیادهسازی کنند. این ابزار همچنین به افراد کمک میکنند که در صورت رویداد یک حمله به تهدیدات پاسخ دهند.
بهترین راهکارها و پیشگیریها برای حفاظت از دیتابیس در مقابل SQL Injection
علاوه بر اقدامات امنیتی بالا، توسعهدهندگان و ادمینها باید راهکارهای زیر را نیز دنبال کنند تا تأثیر و بسامد حملات سایبری را به حداقل برسانند:
- نصب آخرین نرمافزارها و Patchهای امنیتی از Vendorها
- ارائه حداقل سطح دسترسی به اکانتهایی که به دیتابیس SQL متصل میشوند
- نباید اکانتهای دیتابیس را روی وبسایتها و برنامههای کاربردی مختلف به اشتراک گذاشت
- باید برای انواع ورودیهای کاربر ازجمله منوهای Drop-Down از فرایند بررسی و تائید استفاده کرد
- باید بهجای ارسال پیامهای خطا به مرورگر وب Client، گزارشگیری خطا را پیکربندی کرد
بهطورکلی، سازمانها باید از استفاده از اکانتهای مشترک اجتناب کنند، تا اگر یک اکانت دچار نقض امنیتی شد، مهاجمین نتوانند دسترسی بیشتری بدست آورند. سازمانها همچنین باید از ارسال پیامهای خطای دیتابیس به یک مرورگر وب کلاینت اجتناب کنند، زیرا مهاجمین میتوانند با استفاده از آن اطلاعات متوجه جزئیاتی فنی درمورد دیتابیس شوند.
چگونه آسیبپذیریهای SQL Injection را پیدا کنیم
باید نسبت به آسیبپذیریهای SQL Injection در وبسایتها و برنامههای کاربردی آگاه بود تا بتوان هر مشکلی که پیدا میشود را اصلاح کرد. حملات SQL Injection یکی از متداولترین حملات سایبری هستند و میتوانند تأثیر منفی شدیدی روی یک کسبوکار بگذارند. درنتیجه، کسبوکارها باید بهصورت دورهای برای پیدا کردن آسیبپذیریهای SQL Injection تست انجام دهند.
در حالت ایدهآل، سازمانها باید هر زمانی که کد یک برنامه کاربردی یا وبسایت را بروزرسانی میکنند، آسیبپذیریهای SQL Injection را تست کنند. بدین صورت میتوان مشکلاتی را شناسایی کرد که ممکن است با تغییرات دیگر در کد ایجاد شده باشند. برای تست کردن آسیبپذیریهای SQL Injection، میتوان یا بهصورت دستی از تکنیکهای SQL Injection استفاده کرد یا اینکه از یک نرمافزار اسکن آسیبپذیری وب برای خودکارسازی فرایند استفاده شود.
تست دستی
وقتی تست دستی برای آسیبپذیریهای SQL Injection اتفاق میافتد، باید بهصورت دستی از SQL Injection در یک Field با ورودی کاربر استفاده شود، فارغ از اینکه تأییدیه ورودی کار میکند یا خیر. بسته به تعداد Fieldهایی که باید تست شود، این روش میتواند زمانبر باشد. همچنین تست کردن کامل تمام حوزههای وبسایت یا برنامه کاربردی وب میتواند چالشبرانگیز باشد. درنتیجه، ممکن است در طول تست از آسیبپذیریها چشمپوشی شود.
اسکن خودکارسازیشده
وقتی از اسکن خودکارسازیشده برای تست کردن آسیبپذیریهای SQL Injection استفاده میشود، سازمانها از نرمافزارهای اسکن امنیت وب استفاده میکنند تا مشکلات را شناسایی کرده و به آنها پاسخ دهند. نرمافزار اسکن وب راه سریعتر و جامعتری برای تست کردن آسیبپذیریهای SQL Injection است. اگر یک آسیبپذیری پیدا شود، نرمافزار نتایجی را نمایش میدهد، ازجمله اطلاعاتی در مورد URL و پارامتر تحت تأثیر. با خودکارسازی این فرایند تست با یک ابزار نرمافزاری، سازمانها میتوانند در حین بروزرسانی نرمافزار در زمان صرفهجویی کنند.