معرفی SQL injection و راه های مقابله با آن

معرفی SQL injection و راه های مقابله با آن

امید صادقی ادمین
مدت زمان مطالعه: 15 دقیقه 17 خرداد 01

معرفی SQL Injection

 

SQLi) SQL Injection) نوعی حمله تزریقی است که اجرای دستورات مخرب SQL را ممکن می سازد. این دستورها سرور پایگاه داده را در پشت یک برنامه وب کنترل می کنند. مهاجمان می توانند از آسیب پذیری های SQL Injection برای دور زدن اقدامات امنیتی برنامه استفاده کنند. آنها می توانند به تأیید اعتبار و مجوز یک صفحه وب یا برنامه وب بپردازند و محتوای کل پایگاه داده SQL را بازیابی کنند. آنها همچنین می توانند از SQL Injection برای افزودن، تغییر و حذف سوابق در پایگاه داده استفاده کنند.آسیب پذیری SQL Injection ممکن است روی هر وب سایت یا برنامه وب که از یک پایگاه داده SQL مانند MySQL، Oracle، SQL Serverیا سایر موارد استفاده می کند، تأثیر بگذارد. مجرمان ممکن است از آن برای دستیابی غیرمجاز به داده های حساس شما مانند: اطلاعات مربوط به مشتری، داده های شخصی، اسرار تجاری، مالکیت معنوی و موارد دیگر استفاده کنند. حملات SQL Injection یکی از قدیمی ترین، رایج ترین و خطرناک ترین آسیب پذیری برنامه های وب است. سازمان OWASP (پروژه امنیت نرم‌ افزاری تحت وب) SQL Injection را در بین فهرست تزریقات موجود در سند خود را به عنوان تهدید شماره یک برای امنیت برنامه های تحت وب ذکر کرده است.  
معرفی SQL Injection
 

چگونه و چرا یک حمله SQL Injection انجام می شود

  • برای انجام حمله SQL Injection، یک مهاجم ابتدا باید ورودی های کاربر آسیب پذیر را در صفحه وب یا برنامه تحت وب پیدا کند. یک صفحه وب یا یک برنامه تحت وب که دارای آسیب پذیری SQL Injection است، از چنین ورودی کاربر به طور مستقیم در یک کوئری SQL استفاده می کند. مهاجم می تواند محتوای ورودی ایجاد کند. چنین محتوائی غالبا به عنوان بار مخرب نامیده می شود و بخش اصلی حمله است. بعد از اینکه مهاجم این محتوا را ارسال کرد، دستورات مخرب SQL در پایگاه داده اجرا می شوند.
  • SQL یک زبان کوئری است که برای مدیریت داده های ذخیره شده در پایگاه های داده طراحی شده است. می توانید از آن برای دسترسی، تغییر و حذف داده ها استفاده کنید. بسیاری از برنامه های وب و وب سایت ها، همه داده ها را در پایگاه های داده SQL ذخیره می کنند. در برخی موارد، شما همچنین می توانید از دستورات SQL برای اجرای فرامین سیستم عامل استفاده کنید. بنابراین، یک حمله موفق SQL Injection می تواند عواقب بسیار جدی در بر داشته باشد.
  • مهاجمان می توانند از SQL Injections برای یافتن اعتبار سایر کاربران در پایگاه داده استفاده کنند. آنها می توانند هویت این کاربران را جعل کنند. کاربر جعل شده ممکن است یک مدیر پایگاه داده با تمام امتیازات پایگاه داده باشد.
  • SQL به شما امکان می دهد داده ها را از پایگاه داده انتخاب و خارج کنید. آسیب پذیری SQL Injection می تواند به مهاجم اجازه دهد دسترسی کامل به کلیه داده های یک سرور پایگاه داده را بدهد.
  • SQL همچنین به شما امکان می دهد داده ها را در یک پایگاه داده تغییر داده و داده های جدید اضافه کنید. به عنوان مثال ، در یک برنامه مالی، یک مهاجم می تواند از SQL Injection برای تغییر دادن مانده ها، معاملات باطل یا انتقال پول به حساب خود استفاده کند.
  • شما می توانید SQL را برای حذف سوابق از یک پایگاه داده، حتی جداول جدول استفاده کنید. حتی اگر مدیر پشتیبان تهیه پایگاه داده باشد، حذف داده ها می تواند در دسترس بودن برنامه تا زمان بازگرداندن بانک اطلاعات تأثیر بگذارد. همچنین، پشتیبان گیری ممکن است جدیدترین داده ها را پوشش ندهد.
  • در برخی از سرورهای پایگاه داده، شما می توانید با استفاده از سرور پایگاه داده به سیستم عامل دسترسی پیدا کنید. این ممکن است عمدی یا تصادفی باشد. در چنین حالتی، یک مهاجم می تواند از SQL Injection به عنوان بردار اولیه استفاده کند و سپس به شبکه داخلی پشت فایروال حمله کند.

انواع حملات SQL Injection

