بخشی از مقاله
چکیده
حمله تزریق SQL یکی از شایعترین حملات برنامههای تحت وب برای نفوذ به پایگاهداده است و امکاناتی نظیر جعل هویت، دستکاری دادههای موجود، تخریب یا غیرقابلدسترس کردن دادهها را در اختیار نفوذگران قرار میدهد. در این مقاله، روش پرسوجوی تودرتو که یک روش مقابله با حملات تزریق SQL مرحله دوم است بررسی شده است . در نهایت یک روش پیشنهادی برای رمزنگاری ورودیهای کاربر برای تکمیل روش پرسوجوی تودرتو و جلوگیری از حملات مرحله اول ارائه گردیده است. عملکرد روش ترکیبی پیشنهادی با اعمال بر یک برنامه کاربردی تحت وب مورد بررسی قرار گرفت. نتایج به دست آمده از آزمون نشان دهنده قابلیت اطمینان و امنیت بالای سایت پیادهسازی شده در مقابل حملات تزریق و جلوگیری از حملات تزریق SQL شناخته شده مرحله اول و دوم است.
واژههای کلیدی:حملات تزریق SQL، روشهای مقابله، برنامههای کاربردی تحت وب، آسیبپذیری
-1 مقدمه
در حال حاضر استفاده از برنامههای کاربردی تحت وب رو به گسترش بوده جزئی از زندگی روزمره ما شدهاند؛ اما پایگاهداده به عنوان منبع اصلی یک وبسایت، دادههای مورد نیاز و اطلاعات حیاتی در آن ذخیره میشوند که حفاظت از آن در فضای مجازی کاری دشوار و بسیار مهم است.یکی از مهمترین آسیبپذیریهای برنامههای کاربردی تحت وب، حملات تزریق SQL است. این حملات میتواند از طریق ورودیهای کاربر، تزریق در کوکیها یا متغیرهای سرور صورت بگیرد. نتایج حاصل از این حملات بر روی محرمانگی، صحت و تصدیق اصالت پایگاه داده اثر میگذاردمهاجم را قادر به افشای کوکیها، افشای فایلها و دادههای محلی، اجرای برنامههای محلی و دریافت و اجرای هرگونه کد دلخواه میکند.
-1-1 تعریف
تزریق SQL، نوعی فن تزریق کد است که نقص امنیتی نرمافزار وبسایت را افشا میکند به این صورت که نفوذگر با یک سری دستورهای SQL عملیاتی را - متفاوت با عملیات عادی مورد نظر طراح وبسایت - در پایگاه داده وبسایت آسیبپذیر انجام میدهد.[1] در این حمله، فرمانهای SQL در ورودی دادههای کاربر به گونهای درج میشوند که ساختار فرمانهای از پیش تعریفشدهی SQL را تحت تأثیر قرار دهند. طبق آخرین گزارش انجمن OWASP، مهمترین خطر در امنیت برنامههای کاربردی در سال 2013، Injection است.[2]حملات تزریق زمانی رخ میدهد که برنامه، دادههایی را از کاربر دریافت کند و از آنها در ساخت جملات SQL استفاده نماید، بی آنکه دادهها را اعتبارسنجی و پاکسازی1 نماید. در واقع هدف از اینگونه حملات، دادههای ساکن در یک پایگاه داده است که از طریق Firewall محافظت میشوند. از این روش برای سرقت دادههای حساس، تغییر یا تخریب داده، اجرای دستورات Admin روی پایگاه داده و یا حتی در مواردی در اختیار گرفتن مکانیزم کل ماشین، استفاده میشود.
-2 انواع حملات تزریق SQL
انواع زیادی از حملهها در مقالات و اسناد معرفی شده است. علاوه بر آن هنوز هم حملههای جدیدی شناسایی و معرفی میشوند. بدیهی است که پرداختن به تمامی این حملهها ممکن نیست، در چند سال اخیر محققان در مقالههای خود3]و 4و 5و 6و 7و [8 به مهمترین و رایجترین این حملهها پرداختهاند. در این بخش به مرور مهمترین آنها میپردازیم.
-1-2 حمله درستنماها
روش کلی آن، تزریق کد در یک یا چند جمله شرطی است به طوری که آن عبارتها همیشه درست ارزیابی شوند. نتایج این حمله به نحوهی استفادهی نتایج یک پرسوجو در یک برنامه بستگی دارد. رایجترین کاربرد آن دور زدن صفحات هویتسنجی و استخراج داده است. در این نوع تزریق، مهاجم از یک فیلد قابل تزریق که در قسمت شرطی یک پرسوجو هست سوءاستفاده میکند. به قسمت شرطی دستور، کدهایی اضافه میشود و بیشتر به منظور فرار از احراز هویت و استخراج دادهها از پایگاه داده است.یک مهاجم میتواند عبارت DEFGʼRU 1 1 را به جای نام کاربری در ورودی وارد کند. با وارد شدن این عبارت، پرسوجو به شکل زیر در میآید:در این دستور 'abcd' به جای رشته نام کاربری قرار گرفته و پس از آن یک عبارت همیشه درست وارد شده است و باعث توضیحی شدن مابقی دستور میگردد. در این صورت با اجرا شدن دستور فوق تمام رکوردهای جدول کاربر به عنوان پاسخ برگردانده میشوند. نتیجه اینگونه حملهها در همان لحظه قابل مشاهده است.
-2-2 حمله پرسوجوهای منطقاً نادرست/ نامشروع
این حمله به مهاجم اجازه میدهد که اطلاعات مهمی را دربارهی نوع و ساختار پایگاه دادههایی که پشت برنامهها قرارگرفتهاند به دست آورد. این حمله مقدمه جمعآوری اطلاعات برای حملههای دیگر است. پیامهای خطای تولیدشده توسط برنامه، اغلب پارامترهای قابل تزریق و آسیبپذیر را برای یک حمله فراهم میکند. در این نوع حملهها سعی میشود که با واردکردن عباراتی نادرست از طریق پیام خطایی که سیستم میدهد، اطلاعاتی در مورد وضعیت پایگاه داده به دست آورد.
-3-2 حمله پرسوجوی اجتماع
یک مهاجم از پارامتری آسیبپذیر برای تغییر یک مجموعه داده، که برای یک پرسوجوی داده شده است، سوءاستفاده میکند. با این فن، یک مهاجم میتواند یک برنامه را فریب دهد تا اطلاعاتی را از یک جدول دیگر برگرداند. مهاجمان این کار را با تزریق یک جمله به نحو زیر انجام میدهند:به منظور تغییر رکوردهای برگشتی از پایگاه داده، برای فرار از احراز هویت و یا استخراج داده، مورد استفاده قرار میگیرد.
-4-2 حمله پرسوجوهای سواری مجانی
در این نوع حمله، مهاجم تلاش میکند که پرسوجوی اضافی را در پرسوجوی اصلی تزریق کند در این نوع حمله مهاجم تلاش نمیکند که پرسوجوی اصلی را تغییر دهد، به جای آن، تلاش میکند تا پرسوجوهای متمایز و جدیدی که بر روی پرسوجوی اصلی سوار میشوند را ایجاد کند. این نوع حمله بسیار خطرناک است. آسیبپذیری این نوع حمله اغلبوابسته به پیکربندی پایگاهداده است که اجازه میدهد در یک رشتهی تنها، چندین جمله قرار گیرد. در این روش، پرسوجوهای دیگری به پرسوجوی اصلی با هدف منع سرویس، تغییر داده، استخراج داده و یا اجرای دستورات از راه دور اضافه میشوند.
-5-2 حمله روالهای ذخیرهشده
این نوع حمله تلاش میکند که روال ذخیرهشده ارائه شده در پایگاه داده را اجرا کند. اینگونه حملهها شبیه به حملههای قبلی هستند با این تفاوت که یکی از روالهای استاندارد پایگاه داده به بخشی از پرسوجو اضافه میشود. برای مثال استفاده از روال SHUTDOWN در فیلد :passبا اجرای این دستور پایگاه داده خاموش میشود و باعث قطع سرویسدهی میشود.
-6-2 حمله استنتاج
در این حمله، پرسوجو به گونهای تغییر میکند که به فرم یک عملی که مبتنی بر پاسخهای True/Falseدربارهی مقادیر داده در پایگاه داده است، اجرا شود. زمانی که برنامه به گونهای نوشته شده است که هیچ پیام خطایی برای مهاجم فراهم نشود، مهاجم باید از روش متفاوتی پاسخ را از پایگاه داده به دست آورد. در این موقعیت، مهاجم دستوری را در سایت تزریق میکند و مشاهده میکند که پاسخ یک وبسایت چگونه تغییر میکند. با دقت زیاد توجه میکند که چه زمانی سایت رفتار یکسانی را از خود نشان میدهد و چه زمانی متفاوت عمل میکند. مهاجم تنها به این بسنده نمیکند که آیا پارامتر خاصی آسیبپذیر هست یا نه، بلکه اطلاعات اضافی دربارهی مقادیر در پایگاه داده هم به دست میآورد. این حمله خود بر دو فن استوار است. آنها به یک مهاجم اجازه میدهند که اطلاعات را از پایگاه داده استخراج کرده و پارامترهای آسیبپذیر را کشف کند.
-1-6-2 تزریق کور
در این فن، با بررسی رفتار صفحه با پاسخ سرور به سؤالات True/False، اطلاعات استنتاج میشود. اگر یک جملهی تزریقشدهTrue ارزیابی شود، سایت تابع را به صورت نرمال ادامه میدهد. در غیر این صورت، اگرچه پیام خطای توصیفیای نمایش داده نمیشود، اما صفحه به صورت نرمال عمل نمیکند.
-2-6-2 حمله زمانبندی
این حمله به مهاجمان اجازه میدهد که اطلاعاتی را از پایگاه داده با مشاهدهی تأخیرهای زمانی در پاسخ پایگاه داده به دست آورند. این حمله بسیار شبیه به تزریق کور است اما روش متفاوتی را در استنتاج استفاده میکند. برای اجرای این حمله، مهاجمان پرسوجوهای تزریقشده را به فرم If/Then ایجاد میکنند.
-7-2 رمزگذاریهای جایگزین
در این حمله، متن به گونهای تزریق شده است که از شناسایی شدن توسط روشهای کُدگذاری دفاعی و همچنین تعدادی از فنهای جلوگیری خودکار دوری کند. این حمله برای ترکیب با حملهها دیگر مورد استفاده قرار میگیرد؛ به عبارت دیگر، Alternate Encodings روش منحصر به فردی برای حمله به یک برنامهی کاربردی فراهم نمیکند؛ این روش به مهاجم کمک میکند که بتوانیم به سادگی تمام ابزارها و فنهای جلوگیری از نفوذ را دور زده و از آسیبپذیریها سوءاستفاده کنیم. به طور مثال وارد کردن عبارت زیر در فیلد login را در نظر بگیرید:ساختار دستور به شکل زیر درخواهد آمد که منجر به خاموش شدن پایگاه داده میشود.
-3 کارهای مرتبط
از سال 1998 که برای اولین بار آسیبپذیری تزریق SQL معرفی شد تا کنون پژوهشهای زیادی به منظور مقابله با حملات تزریق SQL انجام شده است. به طور کلی تمرکز این پژوهشها بر روی ورودیهای کاربر یا ساختار پرسوجوها بوده است.ایجاد لیستهای سفید و سیاه برای ورودیهای کاربر و تغییر کاراکترهای با معنی همچون - ʽ - در پرسوجوها از جمله روشهای استفاده شده در پژوهشهای متمرکز بر روی ورودی کاربر است. نگهداری ساختار پرسوجو بدون پارامترهای ورودی و مقایسه آن با ساختار ایجاد شده در زمان اجرا پس از ورود دادههای کاربر یا نگهداری پرسوجوهای معتبر، مبنای پژوهشهای ساختار محور است. در ادامه به معرفی چند مورد از این پژوهشها میپردازیم.
در سال 2003، Huang و colleaguesیک روش جعبه سیاه برای آزمون برنامههای وب در مورد آسیبپذیریهای تزریق SQL ارائه کردهاند.[9]در سال 2004، Huang و همکارانش یک روش جدید پیشنهاد کردند که این روش از تجزیه و تحلیل ایستا برای بررسی جریان مشکوک در مقابل پیششرط برای توابع حساس استفاده میکند.[10] همچنین، Gould و همکارانش طی دو مقاله به معرفی بررسیکننده JDBC پرداختند که یک بررسیکننده کد استاتیک است و فنی است که نوع تصحیح پرسوجوهای SQL تولیدشده به صورت پویا را به شکل ایستا بررسی میکند11]و .[12 همین طور، Boyd و Keromytisروشی به نام SQLrand پیشنهاد کردند که با استفاده از دستورالعمل تصادفی به جای کلمات کلیدی SQL و تبدیل آنها در پایگاه داده توسط Proxy Filter، به کلمات کلیدی SQL، به شناسایی و جلوگیری از حملات تزریق SQL میپردازد.[13]
در سال 2005، Martin و همکارانش یک ابزار به نام SecuriFly برای جاوا پیادهسازی کردند که جهت بررسی جریان دادهها به برنامه کاربردی وپاکسازی ورودیهای قبل از آسیب دیدن سیستم توسط حملهها، مورد استفاده قرار میگیرد.[14] همچنین، Halfond و Orso در دو مقاله روشی به نام AMNESIA که یک فن مبتنی بر مدل است و تحلیل ایستا و نظارت زمان اجرا را ترکیب میکند را پیشنهاد کردند15]و .[16 Buehrer و همکارانش روشی مبتنی بر درخت تجزیه جهت مقایسه ساختار عبارت در زمان اجرا با ساختار اصلی آن برای شناسایی حمله تزریق SQL پیشنهاد کردند.[17]در سال 2006، Su و Wassermann یک روش SQLCheck که پرسوجوها را در زمان اجرا مشاهده کرده و تطابق آنها را با یک مدل از پرسوجوهای مورد انتظار بررسی مینمایند، ارائه کردند.[18] همچنین، Shin و همکارانش یک ابزار مبتنی بر تحلیل ایستا به نام SQLUnitGen برای تست خودکار برای شناسایی آسیبپذیریهای دستکاری ورودی ارائه کردند.[19]
در سال 2007، FU و همکارانش روشی جهت تشخیص آسیبپذیریها در زمان کامپایل به نام SAFELI ارائه کردند. روشی جهت تشخیص آسیبپذیریهای شناختهنشده توسط جعبه سیاه است.[20] همین طور، Cova و Balzarottiروشی به نام Swaddler پیشنهاد کردند. این یک روش تشخیص مبتنی بر خطا جهت تشخیص حملهها روی کاربردهای وب است و با پیدا کردن رابطهای بین نقاط اجرایی حیاتی کاربرد و وضعیت داخلی برنامه کاربردی حمله را تشخیص میدهد.[21]در سال 2008 ، Roichman و Gudes روشی به نام DIWeDa که یک سیستم تشخیص نفوذ در پایگاهداده است را پیشنهاد کردند.[22]در سال 2009، Thomas و همکارانش یک الگوریتم تولید عبارات آماده اتوماتیک برای حذف آسیبپذیریهای تزریق SQL ارائه کردند23]و .[24 همچنین، Amirtahmasebi و همکارانش یک مکانیزم ترکیبی از تحلیل ایستا و تحلیل زمان اجرا برای محافظت بیشتر از رویههای ذخیرهشده SQL پیشنهاد کردند. تحلیل ایستا برای شناسایی دستورات توسط پارسر رویه ذخیرهشده و تحلیل زمان اجرا برای شناسایی ورودی با استفاده از SQLChecker انجام میشود.[25]
در سال 2010، Ruse و همکارانش یک تکنیک که از تولیدکننده موارد آزمون خودکار برای شناسایی آسیبپذیریهای تزریق SQL استفاده میکند، پیشنهاد کردند . ایده اصلی پشت آن، مبتنی بر ایجاد یک مدل برای برخورد خودکار با پرسوجو استBishtet .[26] و همکارانش CANDID را پیشنهاد کردند. یک روش ارزیابی کاندید پویا برای پیشگیری خودکار حملههای تزریق SQL است. این چارچوب به صورت پویا ساختار پرسوجو را از هر موقعیت پرسوجوی SQL که توسط توسعهدهنده - برنامهنویس - در نظر گرفته شده است، استخراج میکند. از این رو، مسئله اصلاح دستی برنامه برای ایجاد عبارات آماده را حل میکند.[27]در سال 2012، Lee و همکارانش یک روش ترکیبی از تحلیل ایستا و پویا پیشنهاد کردهاند. این روش مقدار یک مشخصه پرسوجوی SQL را وقتی پارامترهای ارسال میشوند، حذف میکند و آن را با یکی که از قبل