حملات تزریق به پایگاه داده یا SQL Injection یکی از رایج ترین روش های هک است که امروزه مورد استفاده قرار می گیرد. از آنجایی که نقض امنیت دادهها برای برخی از شرکتها و برندهای معتبر همچنان اتفاق میافتد، اهمیت زیادی دارد که کاربران با تغییراتی مانند گذرواژههای تولید شده توسط سیستم و 2FA این نقضهای خطرناک را رفع کنند.
در این مقاله، به جزئیات حملات تزریق به پایگاه داده یا SQL Injection و اینکه چرا، به عنوان یک مالک وب سایت، باید به این نوع حمله اهمیت دهید اشاره شده است.
SQL Injection چیست؟
SQL Injection یا SQLi حمله ای است که در آن یک کوئری SQL از طریق داده های ورودی از یک کلاینت به یک برنامه کاربردی وارد یا "تزریق" می شود. در ساده ترین توصیف میتوان آن را به عنوان مهاجمی معرفی نمود که در جستوجوهایی که یک برنامه کاربردی در پایگاه داده خود انجام میدهد، دخالت میکند. این کوئری ها عمدتاً در برنامههای PHP و ASP که از فانکشن های قدیمی استفاده می کنند رخ میدهد، در حالی که برنامههای J2EE و ASP.NET کمتر مورد سوء استفاده از طریق SQL Injection قرار می گیرند.
تصویر(1)
این نوع تزریق به مهاجم اجازه میدهد مواردی مانند سوابق یا اطلاعات شخصی مشتری که نباید به آن ها دسترسی داشته باشد را به راحتی مشاهده کند. حملات تزریق به پایگاه داده یا SQL Injection می تواند منجر به انجام هر یک از موارد زیر توسط مهاجم شود:
- پیدا کردن اطلاعات مدیر وبسایت
- بالا بردن اختیارات و دسترسی کاربران
- به خطر انداختن زیرساخت های Back-end
- جعل اطلاعات
- دستکاری داده ها
- انکار ( از دسترس خارج کردن سایت یا انتقال وبسایت به آدرسی دیگر )
- افشای اطلاعات حساس
- حملات محرومسازی از سرویس (DoS)
چگونه حملات تزریق به پایگاه داده یا SQL Injection رخ می دهد
این نوع حمله معمولاً از طریق یک صفحه وب یا ورودی برنامه انجام می شود. اگر یک برنامه تحت وب مقادیری که از یک فرم، کوکی، پارامتر ورودی و غیره دریافت می کند را قبل از ارسال آنها از طریق کوئری های SQL تأیید نکند، موارد ذکر شده بدون اعتبار سنجی در سرور پایگاه داده اجرا می شوند. اگر اعتبارسنجی مناسبی برای مقادیر ورودی به سرور پایگاه داده وجود نداشته باشد، مهاجم می تواند ورودی را دستکاری کند تا اطلاعات به جای داده به عنوان کد تفسیر شوند.
رایج ترین حملات SQLi
حملات SQL Injection بسته به مهارت و تخیل مهاجم می تواند متفاوت باشد. در ادامه به چند نمونه از رایج ترین موارد یافت شده اشاره شده است:
حملات UNION
این نوع SQL Injection محبوب ترین روشی است که توسط مهاجمان انجام می شود. در این تکنیک کلمه کلیدی UNION در کوئری اصلی قرار داده می شود تا بتوان اطلاعات بیشتری از جداول مختلف پایگاه داده به دست آورد. برای مثال:
SELECT a, b FROM table1 UNION SELECT c, d FROM table2
هنگامی که یک مهاجم بتواند تعیین کند که چه تعداد ستون از کوئری اصلی بازگردانده شود، کدام یک از داده ها مناسب هستند و نتایج حاصل از کوئری تزریق شده را ذخیره کند، حمله موفقیت آمیز است.
تصویر(2)
Blind SQL Injection
معمولا انجام این حمله دشوارتر از سایر SQL Injection ها می باشد. در واقع نتایج کوئری SQL در پاسخ های برنامه برگردانده نمی شوند. همچنین جزئیات مربوط به خطاهای پایگاه داده نیز وجود ندارند. این آسیب پذیری های Blind می توانند برای دسترسی به داده های غیرمجاز مورد سوء استفاده قرار گیرند. هنگامی که پیام هایی در خصوص خطا های عمومی از هدف دریافت می شود، مهاجم Blind SQL Injection را انجام می دهد. این روش برای بازیابی اطلاعات پایگاه داده در مقایسه با یک تزریق معمولی SQL منحصر به فرد در نظر گرفته می شود.
Blind SQL Injection تقریباً مشابه تزریق معمولی SQL است، تنها تفاوت در نحوه بازیابی داده ها از پایگاه داده می باشد. هنگامی که پایگاه داده، داده های خروجی را به صفحه وب نمی دهد، مهاجم مجبور می شود با پرسیدن یک سری سؤالات درست یا نادرست از پایگاه داده، داده ها را بدزدد. این امر بهره برداری از آسیب پذیری SQL Injection را دشوارتر می کند، اما غیرممکن نیست.
SQL Injection مبتنی بر Boolean
SQL Injection مبتنی بر Boolean بر ارسال یک کوئری SQL به پایگاه داده تکیه می کند و یک برنامه کاربردی را مجبور می کند تا نتایج متفاوتی را بسته به درست یا نادرست بودن نتیجه بازگرداند. اگر برنامهای در برابر تزریقهای SQL آسیبپذیر باشد، هیچ چیزی برگردانده نمیشود، سپس یک کوئری با یک شرط واقعی (1=1) تزریق میشود. اگر یک شرط نادرست برگردانده شد اما محتوای صفحه متفاوت بود، مهاجم میتواند استنباط کند که SQL Injection کار میکند.
این تکنیک تزریق اغلب برای آزمایش میزان آسیب پذیری یک برنامه استفاده می شود.
SQL Injection مبتنی بر خطا
با یک SQL Injection مبتنی بر خطا، مهاجمان از خطاهای پایگاه داده در یک صفحه وب یا برنامه که توسط ورودی های غیر استاندارد راه اندازی شده اند، سوء استفاده می کنند. این تکنیک از پیام های خطا برای بازگرداندن کامل نتایج کوئری استفاده می کند و اطلاعات طبقه بندی شده را از پایگاه داده نشان می دهد. این روش می تواند برای شناسایی آسیب پذیر بودن یک سایت یا برنامه وب و جهت بازیابی داده های پنهان اضافی برای بازسازی کوئری های مخرب استفاده شود.
تصویر(3)
SQL Injection مبتنی بر زمان
در طول یک تزریق معمولی SQL، مهاجمین به سادگی می توانند پایگاه داده را بر اساس اطلاعاتی مانند نسخه و ساختار که از طریق کد بازگردانده شده است، بررسی کنند. وقتی مهاجمین قادر به بازیابی اطلاعات از یک پایگاه داده نباشند، می توانند SQL Injection مبتنی بر زمان را برای دستیابی به نتایج موفقیت آمیز به کار گیرند. این کار با استفاده از عملیاتی انجام می شود که برای تکمیل آنها زمان زیادی (اغلب چند ثانیه) طول می کشد.
این تزریقها معمولاً هنگام تعیین وجود آسیبپذیری در یک برنامه وب یا وبسایت و همچنین در ارتباط با تکنیکهای مبتنی بر Boolean در طول SQL Injection نامشخص استفاده میشوند.
چگونه می توان حملات تزریق به پایگاه داده یا SQL Injection را شناسایی کرد
برای شناسایی SQL Injection، ابتدا باید با راه اندازی یک اسکن یا اجرای یک ابزار حمله خودکار SQL Injection، محل آسیب پذیری را شناسایی کنید. ابزارهایی مانند Havij، SQLmap یا jSQL می توانند به شناسایی کد آسیب پذیر کمک کنند. پس از شناسایی آسیبپذیریها، باید تزریقهای مخرب را حذف کنید.
پس از حذف کد، باید مطمئن شوید که باگ و خطای مربوط به همه پایگاههای داده، برنامهها، سیستمهای شخص ثالث یا هر مؤلفه قدیمی دیگر رفع شده و بهطور مرتب بروزرسانی میشوند. همچنین باید پس از اصلاح آسیبپذیریها و البته با استفاده از کاراکترهای قوی، همه رمزهای عبور را تغییر دهید. علاوه بر این، راهاندازی ابزاری که به طور منظم هر عبارات SQL مشکوک را با استفاده از تحلیل رفتاری یا یادگیری ماشینی نظارت کند، میتواند به شناسایی شاخصهای سازش (IoC) در آینده کمک کند.
چگونه می توان از حملات تزریق به پایگاه داده یا SQL Injection جلوگیری کرد
این حملات را می توان با استفاده از اعتبار سنجی مناسب ورودی ها و عبارات آماده شده با کوئری های پارامتری، به جای اتصال رشته ها در کوئری، اصلاح کرد. برای اینکه کوئری های پارامتری شده در جلوگیری از SQL Injection موثر باشند، رشته مورد استفاده در کوئری باید به صورت پیچیده کدگذاری شده باشد. همچنین نمی تواند حاوی داده های متغیری از هر مبدایی باشد.
تصویر(4)
یکی دیگر از اقدامات پیشگیرانه استفاده از دستورالعمل های ذخیره شده است که اجرای SQL مخرب را برای مهاجمان پیچیده تر می کند. به این دلیل که دستورالعمل های ذخیره شده نمی توانند به صورت پویا در کوئری درج شوند.
همواره مهم است که هرگز به داده های ارسال شده توسط کاربر اعتماد نکنید. انجام اعتبارسنجی روی داده های ورودی کاربر بسیار مفید است و از حملات و تزریق کدهای مخرب جلوگیری می کند. اگر داده ای دریافت شود که با معیارهای تعیین شده مطابقت نداشته باشد، رد می شود. این اقدام از تزریق کدهای مخرب در برنامه یا وب سایت جلوگیری می کند.
علاوه بر این، تنظیم دسترسی ها به حداقل ممکن برای همه حساب ها مهم است. این اقدام تضمین می کند که تهدیدات امنیتی وب سایت کاهش می یابد. فقط می بایست دسترسی های لازم را در مواقع ضروری به کاربر ارائه کنید. در نظر داشته باشید که نباید دسترسی مدیر را به کاربران اختصاص دهید.
نقصهای حملات تزریق به پایگاه داده یا SQL Injection زمانی ظاهر میشوند که کوئریهای پایگاه داده شامل ورودیهای ارائهشده توسط کاربر باشند. به همین دلیل، در صورت امکان باید از کوئری های پویا اجتناب شود. اولویت کلی باید جلوگیری از تاثیرگذاری ورودی های ارائه شده توسط کاربر که حاوی SQL مخرب بر منطق کوئری اجرا شده است، باشد.
آخرین چیزی که باید در هنگام محافظت در برابر حملات تزریق به پایگاه داده یا SQL Injection در نظر گرفت، پیاده سازی فایروال برنامه وب است. فایروال ها درخواست های خطرناک را فیلتر می کنند، از جمله آنهایی که در تلاش برای SQL Injection هستند.
نتیجه گیری
در مورد این نوع حملات قطعاً فاکتورهای زیادی وجود دارند که باید در نظر بگیرید. زمانی که SQL Injection رخ می دهد میتواند برای کسبوکارتان مشکلات زیادی را ایجاد کرده و اعتبار برند شما را به شدت کاهش دهد. از آنجایی که پنهان ماندن یک اولویت برای اکثر مهاجمان است، تشخیص به موقع حمله و جلوگیری از آن بسیار دشوار می باشد. با ابزارهای مناسب امنیتی و کمک گرفتن متخصصان امنیت سرور و شبکه می توانید از حملات تزریق به پایگاه داده یا SQL Injection جلوگیری کنید.