IRCAR201006066
محققان انواع زيادي از تكنيكها را براي حل مساله تزريق SQL ارائه كرده اند. اين تكنيكها از روشهاي برنامه نويسي تا چارچوبهاي كاملا خودكار براي تشخيص و جلوگيري از حملات تزريق SQL را شامل ميشوند. در اين بخش ما به مطالعه اين تكنيكها خواهيم پرداخت و مزايا و معايب هر يك را بررسي خواهيم كرد.
كد نويسي دفاعي
علت اصلي آسيب پذيريهاي تزريق SQL، عدم اعتبار سنجي وروديهاست. بنابراين، راه حل اصلي براي حذف اين آسيب پذيريها، به كار گيري راهكارهاي برنامه نويسي مناسب و دفاعي است. در اينجا به تعدادي از اين راهكارها ميپردازيم:
بررسي نوع ورودي:
حملات تزريق SQL به وسيله تزريق دستورات به يك رشته يا يك پارامتر عددي انجام ميشوند. حتي بررسي ساده اين وروديها ميتواند از بسياري حملات جلوگيري نمايد. براي مثال، در حالتي كه ورودي از نوع عددي باشد، برنامه نويس ميتواند به سادگي هر ورودي را كه شامل كاراكتري به جز رقم باشد رد كند. بسياري از برنامه نويسان انجام اين نوع بررسيها را به صورت تصادفي از قلم مي اندازند. چرا كه ورودي كاربر صرفنظر از محتويات يا هدف آن، تقريبا هميشه به شكل يك رشته است.
رمزگذاري وروديها:
تزريق به يك پارامتر رشته اي اغلب از طريق استفاده از متاكاراكترها انجام ميشود. اين كاراكترها داراي معناي خاصي در زبان برنامه نويسي هستند و باعث ميشوند تجزيه گر SQL، ورودي كاربر را به عنوان مجوز (token) SQL در نظر بگيرد. در حاليكه جلوگيري از استفاده از اين متاكاراكترها ممكن است، انجام اين كار باعث ميشود كه كاربري كه قصد خرابكاري ندارد، در وارد كردن وروديهاي مجاز حاوي اين كاراكترها نيز دچار مشكل گردد. بنابراين راه حل بهتر اين است كه از توابعي استفاده نماييم كه يك رشته را به صورتي رمزگذاري ميكنند كه تمامي متاكاراكترها به طور خاص رمز شده و توسط پايگاه داده به عنوان كاركترهاي معمولي تفسير گردند.
Positive Pattern Matching:
برنامه نويسان بايد روتينهاي تاييد اعتبار ورودي را كه ورودي «خوب» را در مقابل ورودي «بد» تشخيص ميدهند و وروديهاي معتبر را شناسايي ميكنند، به كار گيرند. اين روش معمولا «تاييد اعتبار مثبت» ناميده ميشود. در مقابل، «تاييد اعتبار منفي» به دنبال وروديهايي منطبق بر الگوهاي ممنوع يا token هاي SQL ميگردد. برنامه نويسان قادر نيستند تمامي انواع حملاتي را كه عليه برنامه آنان انجام ميشود در نظر بگيرند، اما بايد قادر باشند تمامي انواع وروديهاي معتبر را مشخص كنند. بنابراين «تاييد اعتبار مثبت» روش امن تري براي بررسي وروديها است.
شناسايي تمامي منابع ورودي:
برنامه نويسان بايد تمامي وروديهاي برنامه خود را بررسي نمايند. منابع مختلفي براي وروديهاي يك برنامه وجود دارد. اگر اين وروديها براي ساختن يك پرس و جو مورد استفاده قرار گيرند، اين منابع ورودي ميتوانند راهي براي يك مهاجم باشند تا حمله تزريق SQL خود را مطرح كند. بنابراين تمامي منابع ورودي بايد بررسي گردند.
با اينكه كد نويسي دفاعي همچنان بهترين روش براي جلوگيري از آسيب پذيريهاي تزريق SQL است، اما اين برنامه ها در عمل همچنان مشكل دارند. كد نويسي دفاعي مستعد خطاهاي انساني است و به اندازه تكنيكهاي خودكار، كامل و بي نقص نيست. در حاليكه اغلب برنامه نويسان سعي ميكنند كد امني را بنويسند، اعمال كدهاي دفاعي به طور كامل و صحيح به تمامي منابع ورودي بسيار سخت است. در حقيقت، بسياري از آسيب پذيريهاي تزريق SQL كشف شده در برنامه هاي واقعي، به خاطر خطاي انساني رخ داده اند. يعني برنامه نويسان فراموش كرده اند بررسيهايي را انجام دهند و يا اينكه اعتبار سنجي ورودي را به اندازه كافي انجام نداده اند. به عبارت ديگر، در اين برنامه ها، برنامه نويسان سعي كرده اند حملات تزريق SQL را تشخيص داده و از آنها جلوگيري نمايند، اما موفق نشده اند آن را به طور كامل و دقيق انجام دهند. اين مثالها شواهد بيشتري از مشكلات مربوط به استفاده برنامه نويسان از كد نويسي دفاعي را ارائه ميدهد.
علاوه بر اين، روشهاي مبتني بر كد نويسي دفاعي توسط برخي توصيه هاي كدنويسي كه در ظاهر راهكارهاي جلوگيري از حمله هستند، تضعيف ميشوند. ما دو توصيه و راهكار معروف را كه در حقيقت مناسب نيستند، مورد بحث قرار ميدهيم. نخست، راهكارهايي هستند كه وروديهاي كاربر را در مورد كلمات كليدي SQL مانند FROM، WHERE، و SELECT، و نيز اپراتورهاي SQL مانند single quote يا اپراتور توضيحات بررسي ميكنند. توضيحي كه پشت اين راهكار وجود دارد اين است كه وجود چنين كلمات كليدي و اپراتورهايي ممكن است نشان دهنده تلاشي براي حمله تزريق SQL باشد. اين روش منجر به اين ميشود كه در موارد زيادي، به اشتباه تشخيص حمله تزريق SQL داده شود، در حاليكه در حقيقت حمله اي رخ نداده است. به عبارت ديگر نرخ false positive اين روش بالاست. چرا كه در بسياري از برنامه ها، كلمات كليدي SQL ميتوانند بخشي از ورودي متني معمولي باشند، و اپراتورهاي SQL ميتوانند براي نشان دادن فرمولها يا حتي اسامي به كار روند (مانند O’Brian). دومين راهكار نامناسب كه معمولا توصيه ميشود، اين است كه از پردازه هاي ذخيره شده يا دستورات آماده براي جلوگيري از حملات تزريق SQL استفاده شود. متاسفانه خود پردازه هاي ذخيره شده و دستورات آماده نيز ميتوانند در برابر حملات تزريق SQL آسيب پذير باشند. مگر اينكه برنامه نويسان به طور جدي راهكارهاي كد نويسي دفاعي را اعمال نمايند.
تكنيكهاي تشخيص و جلوگيري
محققان تكنيكها و ابزارهاي متنوعي را براي كمك به برنامه نويسان و جبران كمبودهاي كدنويسي دفاعي، ارائه كرده اند.
تست جعبه سياه:
«Waves»، يك تكنيك جعبه سياه براي تست برنامه هاي وب در مورد آسيب پذيريهاي تزريق SQL است. اين تكنيك با استفاده از يك Web crawler، تمامي نقاط يك برنامه وب را كه ميتواند براي تزريق SQL مورد استفاده قرار گيرد، معرفي ميكند. سپس بر اساس فهرستي از الگوها و تكنيكهاي حمله، حملاتي را كه اين نقاط را هدف قرار ميدهند طراحي ميكند. سپس Waves پاسخ برنامه را به اين حملات بررسي كرده و با استفاده از تكنيكهاي يادگيري ماشين، روش شناسي حمله خود را بهبود ميبخشد. اين تكنيك با استفاده از روشهاي يادگيري ماشين براي هدايت تست خود، بر اغلب تكنيكهاي تست نفوذ پيشي گرفته است. البته مانند اغلب تكنيكهاي جعبه سياه و تست نفوذ، اين روش نيز كامل نبوده و تضميني ارائه نميكند.
بررسي كننده هاي كد استاتيك:
JDBC-Checker، تكنيكي است كه نوع تصحيح پرس و جوهاي SQL توليد شده به صورت پويا را، به شكل استاتيك بررسي ميكند. اين تكنيك با هدف تشخيص و جلوگيري از حملات معمول SQL طراحي نشده است، ولي ميتواند براي جلوگيري از حملاتي كه از امتياز عدم تطابق انواع بهره ميگيرند، در يك رشته پرس و جويي كه به صورت پويا توليد شده است، مورد استفاده قرار گيرد. JDBC-Checker قادر است يكي از علتهاي اصلي آسيب پذيريهاي حملات تزريق SQL، يعني بررسي نامناسب نوع ورودي را تشخيص دهد. اما اين تكنيك قادر نيست انواع معمولتر حملات تزريق SQL را شناسايي نمايد، چرا كه اغلب اين حملات از پرس و جوهايي تشكيل شده اند كه از نظر نوع و قواعد دستوري صحيح هستند.
روش ديگري نيز ارائه شده است كه در آن، با استفاده از تحليل استاتيك تركيب شده با استدلال خودكار، بررسي ميشود كه پرس و جوهاي SQL توليد شده در لايه Application نميتوانند شامل يك tautology باشند. اشكال اوليه اين تكنيك اين است كه حوزه آن، به تشخيص و جلوگيري از tautology ها محدود است و نميتواند انواع ديگر حمله را تشخيص دهد.
تحليل تركيبي استاتيك و پويا
AMNESIA يك تكنيك مبتني بر مدل است كه تحليل استاتيك و نظارت زمان اجرا را تركيب ميكند. در فاز استاتيك اين تكنيك، از تحليل استاتيك براي ساختن مدلهايي از انواع مختلف پرس و جوهايي كه يك برنامه به طور طبيعي ميتواند در هر نقطه دسترسي به پايگاه داده توليد كند، استفاده ميشود. در فاز پويا، اين تكنيك تمامي پرس و جوها را پيش از ارسال شدن به پايگاه داده نگه داشته، و هر پرس و جو را در مورد مدلهايي كه به طور استاتيك ساخته شده اند، بررسي ميكند. پرس و جوهايي كه مدل را نقض ميكنند، به عنوان حملات تزريق SQL شناسايي شده و از اجراي آنها در پايگاه داده جلوگيري ميشود. ارزيابي نويسندگان اين تكنيك نشان داده است كه AMNESIA در مقابل حملات تزريق SQL به خوبي عمل ميكند. محدوديت اوليه اين تكنيك اين است كه موفقيت آن، به دقت تحليل استاتيك براي ساختن مدلهاي پرس و جو بستگي دارد. انواع مشخصي از ايجاد ابهام در كد، يا تكنيكهاي توليد پرس و جو، ميتوانند باعث كم دقت شدن اين گام گردند و در نتيجه، منجر به ايجاد خطاهاي false positive و نيز false negative شوند.
به طور مشابه، دو روش SQLGuard و SQLCheck نيز، پرس و جوها را در زمان اجرا مشاهده كرده و تطابق آنها را با يك مدل از پرس و جوهاي مورد انتظار بررسي مينمايند. در اين روشها، مدل به شكل يك قاعده دستوري بيان ميشود كه فقط پرس و جوهاي معتبر را قبول ميكند. در SQLGuard، مدل در زمان اجرا با امتحان كردن ساختار پرس و جو قبل و بعد از اضافه كردن ورودي كاربر استنباط ميگردد. در SQLCheck، مدل به طور مستقل توسط برنامه نويس مشخص ميشود. هر دو روش از يك كليد محرمانه براي محدود كردن ورودي كاربر در طول تجزيه توسط چك كننده زمان اجرا استفاده ميكنند، بنابراين امنيت روش به اين بستگي دارد كه مهاجمان قادر نباشند كليد را كشف كنند. علاوه بر اين، استفاده از اين دو روش نيازمند اين است كه برنامه نويس كد را دوباره نويسي كند تا از كتابخانه واسط استفاده نمايد، يا اينكه به طور دستي نشانه هاي خاص را به كد اضافه نمايد.
همچنين استفاده از سيستمهاي فيلترينگ پروكسي كه قوانين اعتبار سنجي وروديها را بر روي داده هاي ورودي به يك برنامه وب اعمال ميكنند از ديگر راههاي جلوگيري از حملات تزريق SQL است. برخي سيستمهاي تشخيص نفوذ (IDS) نيز ميتوانند حملات تزريق SQL را شناسايي نمايند.
- 21