SQL Injectionبه طور معمول در سه دسته قرار می گیرند: SQLi درون باند (کلاسیک)، SQLi استنباطی (کور) و SQLi خارج از باند. شما می توانید انواع SQL Injection را بر اساس روش هایی که از آن ها برای دسترسی به داده های پس زمینه و پتانسیل آسیب دیدن استفاده می شود، طبقه بندی کنید.

SQLi درون باند 

مهاجم از همان کانال های ارتباطی برای شروع حملات خود و جمع آوری نتایج خود استفاده می کند. سادگی و کارایی SQLi درون باند، آن را به یکی از متداول ترین انواع حمله SQLi تبدیل می کند. دو روش فرعی وجود دارد:
  • SQLi - Error-based SQLi مبتنی بر خطا - مهاجم اقداماتی را انجام می دهد که باعث می شود پایگاه داده پیام خطایی ایجاد کند. مهاجم به طور بالقوه می تواند از داده های تهیه شده توسط این پیام های خطا برای جمع آوری اطلاعات در مورد ساختار بانک اطلاعاتی استفاده کند.
  • SQLi - Union-based SQLi مبتنی بر اتحادیه این تکنیک از اپراتور UNION SQL استفاده می کند، که چندین عبارت انتخابی ایجاد شده توسط پایگاه داده را برای رسیدن به یک پاسخ HTTP یکپارچه می کند. این پاسخ ممکن است حاوی داده هایی باشد که توسط مهاجم قابل استفاده است.

SQLi استنباطی (کور) 

مهاجم بارهای داده را به سرور ارسال می کند و پاسخ و رفتار سرور را مشاهده می کند تا درباره ساختار آن اطلاعات بیشتری کسب کند. این روش SQLi کور نامیده می شود، زیرا داده ها از پایگاه داده وب سایت به مهاجم منتقل نمی شوند، بنابراین مهاجم نمی تواند اطلاعاتی را در مورد حمله به صورت باند مشاهده کند. SQL Injectionکور به الگوهای پاسخ و رفتارهای سرور متکی است، بنابراین معمولاً برای اجرای آنها کندتر هستند اما ممکن است به همان اندازه مضر باشند. تزریق های کور SQL را می توان به شرح زیر طبقه بندی کرد:
  • Boolean — مهاجم یک کوئری SQL را به پایگاه داده ارسال می کند و باعث می شود برنامه به نتیجه ای برگردد. نتیجه بسته به صحت یا نادرست بودن کوئری متفاوت خواهد بود. براساس نتیجه، اطلاعات موجود در پاسخ HTTP اصلاح شده یا بدون تغییر خواهند ماند. اگر پیام نتیجه واقعی یا غلط ایجاد کند، مهاجم می تواند نتیجه بگیرد.
  • Time-based مهاجم، یک کوئری SQL را به پایگاه داده ارسال می کند، که باعث می شود پایگاه داده منتظر بماند (برای مدت زمانی در ثانیه) قبل از اینکه بتواند واکنش نشان دهد. مهاجم می تواند از زمانی که بانک اطلاعاتی برای پاسخ به آن صرف کند، ببیند آیا یک پرس و جو درست است یا غلط. براساس نتیجه، پاسخ HTTP فوراً یا پس از یک دوره انتظار تولید می شود. بنابراین مهاجم می ‌تواند در صورتی کار کند که پیغامی که مورد استفاده قرار می ‌گیرد صحیح یا نادرست باشد، بدون اینکه به داده از پایگاه ‌داده متکی باشد.

SQLi خارج از باند  

مهاجم فقط در صورت فعال بودن ویژگی های خاص روی سرور پایگاه داده استفاده شده توسط برنامه وب، می تواند این نوع حمله را انجام دهد. این شکل از حمله در درجه اول به عنوان جایگزینی برای تکنیک های درون باند و استنباطی SQLi استفاده می شود. SQLi خارج از باند هنگامی انجام می شود که مهاجم نتواند از همان کانال برای اجرای حمله و جمع آوری اطلاعات استفاده کند ، یا هنگامی که یک سرور خیلی کند یا ناپایدار است برای انجام این اقدامات، این تکنیک ها ظرفیت سرور را برای ایجاد درخواست های DNS یا HTTP برای انتقال داده به یک مهاجم، حساب می کنند.

راه های جلوگیری از حملات SQL Injection

