IRCAR201005062
در اين بخش، ما انواع روشهاي شناخته شده حملات تزريق SQL را بيان و تشريح خواهيم كرد. براي هر نوع حمله، يك نام، يك يا چند هدف حمله، يك توصيف از حمله، و يك مثال بيان خواهند شد.
انواع مختلف حملات بسته به اهداف مهاجم، گاهي با هم و گاهي به صورت متوالي و پشت سر هم نيز مورد استفاده قرار ميگيرند. همچنين بايد به اين نكته نيز توجه كرد كه نسخه هاي متعددي از هر نوع حمله نيز وجود دارد.
Tautology
هدف حمله:
عبور از مكانيزمهاي تاييد اعتبار كاربر، مشخص كردن آسيب پذيريهاي برنامه وب يا پارامترهاي قابل تزريق، به دست آوردن داده هاي ارزشمند، حساس و مفيد از پايگاه داده.
توصيف:
هدف معمول يك حمله مبتني بر tautology اين است كه كدي را به يك يا چند جمله شرطي تزريق نمايد، به صورتي كه آن شرطها همواره صحيح باشند. نتيجه اين حمله به اين بستگي دارد كه نتيجه پرس و جوها چگونه در برنامه مورد استفاده قرار گيرد. موارد استفاده معمول اين حملات در عبور از صفحات تاييد اعتبار و به دست آوردن داده است. در اين نوع تزريق، يك فرد مهاجم از يك فيلد قابل تزريق كه در يك پرس و جوي شرطي WHERE مورد استفاده قرار ميگيرد، سوء استفاده ميكند. تبديل جمله شرطي به يك tautology باعث ميشود كه تمامي سطرهاي جدول پايگاه داده كه هدف پرس و جو بوده اند، به عنوان نتيجه باز گردانده شوند. در كل براي اينكه يك حمله مبتني بر tautology بتواند كار كند، يك فرد مهاجم نه تنها بايد پارامترهاي قابل تزريق يا آسيب پذير را در نظر بگيرد، بلكه ساختارهاي كدگذاري كه نتايج پرس و جو را ارزيابي ميكنند نيز بايد در نظر گرفته شوند. نوعا اين حمله زماني موفقيت آميز خواهد بود كه كد تمامي ركوردهاي برگردانده شده را نمايش دهد يا اينكه اگر حداقل يك ركورد برگردانده شده است، برخي عمليات را بر روي آن انجام دهد.
مثال:
در اين مثال حمله، يك فرد مهاجم ‘ or 1=1 - - را براي فيلد ورودي login ثبت مينمايد (ورودي ثبت شده براي ساير فيلدها نامربوط است). پرس و جوي نتيجه اين است:
SELECT accounts FROM users WHERE Login=’ ’ or 1=1 - - AND pass=’ ’ AND pin=
كد تزريق شده به جمله شرطي (OR 1=1) كل عبارت WHERE را به يك tautology تبديل ميكند. اين پايگاه داده از اين جمله شرطي به عنوان مبناي ارزيابي هر سطر و تصميم گيري در مورد اينكه كداميك به برنامه برگردانده شوند استفاده ميكند. از آنجاييكه جمله شرطي يك tautology است، اين پرس و جو به ازاي هر سطر از جدول مقدار صحيح برميگرداند و تمامي آنها را برميگرداند. در مثال ما، مجموعه بازگردانده شده به يك مقدار غير NULL ارزيابي ميشود، كه باعث ميشود برنامه اينطور نتيجه گيري كند كه تاييد هويت كاربر موفقيت آميز بوده است. بنابراين اين برنامه متد displayAccounts( ) را فراخواني كرده و تمامي حسابهاي كاربري مجموعه بازگردانده شده توسط پايگاه داده را نمايش ميدهد.
پرس و جوهاي نادرست غير مجاز/غير منطقي
هدف حمله:
مشخص كردن آسيب پذيريهاي برنامه وب يا پارامترهاي قابل تزريق، مشخص كردن نوع و نسخه پايگاه داده مورد استفاده برنامه وب، به دست آوردن داده هاي ارزشمند، حساس و مفيد از پايگاه داده.
توصيف:
اين حمله به فرد مهاجم اجازه ميدهد كه اطلاعات مهمي راجع به نوع و ساختار پايگاه داده موجود در پشت يك برنامه وب به دست آورد. اين حمله يك گام ابتدايي جمع آوري اطلاعات براي ساير حملات به شمار ميرود. آسيب پذيري مورد استفاده در اين حمله اين است كه صفحه خطاي بازگردانده شده توسط سرورهاي برنامه، اغلب توصيفي است. در حقيقت، اين واقعيت كه يك پيغام خطاي ساده توليد شده است، اغلب ميتواند پارامترهاي آسيب پذير و قابل تزريق را براي يك فرد مهاجم آشكار نمايد. ساير اطلاعات خطا، كه معمولا براي كمك به برنامه نويسان براي اشكال زدايي برنامه هايشان به كار ميرود، به مهاجمان كمك ميكند كه اطلاعاتي راجع به الگو و مدل پايگاه داده به دست آورند. فرد مهاجم در زمان انجام اين حمله سعي ميكند دستوراتي را كه باعث يك خطاي دستوري، تبديل نوع، و يا منطقي ميشوند به پايگاه داده تزريق نمايد. خطاهاي دستوري ميتوانند براي معرفي پارامترهاي قابل تزريق به كار روند. خطاهاي نوع ميتوانند براي به دست آوردن نوع داده هاي ستونهاي خاص يا به دست آوردن خود داده ها مورد استفاده قرار گيرند. خطاهاي منطقي اغلب نام جداول و ستونهايي را كه باعث خطا شده اند به دست مي آورند.
مثال:
هدف اين حمله در اين مثال اين است كه يك خطاي تبديل نوع ايجاد نمايد كه ميتواند داده هاي مرتبط را افشا نمايد. براي انجام اين كار، فرد مهاجم متن زير را به فيلد ورودي pin تزريق ميكند:
“convert(int,(select top 1 name from sysobjects where xtype=’u’))”
پرس و جوي نتيجه به اين شكل خواهد بود:
SELECT accounts FROM users WHERE login=’ ’ AND Pass=’ ’ AND pin= convert (int, (select top 1 name from sysobjects where xtype=’u’))
در رشته حمله، پرس و جوي تزريق شده تلاش ميكند كه اولين جدول كاربر (xtype=’u’) را از جدول ابرداده هاي پايگاه داده بيرون بكشد (فرض كنيد كه اين برنامه از Microsoft SQL Server استفاده ميكند كه جدول ابرداده در آن sysobjects ناميده ميشود). آنگاه اين پرس و جو سعي ميكند نام اين جدول را به يك عدد صحيح تغيير دهد. از آنجاييكه اين يك تبديل نوع مجاز نيست، پايگاه داده يك پيغام خطا توليد ميكند. در Microsoft SQL Server اين پيغام خطا چنين خواهد بود:
“Microsoft OLE DB Provider for SQL Server (0x80040E07) Error converting nvarchar value ‘CreditCards’ to a column of data type int”.
اطلاعات مفيدي كه در اين پيغام خطا براي فرد مهاجم وجود دارد دو دسته است. اول اينكه فرد مهاجم ميتواند ببيند كه پايگاه داده از نوع SQL Server است. دوم اينكه اين پيغام خطا، مقدار رشته اي كه باعث خطاي تبديل نوع شده است را افشا ميكند. در اين حالت، اين مقدار نام اولين جدول تعريف شده توسط كاربر در پايگاه داده نيز هست: «CreditCards». يك استراتژي مشابه ميتواند براي استخراج سيستماتيك نام و نوع هر ستون پايگاه داده نيز به كار رود. با استفاده از اين اطلاعات درباره مدل پايگاه داده، يك فرد مهاجم ميتواند حملات بعدي را كه اطلاعات خاصي را هدف قرار ميدهند آغاز نمايد.
پرس و جوي Union
پرس و جوي نتيجه به اين شكل خواهد بود:
هدف حمله:
عبور از مكانيزمهاي تاييد اعتبار كاربر، به دست آوردن داده هاي ارزشمند، حساس و مفيد از پايگاه داده
توصيف:
در حملات پرس و جوي Union، يك فرد مهاجم با سوء استفاده از يك پارامتر آسيب پذير، مجموعه داده هاي بازگردانده شده براي يك پرس و جو را تغيير ميدهد. با اين تكنيك، يك فرد مهاجم ميتواند برنامه را فريب داده و داده ها را از جدولي غير از جدول مورد نظر طراح پايگاه داده برگرداند. مهاجمان اين كار را با تزريق يك دستور به شكل UNION SELECT <rest of injected query> انجام ميدهند. از آنجاييكه مهاجمان به طور كامل دومين پرس و جوي تزريق شده را كنترل ميكنند، ميتوانند از اين پرس و جو براي بازيابي اطلاعات از يك جدول خاص استفاده نمايند. نتيجه اين حمله اين است كه پايگاه داده، مجموعه داده اي را برميگرداند كه اشتراك نتايج پرس و جوي اصلي و نتايج پرس و جوي تزريق شده است.
مثال:
يك فرد مهاجم ميتواند متن
“UNION SELECT cardNO from CreditCards where acctNO=10032 - -“
را به فيلد login تزريق نمايد كه پرس و جوي زير را توليد ميكند:
SELECT accounts FROM users WHERE login=’ ’ UNION SELECT cardNO from CreditCards where acctNO=10032 - - AND pass=’ ’ AND pin=
با فرض اينكه هيچ لاگيني مترادف با “ “ نيست، پرس و جوي اصلي مجموعه null برميگرداند، در حاليكه پرس و جوي تزريق شده، داده هاي جدول CreditCards را برميگرداند. در اين حالت، اين پايگاه داده ستون «cardNo» را براي حساب «10032» برميگرداند. اين پايگاه داده ها نتايج اين دو پرس و جو را ميگيرد، اشتراك آنها را به دست مي آورد، و آنها را به برنامه باز ميگرداند. در بسياري از برنامه ها، تاثير اين عمليات اين است كه مقدار «cardNo» همراه با اطلاعات حساب كاربري نمايش داده ميشود.
پردازه هاي ذخيره شده
را به فيلد login تزريق نمايد كه پرس و جوي زير را توليد ميكند:
هدف حمله:
عبور از مكانيزمهاي تاييد اعتبار كاربر، به دست آوردن داده هاي ارزشمند، حساس و مفيد از پايگاه داده
توصيف:
اين نوع حملات تزريق SQL سعي ميكنند روالهاي ذخيره شده موجود در پايگاه داده را اجرا نمايند. امروزه اغلب توليد كنندگان پايگاههاي داده، محصولات خود را با يك مجموعه روال استاندارد كه بر روي آن ذخيره شده است به فروش ميرسانند. اين روالها كارآيي پايگاه داده را افزايش ميدهند و امكان تعامل با سيستم عامل را ايجاد مينمايند. بنابراين زماني كه يك فرد مهاجم تشخيص ميدهد كه چه نوع پايگاه داده اي مورد استفاده قرار گرفته است، حملات تزريق SQL ميتوانند طوري طراحي شوند كه روالهاي ذخيره شده در آن پايگاه داده خاص، از جمله روالهايي كه به تعامل با سيستم عامل ميپردازند را اجرا نمايند.
اين يك تصور غلط و رايج است كه استفاده از روالهاي ذخيره شده براي نوشتن برنامه هاي وب، آنها را در برابر حملات تزريق SQL آسيب ناپذير ميسازد. برنامه نويسان اغلب از مشاهده اينكه روالهاي ذخيره شده آنها به اندازه برنامه هاي عادي نسبت به حملات آسيب پذير است متعجب ميشوند. به علاوه، از آنجاييكه روالهاي ذخيره شده معمولا به زبانهاي اسكريپت نويسي خاص نوشته ميشوند، ميتوانند شامل انواع ديگري از آسيب پذيريها مانند سرريز بافر باشند كه به مهاجمان اجازه ميدهند كد دلخواه خود را بر روي سرور اجرا كرده و يا اولويت خود را افزايش دهند.
مثال:
روال ذخيره شده براي چك كردن اعتبارات:
CREATE PROCEDURE DBO. isAuthenticated @userName varchar2, @pass varchar2, @pin int AS EXEC(“SELECT accounts FROM users WHERE login=’ “ +@userName+ “ ’ and pass=’ “ +@password+ “ ’ and pin=” +@pin); GO
اين مثال نشان ميدهد كه چگونه يك روال ذخيره شده پارامتري ميتواند توسط يك حمله تزريق SQL مورد سوء استفاده قرار گيرد. در اين مثال، ما فرض ميكنيم كه رشته پرس و جوي ساخته شده در خطوط 5، 6 و 7 مثال ما، توسط يك فراخواني به روال ذخيره شده فوق جايگزين ميگردد. اين روال ذخيره شده يك مقدار True/False را برميگرداند كه نشان ميدهد آيا اعتبار كاربر به درستي تاييد شده است يا خير. براي راه اندازي يك حمله تزريق SQL، اين مهاجم به سادگي “ ‘ ; SHUTDOWN;--“ را به فيلدهاي username يا password تزريق ميكند. اين تزريق باعث ميشود كه روال ذخيره شده پرس و جوي زير را توليد نمايد:
SELECT accounts FROM users WHERE login=’doe’ AND pass=’ ’; SHUTDWON; -- AND pin=
در اينجا، اولين پرس و جو به صورت عادي اجرا ميگردد، و سپس دومين پرس و جوي خرابكار اجرا ميشود، كه باعث خاموش شدن پايگاه داده میگردد.
استنتاج
هدف حمله:
مشخص كردن آسيب پذيريهاي برنامه وب يا پارامترهاي قابل تزريق، به دست آوردن داده هاي ارزشمند، حساس و مفيد از پايگاه داده، به دست آوردن الگوي پايگاه داده مانند نام جداول، نام ستونها، و نوع داده ستونها
توصيف:
در اين حمله، پرس و جو طوري تغيير ميكند كه به شكل يك كنش كه بر اساس پاسخ به يك سوال True/Flase درباره ارزشهاي داده ها در پايگاه داده اجرا ميشود، درآيد. در اين نوع تزريق، مهاجمان معمولا سعي ميكنند كه به يك سايت كه به اندازه كافي امن شده است حمله نمايند، بنابراين زماني كه تزريق موفق اتفاق مي افتد، هيچ فيدبك قابل استفاده اي از طريق پيغامهاي خطاي پايگاه داده وجود ندارد. از آنجاييكه پيغامهاي خطاي پايگاه داده فيدبكي در اختيار مهاجم قرار نميدهد، مهاجمان بايد از يك روش متفاوت براي به دست آوردن جواب از پايگاه داده استفاده كنند. در اين شرايط، فرد مهاجم دستورات را به سايت تزريق ميكند و سپس مشاهده ميكند كه چگونه تابع/پاسخ وب سايت تغيير ميكند. با توجه به اينكه سايت چه زماني مانند هميشه و به حالت عادي و چه زماني به صورتي متفاوت رفتار ميكند، يك فرد مهاجم ميتواند نتيجه بگيرد كه كه كدام پارامترها آسيب پذير هستند و نيز ميتواند اطلاعات ديگري راجع به مقادير موجود در پايگاه داده به دست آورد. دو تكنيك حمله شناخته شده مبتني بر استنتاج وجود دارند. اين دو تكنيك به فرد مهاجم اجازه ميدهند كه داده ها را از يك پايگاه داده به دست آورده و پارامترهاي آسيب پذير را شناسايي نمايد. محققان گزارش كرده اند كه با استفاده از اين تكنيكها، توانسته اند با سرعتي معادل 1 B/s داده ها را استخراج نمايند.
تزريق كور:
در اين تكنيك، اطلاعات بايد از رفتار صفحه و با پرسيدن سوالاتي با پاسخهاي True/Flase از سرور استنتاج گردد. اگر دستور تزريق شده صحيح ارزيابي گردد، سايت به فعاليت خود به صورت عادي ادامه ميدهد. اما اگر اين دستور غلط ارزيابي گردد، با اينكه هيچ پيغام خطايي نمايش داده نميشود، ولي صفحه با وضعيت عادي بسيار تفاوت دارد.
حملات زمان بندي:
يك حمله زمان بندي به فرد مهاجم اجازه ميدهد كه با مشاهده تاخيرات زماني در پاسخهاي پايگاه داده، اطلاعات را از اين پايگاه داده به دست آورد. اين حمله بسيار مشابه تزريق كور است، ولي از يك متد استنتاج متفاوت استفاده ميكند. براي انجام يك حمله زمان بندي، مهاجمان پرس و جوي تزريق شده خود را به شكل يك دستور if/then ميسازند كه گزاره شاخه هاي then در آن، به يك پارامتر ناشناخته درباره محتويات پايگاه داده مرتبط ميشود. مهاجم از يك ساختار SQL استفاده ميكند كه زمان مشخصي را براي اجرا نياز دارد (براي مثال كلمه كليدي WAITFOR كه باعث ميشود پايگاه داده به مدت زمان مشخصي پاسخ خود را به تاخير بيندازد). فرد مهاجم با اندازه گيري افزايش يا كاهش تاخير در پاسخ پايگاه داده، ميتواند نتيجه گيري كند كه كدام شاخه then در اين تزريق به كار گرفته شده و در نتيجه پاسخ پرس و جوي تزريق شده چيست.
مثال:
دو روش براي استفاده از حملات استنتاج وجود دارد. در روش اول، پارامترهاي قابل تزريق با استفاده از تزريق كور به دست مي آيند. دو تزريق ممكن را به فيلد login در نظر بگيريد. اولي “legalUser’ and 1=0 - -” و دومي “legalUser’ and 1=1 - -”. اين تزريقها به دو پرس و جوي زير منجر ميشوند:
SELECT accounts FROM users WHERE login=’legalUser’ and 1=0 - - ’ AND pass=’ ’ AND pin=0 SELECT accounts FROM users WHERE login=legalUser’ and 1=1 - - ’ AND pass=’ ’ AND pin=0
اكنون اجازه بدهيد دو سناريو را در نظر بگيريم. در اولين سناريو، ما يك برنامه امن داريم و ورودي login به صورت صحيح اعتبار سنجي شده است. در اين حالت، هر دو تزريق پيغامهاي خطاي login باز خواهند گرداند، و فرد مهاجم خواهد دانست كه پارامتر login آسيب پذير نيست. در سناريوي دوم، ما يك برنامه غير امن داريم و پارامتر login در برابر تزريق آسيب پذير است. فرد مهاجم تزريق نخست را انجام داده، و از آنجايي كه اين تزريق هميشه به صورت غلط ارزشيابي ميگردد، برنامه يك پيغام خطاي login بازميگرداند. در اين وضع، فرد مهاجم نميداند كه اين پيغام خطا به علت اعتبار سنجي صحيح ورودي و مسدود كردن حمله رخ داده است، يا اينكه خود حمله پيغام خطا را توليد كرده است. فرد مهاجم دومين پرس و جو را ثبت ميكند، كه هميشه به مقدار صحيح ارزيابي ميگردد. اگر در اين حالت هيچ پيغام خطاي ورودي وجود نداشته باشد، آنگاه فرد مهاجم نتيجه ميگيرد كه حمله انجام شده و پارامتر login نسبت به تزريق آسيب پذير است.
روش دوم حملات مبتني بر استنتاج براي به دست آوردن داده از پايگاه داده ها مناسب است. در اينجا ما با يك مثال، نشان ميدهيم كه چگونه از حملات زمان بندي براي به دست آوردن نام يك جدول پايگاه داده استفاده ميكنيم. در اين حمله، دستور زير به پارامتر login تزريق ميشود:
‘ ‘legalUser’ and ASCII (SUBSTRING((select top 1 name from sysobjects),1,1)) > X WAITFOR 5 - -’ ’.
اين تزريق، پرس و جوي زير را توليد ميكند:
SELECT accounts FROM users WHERE login=’legalUser’ and ASCII (SUBSTRING((select top 1 name from sysobjects),1,1)) > X WAITFOR 5 - - ’ AND pass=’ ’ AND pin=0 AND pin=0
در اين حمله، تابع SUBSTRING براي به دست آوردن اولين كاراكتر نام اولين جدول استفاده ميشود. سپس با استفاده از استراتژي جستجوي دودويي، فرد مهاجم ميتواند مجموعه اي از پرس و جوها را در مورد اين كاراكتر انجام دهد. در اين مثال، فرد مهاجم اين پرس و جو را ايجاد ميكند كه آيا كد اسكي كاراكتر مورد نظر، بزرگتر، كوچكتر، يا مساوي مقدار X است. اگر مقدار مورد نظر بزرگتر باشد، فرد مهاجم آن را با 5 ثانيه تاخير اضافه شده به پاسخ پايگاه داده متوجه خواهد شد. سپس فرد مهاجم ميتواند با استفاده از يك جستجوي دودويي با تغيير مقدار X، مقدار آن كاراكتر را پيدا نمايد.
- 31