تزريق SQL (چيستی، شاخص‌ها، و اهداف)

تزريق 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 خواهيم پرداخت.

برچسب‌ها