در واقع موارد زیادی وجود دارد که دارندگان وب سایت می توانند برای جلوگیری از تزریق SQL انجام دهند. اگرچه در امنیت شبکه یک راه حل بی عیب و نقص وجود ندارد، اما می توان موانع بزرگی را در مسیر تلاش برای تزریق SQL قرار داد. در اینجا ده مرحله وجود دارد که می توانید برای کاهش چشمگیر خطر قربانی شدن توسط  یک حمله تزریق SQL استفاده کنید: به هیچ کس اعتماد نکنید: فرض کنید تمام داده های ارسال شده توسط کاربر بد هستند، بنابراین از اعتبار سنجی ورودی از طریق تابعی مانند MyqQL myql_real_escape_string () استفاده کنید تا اطمینان حاصل شود که هرگونه کاراکتر خطرناک مانند " به کوئری SQL در داده ها منتقل نمی شود. همچنین باید با فیلتر کردن داده های کاربر بر اساس متن، همه چیز را ایمنی کنید. به عنوان مثال، آدرس های ایمیل باید فیلتر شوند تا فقط کاراکترهای مجاز در یک آدرس پست الکترونیکی مجاز باشند، شماره تلفن ها باید فیلتر شوند تا فقط ارقام مجاز در شماره تلفن و غیره مجاز باشند. از SQL پویا استفاده نکنید - از نمایش داده ها با ورودی کاربر استفاده نکنید، حتی روال ایمن کردن داده ها نیز ممکن است دارای نقص باشد، بنابراین در هر زمان ممکن از عبارت های آماده شده، نمایش داده های پارامتریزه یا مراحل ذخیره شده استفاده کنید. اما فراموش نکنید که در حالی که روشهای ذخیره شده از بروز برخی از انواع حملات تزریق SQL جلوگیری می کنند، آنها در برابر بسیاری دیگر محافظت نمی کنند ، بنابراین به امنیت آنها اعتماد نکنید. به روزرسانی و پچ کردن: آسیب پذیری ها در برنامه ها و پایگاه های داده ای که هکرها می توانند با استفاده از تزریق SQL از آن سوء استفاده کنند، مرتبا کشف می شوند، بنابراین استفاده از پچ ها و به روز رسانی ها در اسرع وقت بسیار مهم است. راه حل مدیریت پچ ممکن است ارزش سرمایه گذاری داشته باشد. فایروال: برای کمک به فیلتر کردن داده های مخرب، یک فایروال برنامه وب (WAF) - نرم افزاری یا مبتنی بر دستگاه را در نظر بگیرید. یک فایروال خوب مجموعه کاملی از قوانین پیش فرض را در اختیار شما قرار می دهد و اضافه کردن موارد جدید را هر وقت لازم باشد آسان می کند. یک WAF می تواند برای ارائه برخی از محافظت های امنیتی در برابر آسیب پذیری جدید قبل از دسترسی به پچ، بسیار مفید باشد. سطح حمله خود را کاهش دهید: از عملکردهای پایگاه داده ای که برای جلوگیری از استفاده هکر از آن استفاده نمی کنید، خلاص شوید. به عنوان مثال، روش ذخیره شده xp_cmdshell در MS SQL باعث ایجاد پوسته فرمان ویندوز می شود و در یک رشته برای اجرای آن عبور می کند ، که در واقع می تواند برای هکر بسیار مفید باشد. فرآیند ویندوز ایجاد شده توسط xp_cmdshell دارای امتیازات امنیتی مشابه حساب سرویس SQL Server است. از امتیازات مناسب استفاده کنید: با استفاده از یک حساب دارای امتیازات سطح مدیریتی به پایگاه ‌داده خود متصل نشوید مگر این که دلیل قانع ‌کننده‌ ای برای انجام این کار وجود داشته باشد. استفاده از یک حساب با دسترسی محدود به مراتب ایمن تر است و می تواند عملکرد هکرها را محدود کند. اسرار خود را محرمانه نگه دارید: فرض کنید که برنامه شما امن نیست و مطابق با رمزگذاری یا هش کردن رمزهای عبور و سایر اطلاعات محرمانه، از جمله رشته های اتصال عمل می کند. اطلاعات بیشتری از آنچه که نیاز دارید فاش نکنید: هکرها می توانند اطلاعات زیادی درباره معماری بانک اطلاعاتی را از پیام های خطا بیاموزند، بنابراین اطمینان حاصل کنید که آنها حداقل اطلاعات را نشان می دهند. با استفاده از حالت "RemoteOnly" customErrors (یا معادل آن) برای نمایش پیام های خطای کلامی در دستگاه محلی و در عین حال اطمینان از اینکه هکر خارجی چیزی بیش از این واقعیت ندارد که اقدامات وی منجر به خطای غیرقابل کنترل شده است. به طور مداوم دستورات SQL را از برنامه های متصل به پایگاه داده نظارت کنید: این به شناسایی دستورات مخرب و آسیب پذیری ها کمک می کند. ابزارهای نظارتی که به ویژه از یادگیری ماشین و / یا تحلیل رفتاری استفاده می کنند می توانند مفید باشند. خرید نرم افزار بهتر:قبل از تحویل نرم افزار، نویسندگان کد را مسئول بررسی کد و رفع عیب های امنیتی در برنامه های سفارشی قرار دهید.

نتیجه گیری 

SQL Injection یکی از شایع ترین و مؤثرترین شکل های حمله به یک سیستم است. کنترل کد / اسکریپت مخرب SQL در برنامه وب و حفظ حریم خصوصی پایان هنوز یک چالش اساسی برای توسعه دهنده وب است. این مباحث باید توسط توسعه دهندگان وب که در توسعه وب سایت ها با استفاده از پایگاه های داده درگیر هستند ، جدا مورد توجه قرار گیرند.
برچسب ها :
دسته بندی ها :