• تزریق SQL (چیستی، شاخص ها، و اهداف)
      شماره: IRCAR201003055

      مقدمه
      اغلب شركتهایی كه دسترسی به اینترنت را برای كارمندان خود فراهم می آورند، از نوعی فایروال استفاده میكنند. هدف از بكارگیری فایروال آن است كه ترافیك ورودی و خروجی شبكه سازمان فیلتر گردد و به این ترتیب، استفاده از شبكه به كاربران معتبر و مقاصد مجاز محدود شود. اما فایروال در سطح آدرسهای IP و پورتهای شبكه كار میكند (در مدل OSI فایروالها در لایه های 3، 4، و 5 شبكه كار میكنند) و در نتیجه یك فایروال جزئیات پروتكلهای لایه های بالاتر مانند HTTP را درك نمیكند.
      دسته ای از حملات هستند كه در لایه كاربرد (لایه 7) مدل OSI عمل میكنند، و در نتیجه به راحتی میتوانند از فایروالها عبور نمایند. حملات تزریق SQL یكی از این حملات هستند.
      بسیاری از برنامه های وب اطلاعاتی را از كاربر دریافت می‌كنند و سپس، نتایجی را تولید می‌كنند. به عنوان مثال برنامه ای یك فرم جستجوی ساده را در اختیار كاربر قرار می‌دهد كه عبارت هدف جستجو در آن وارد شده و پس از پرس و جو از پایگاه داده، نتایجی تولید شده و برای كاربر نمایش داده می‌شود. این فرایند یك نمونه عملكرد بسیار رایج است كه در بسیاری از برنامه های وب مشاهده می‌شود.
      در صورتی كه كاربری اهداف خراب‌كارانه داشته باشد، ممكن است بتواند با جستجو كردن یك عبارت، امنیت این برنامه وب را به خطر بیندازد. این خطر به میزانی جدی است كه حتی اگر از زیرساخت امنیتی مستحكمی مانند یك فایروال مناسب استفاده شده باشد، ولی ورودی‌های كاربران مورد ارزیابی قرار نگیرد، تمام‌ تلاشی كه برای ایجاد زیرساخت امنیتی به كار گرفته شده است به هدر می‌رود.
      بنابراین طراحان سیستم باید این نكته مهم را مد نظر داشته باشند كه همه ورودی‌های كاربران نامطمئن تلقی می شوند مگر آن كه از امن بودن آنها اطمینان حاصل شود. هكرها می‌دانند كه برنامه ها چگونه از ورودی‌ها استفاده می‌كنند و چگونه می‌توان از آنها برای سوء استفاده از نقاط آسیب پذیر سیستم بهره گرفت. بنابراین بهترین روش برای مقابله با این مشكل، تایید اعتبار همه ورودی‌های كاربران است. هرچند كه این فرایند باعث كاهش سرعت و كارآیی برنامه می‌شود، ولی برای حفظ امنیت سیستم اجتناب ناپذیر است.
      داده های نامطمئن از طرق مختلفی می‌توانند وارد سیستم شوند، كه از آن جمله می‌توان به موارد زیر اشاره نمود:

      • رشته‌های پرس و جوی URL
      • فرم‌های HTML
      • Cookie ها
      • پرس‌ و جوهای پایگاه داده

      پرس و جوهایی كه بر روی یك پایگاه داده انجام میشود، اساس حملات تزریق SQL را تشكیل میدهد.

      تزریق SQL چیست؟

      آسیب پذیریهای تزریق SQL به عنوان یكی از جدیترین تهدیدات برنامه های وب شناخته میشوند. آن دسته از برنامه های وب كه در مقابل تزریق SQL آسیب پذیر هستند، میتوانند به یك فرد مهاجم اجازه دهند كه به پایگاه داده زیرین این برنامه ها، دسترسی كامل پیدا كند. از آنجایی كه این پایگاههای داده معمولا حاوی اطلاعات حساس كاربران یا مشتریان هستند، تخلف از موارد امنیتی میتواند منجر به سرقت هویت، از دست رفتن اطلاعات محرمانه و كلاهبرداری گردد. در برخی موارد، مهاجمان حتی میتوانند با استفاده از یك آسیب پذیری تزریق SQL، كنترل سیستم میزبان برنامه وب را به دست گرفته و در كار آن اخلال ایجاد نمایند. آن دسته از برنامه های وب كه نسبت به حملات تزریق SQL آسیب پذیرند بسیار گسترده هستند. یك مطالعه كه توسط شركت امنیتی Gartner بر روی بیش از 300 وب سایت اینترنتی انجام شده است نشان میدهد كه اغلب آنها میتوانند در برابر حملات تزریق SQL آسیب پذیر باشند.
      تزریق SQL به دسته ای از حملات تزریق كد اطلاق میگردد كه در آن، داده های عرضه شده توسط كاربر به صورتی در یك «پرس و جوی» SQL قرار میگیرد كه بخشی از ورودی كاربر، به عنوان كد SQL در نظر گرفته میشود. با استفاده از این آسیب پذیریها، یك فرد مهاجم میتواند دستورات SQL را مستقیما وارد پایگاه داده نماید. این حملات، تهدیدی جدی علیه هر برنامه وب به شمار میروند كه داده هایی را از كاربران دریافت كرده و آن را در پرس و جوهای SQL قرار میدهد. اغلب برنامه های وب به همین روش كار میكنند و به همین دلیل، میتوانند در برابر تزریق SQL آسیب پذیر باشند.
      علت آسیب پذیریهای تزریق SQL بسیار ساده و قابل درك است: عدم تایید اعتبار ورودی كاربر. برای حل این مشكل، تولید كننده های برنامه های وب، یك مجموعه راهكارهای برنامه نویسی ارائه كرده اند كه وضعیت دفاعی كد برنامه وب را بهبود میبخشد. برای مثال میتوان به رمز كردن ورودی كاربر و تایید اعتبار اشاره كرد. اما از آنجایی كه به كار گرفتن این تكنیكها به فرد برنامه نویس بستگی دارد، این تكنیكها میتواند بسیار پر خطا باشد. از طرفی ترمیم كدی كه مستعد خطای تزریق SQL است، میتواند بسیار زمان بر و سخت باشد.

      در این مجموعه مقالات پس از معرفی شاخص های حملات تزریق SQL، به انواع این حمله و تكنیكهای مقابله با آن خواهیم پرداخت.

      شاخصهای حملات تزریق SQL

      ایده اولیه تزریق SQL این است كه یك فرد مهاجم داده های ارسال شده به یك برنامه وب را دستكاری میكند تا به این ترتیب، پرس و جوی در حال اجرا در پایگاه داده پشت برنامه را تغییر دهد. ممكن است این موضوع در نگاه اول بیضرر به نظر برسد، اما در حقیقت چنین كاری میتواند بینهایت مخرب باشد.
      یكی از جنبه های بسیار نگران كننده تزریق SQL آن است كه تمامی روشهای معمول پرس و جو توسط یك برنامه وب از یك پایگاه داده، تقریبا بدون تردید به یك نوع نقص امنیتی تزریق SQL منجر میگردد. مرتكب شدن خطایی كه باعث تزریق SQL شود، حتی اگر شما از آن خطا آگاه باشید، بسیار ساده است.
      مشكل دیگر برای رهایی از تزریق SQL این است كه اغلب راههای مبارزه با این حملات، خود نیز دارای نقص هستند و نمیتوانند مشكل را بطور كامل حل نمایند.
      یك حمله تزریق SQL زمانی اتفاق می افتد كه یك فرد مهاجم، تاثیر یك پرس و جوی SQL را با اضافه كردن كلمات كلیدی یا عملگرهای جدید SQL به آن پرس و جو، تغییر دهد. این تعریف غیر رسمی، تمامی انواع حملات تزریق SQL را در بر میگیرد. البته در مراجع مختلف، تعریفهای رسمی تری نیز برای حمله تزریق SQL وجود دارد. برای توصیف یك حمله SQL باید دو شاخصه مهم این حملات را تعریف كرد: مكانیزم تزریق و هدف حمله.


      1- مكانیزمهای تزریق

      دستورات خرابكار SQL میتوانند به روشهای مختلفی به یك برنامه آسیب پذیر معرفی گردند. در این بخش ما به معرفی چند مكانیزم معمول میپردازیم.

      تزریق از طریق ورودی كاربر

      در این حالت، مهاجمان دستورات SQL را با استفاده از ورودی كاربر تزریق میكنند. یك برنامه وب میتواند بسته به محیط به كار گیری برنامه، ورودی كاربر را به روشهای مختلف بخواند. در اغلب حملات تزریق SQL، ورودی كاربر از طریق یك فرم ورود اطلاعات دریافت میگردد. این فرم از طریق درخواستهای GET یا POST پروتكل HTTP به برنامه وب ارسال میگردد. برنامه های وب قادرند به ورودی كاربر موجود در این درخواستها دسترسی پیدا كنند.

      تزریق از طریق cookie ها

      Cookie ها فایلهایی هستند كه اطلاعات وضعیت تولید شده توسط برنامه های وب را در بر دارند و بر روی سیستم كاربر ذخیره میگردند. از آنجایی كه سیستم كاربر بر روی ذخیره این cookie ها كنترل دارد، یك كاربر خرابكار میتواند محتویات cookie ها را دستكاری نماید. اگر یك برنامه وب از محتویات cookie ها برای ساخت پرس و جوی SQL استفاده نماید، یك فرد مهاجم میتواند به سادگی با تغییر محتویات cookie ها، یك حمله را سازماندهی نماید.

      تزریق از طریق متغیرهای سرور

      متغیرهای سرور مجموعه ای از متغیرها هستند كه شامل هدرهای HTTP، هدرهای شبكه و متغیرهای محیطی هستند. برنامه های وب از این متغیرها برای كارهای مختلفی از جمله ثبت آمار استفاده میكنند. اگر این متغیرها بدون بررسی در یك پایگاه داده ثبت گردند، میتوانند یك آسیب پذیری تزریق SQL را ایجاد نمایند. از آنجاییكه مهاجمان قادرند مقادیری را كه در هدرهای HTTP و شبكه قرار دارند تغییر دهند، میتوانند با قرار دادن یك حمله تزریق SQL به طور مستقیم در هدرها، از این آسیب پذیری سوء استفاده كنند. زمانی كه این پرس و جو كه قرار است متغیر سرور را ثبت كند، به پایگاه داده ارسال میشود، حمله ای كه در هدر قرار گرفته است آغاز میشود.

      تزریق دو مرحله ای

      در تزریق دو مرحله ای، مهاجمان ورودیهای خرابكار را بر روی یك سیستم یا یك پایگاه داده قرار میدهند تا اگر در آینده این ورودی مورد استفاده قرار گرفت، بطور غیر مستقیم یك حمله تزریق SQL را فعال نمایند. هدف این نوع حملات تفاوت بسیاری با حملات معمول تزریق SQL دارد. تزریقهای دو مرحله ای با رسیدن ورودی خرابكار به پایگاه داده، باعث وقوع حمله نمیگردند. بلكه مهاجمان با تكیه بر دانسته های خود كه این ورودی در كجا مورد استفاده قرار خواهد گرفت، در زمان استفاده از ورودی حمله را آغاز میكنند.

      برای توضیح بهتر این حملات مثالی میزنیم:

      فرض كنید یك كاربر با استفاده از یك نام كاربری مانند admin’-- كه توسط خرابكاران روی سیستم قرار گرفته است، در یك وب سایت وارد شود. این برنامه نشانه ’ را پیش از ذخیره نام در پایگاه داده و برای جلوگیری از اعمال خرابكارانه، حذف میكند. حال فرض كنید كاربر كلمه عبور خود را تغییر دهد. این عملیات شامل دو مرحله است: 1) بررسی این موضوع كه كاربر كلمه عبور فعلی را میداند 2) در صورت موفقیت آمیز بودن مرحله اول، كلمه عبور تغییر نماید. برای انجام این كار، برنامه وب ممكن است یك دستور SQL را به صورت زیر بسازد:

      queryString=”UPDATE users SET password=’ ” + newPassword + “ ’ WHERE username=’ “ + username + “ ’ AND password=’ “ + oldPassword + “ ’ ”

      newPassword و oldPassword كلمات عبور جدید و قدیم هستند، username نیز نام كاربری (یعنی همان admin’-- ) میباشد. بنابراین این رشته پرس و جو كه به پایگاه داده ارسال شده به صورت زیر خواهد بود (فرض كنید كلمات عبور جدید و قدیم به ترتیت newpwd و oldpwd باشند):
      UPDATE users SET password=’newpwd’
      WHERE username= ‘admin’—’ AND password=’oldpwd’


      حال از آنجایی كه "—" یك عملگر SQL است كه به منظور نوشتن توضیحات به كار میرود و دستورات پس از آن پردازش نمیشوند، از تمامی دستورات پس از "—" توسط پایگاه داده صرفنظر میشود. بنابراین، نتیجه این پرس و جو این خواهد شد كه پایگاه داده بدون دانستن كلمه عبور قدیمی كاربر admin، كلمه عبور جدیدی مطابق میل مهاجم برای وی تعیین خواهد كرد.
      تشخیص و جلوگیری از حملات تزریق دو مرحله ای مشكل است، چرا كه نقطه تزریق با نقطه بروز حمله متفاوت است. ممكن است یك برنامه نویس وب ورودیها را به خوبی بررسی و چك نماید و تصور كند كه همه چیز امن است. اما بعدا و زمانی كه این داده ها در زمینه دیگری یا برای ساختن یك نوع پرس و جوی دیگر مورد استفاده قرار میگیرند، ورودیهای امن قبلی میتوانند باعث یك حمله تزریق گردند.

      2- هدف حمله
      یك حمله میتواند دارای یك یا چند هدف از مجموعه اهداف زیر باشد:

      newPassword و oldPassword كلمات عبور جدید و قدیم هستند، username نیز نام كاربری (یعنی همان admin’-- ) میباشد. بنابراین این رشته پرس و جو كه به پایگاه داده ارسال شده به صورت زیر خواهد بود (فرض كنید كلمات عبور جدید و قدیم به ترتیت newpwd و oldpwd باشند):
      • مشخص كردن آسیب پذیریهای برنامه وب یا پارامترهای قابل تزریق
      • مشخص كردن نوع و نسخه پایگاه داده مورد استفاده برنامه وب
      • به دست آوردن الگوی پایگاه داده مانند نام جداول، نام ستونها، و نوع داده ستونها
      • به دست آوردن داده های ارزشمند، حساس و مفید از پایگاه داده
      • اضافه كردن یا تغییر داده های پایگاه داده
      • از كار انداختن پایگاه داده یك برنامه وب از طریق انكار سرویس
      • جلوگیری از انجام عملیات تشخیص توسط مكانیزمهای محافظت از سیستم
      • عبور از مكانیزمهای تایید اعتبار كاربر
      • اجرای دستورات از راه دور
      • ارتقای مجوز كاربری مهاجم
      در بخش بعد به انواع حملات تزریق SQL خواهیم پرداخت.
كلیه حقوق سایت برای مركز مدیریت امداد و هماهنگی عملیات رخدادهای رایانه ای كشور محفوظ می باشد.
هر گونه استفاده از محتوای این پورتال بدون ذكر منبع ممنوع می باشد و پیگرد قانونی دارد