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

مقدمه
اغلب شرکتهایی که دسترسی به اینترنت را برای کارمندان خود فراهم می آورند، از نوعی فایروال استفاده میکنند. هدف از بکارگیری فایروال آن است که ترافیک ورودی و خروجی شبکه سازمان فیلتر گردد و به این ترتیب، استفاده از شبکه به کاربران معتبر و مقاصد مجاز محدود شود. اما فایروال در سطح آدرسهای IP و پورتهای شبکه کار میکند (در مدل OSI فایروالها در لایه های ۳، ۴، و ۵ شبکه کار میکنند) و در نتیجه یک فایروال جزئیات پروتکلهای لایه های بالاتر مانند HTTP را درک نمیکند.
دسته ای از حملات هستند که در لایه کاربرد (لایه ۷) مدل OSI عمل میکنند، و در نتیجه به راحتی میتوانند از فایروالها عبور نمایند. حملات تزریق SQL یکی از این حملات هستند.
بسیاری از برنامه های وب اطلاعاتی را از کاربر دریافت می‌کنند و سپس، نتایجی را تولید می‌کنند. به عنوان مثال برنامه ای یک فرم جستجوی ساده را در اختیار کاربر قرار می‌دهد که عبارت هدف جستجو در آن وارد شده و پس از پرس و جو از پایگاه داده، نتایجی تولید شده و برای کاربر نمایش داده می‌شود. این فرایند یک نمونه عملکرد بسیار رایج است که در بسیاری از برنامه های وب مشاهده می‌شود.
در صورتی که کاربری اهداف خراب‌کارانه داشته باشد، ممکن است بتواند با جستجو کردن یک عبارت، امنیت این برنامه وب را به خطر بیندازد. این خطر به میزانی جدی است که حتی اگر از زیرساخت امنیتی مستحکمی مانند یک فایروال مناسب استفاده شده باشد، ولی ورودی‌های کاربران مورد ارزیابی قرار نگیرد، تمام‌ تلاشی که برای ایجاد زیرساخت امنیتی به کار گرفته شده است به هدر می‌رود.
بنابراین طراحان سیستم باید این نکته مهم را مد نظر داشته باشند که همه ورودی‌های کاربران نامطمئن تلقی می شوند مگر آن که از امن بودن آنها اطمینان حاصل شود. هکرها می‌دانند که برنامه ها چگونه از ورودی‌ها استفاده می‌کنند و چگونه می‌توان از آنها برای سوء استفاده از نقاط آسیب پذیر سیستم بهره گرفت. بنابراین بهترین روش برای مقابله با این مشکل، تایید اعتبار همه ورودی‌های کاربران است. هرچند که این فرایند باعث کاهش سرعت و کارآیی برنامه می‌شود، ولی برای حفظ امنیت سیستم اجتناب ناپذیر است.
داده های نامطمئن از طرق مختلفی می‌توانند وارد سیستم شوند، که از آن جمله می‌توان به موارد زیر اشاره نمود:
رشته‌های پرس و جوی URL
فرم‌های HTML
Cookie ها
پرس‌ و جوهای پایگاه داده
پرس و جوهایی که بر روی یک پایگاه داده انجام میشود، اساس حملات تزریق SQL را تشکیل میدهد.

تزریق SQL چیست؟

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

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

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

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

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

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

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

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

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

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

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

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

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

فرض کنید یک کاربر با استفاده از یک نام کاربری مانند admin’– که توسط خرابکاران روی سیستم قرار گرفته است، در یک وب سایت وارد شود. این برنامه نشانه ’ را پیش از ذخیره نام در پایگاه داده و برای جلوگیری از اعمال خرابکارانه، حذف میکند. حال فرض کنید کاربر کلمه عبور خود را تغییر دهد. این عملیات شامل دو مرحله است: ۱) بررسی این موضوع که کاربر کلمه عبور فعلی را میداند ۲) در صورت موفقیت آمیز بودن مرحله اول، کلمه عبور تغییر نماید. برای انجام این کار، برنامه وب ممکن است یک دستور 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، کلمه عبور جدیدی مطابق میل مهاجم برای وی تعیین خواهد کرد.
تشخیص و جلوگیری از حملات تزریق دو مرحله ای مشکل است، چرا که نقطه تزریق با نقطه بروز حمله متفاوت است. ممکن است یک برنامه نویس وب ورودیها را به خوبی بررسی و چک نماید و تصور کند که همه چیز امن است. اما بعدا و زمانی که این داده ها در زمینه دیگری یا برای ساختن یک نوع پرس و جوی دیگر مورد استفاده قرار میگیرند، ورودیهای امن قبلی میتوانند باعث یک حمله تزریق گردند.

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

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *