![]() |
طرق قوية في استغلال تغرة SQL "غير نظرتك حول طرقية استغلال هذه التغره" السلام عليكم ورحمة الله تعالى وبركاته لقد شاهد العالم ضهور نوع جديد من هذه التغرات وطرق الحمايه و ... اصبحت اقوى وفعالة، وصار لابد للهكر اللجوء الى اساليب جديدة في الاختراق وايجاد نقاط الضعف لكي يتم استغلالها وفي الايام الحالية ظهر نوع جديد من ثغرات الحقن (SQL Injection) والتي يستغلها المخترق في تنفيذ مايريد وهناء يقوم المخترق بالتحكم في الشروط (ORDER BY, LIMIT or GROUP BY) في امر الاستعلام. سوف نقوم بالتطبيق على قواعد بيانات mysql server و مع العلم أن هذه التقنية بالامكان تطبيقها على كافة قواعد البيانات. لوول في معظم ثغرات SQL Injection يتم التركيز على مابعد الشرط where والتي يكون المستخدم هو المتحكم بها مثال: كود: SELECT fieldlist سوف يحدث خطاء (sql injection) وهناء يحتاج المخترق الى معرفة عدد الحقول (filedlist) لكي يتم تنفيذ استعلام الاتحاد او (UNION SELECT SQL) لكي يتم استخارج البيانات المطلوبة من القاعدة وسوف يكون شكل الاستغلال كالتالي: كود: SELECT fieldlist في الجزء الاول من امر الاستعلام لن يتم إعادة اي قيمة لأن الشرط هنا سوف يكون خطاء وعوضاً عن ذلك سوف يتم عرض إصدار قاعدة البيانات والتي سوف تكون في الجزء الثاني من امر الاستعلام و لن اطيل في التكلم عن هذا النوع من الثغرات لأنها معروفه لدى الجميع وتم شرحها كثيراً في المنتدى واضن ان اغلب محترفيها خريجي دورة فولكانو ههع الحقن في شرط order by نطبق على ملف php مصاب كود: <?php سوف تلاحظ ان المستخدم يمكنة التحكم في طريقة عرض النتجية النهائية بواسطة إدخال قيمة من نوعGET الى المتغير $order_by، إذا قمنا بطلب الصفحة الرابط التالي: كود: /orderby?order_by=name زي طريقة الاستغلال في عندنا الملف المصاب بالكود الخبيت وبعد الملف علامة ؟ من اجل استغلال ... راجع دورة كشف التغرات سوف يقوم بعرض المستخدمين حسب الاسم وسوف تكون النتيجة على الشكل التالي:
وعندما يتم طلب الرابط التالي: كود: orderby.php?order_by=email
دالة 'mysql_escape_string' وهذا النوع من الحماية لن يجدي نفعاً لأن القيمة المدخلة ليست بين علامات تنصيص (enclosed between quotes) ويتعبر الكود السابق مصاب بثغرة حقن. وهذه الثغرة لا يمكننا ان نستخدم معها UNION SELECT, إذا كيف يمكننا استغلالها؟ لو قمناء بتنفيذ استغلال مثل: كود: SELECT * FROM users ORDER BY name union select version() سوف يعيد لنا خطاء يحمل الرسالة التالية: كود: "Incorrect usage of UNION and ORDER BY". والفكرة هي ان order تعتمد على قيمة منطقية اما (true or false) ويجب ان يكون الاستعلام بالشكل التالي: كود: SELECT * FROM users ORDER BY (case when ({boolean_condition}) then name else email end) إذا, سوف يكون الاستعلام بالشكل التالي : كود: SELECT * FROM users ORDER BY (case when (1=1) then name else email end) الاسم ، واذا كان الشرط هنا خطاء (1=0...) سوف يعرض على حسب الايميل وسوف يكون على الشكل التالي : كود: SELECT * FROM users ORDER BY (case when (1=0) then name else email end) باستخدام هذا الشرط بستطاعتنا ان نستخرج البيانات التي نريد من القاعده على شكل واحد بت في نفس الوقت (one bit at a time.) وعلى سبيل المثال لو اردنا ان نستخرج كلمة السر للمدير (administrator) سوف يكون الاستعلام على الشكل التالي: كود: SELECT * FROM users ORDER BY (case when (ORD(MID((select password from users where id=1),1,1))&1>0) then name else email end) بعد تنفيذ هذا الاستعلام إذا كانت القيمة للشرط صحيحة اي يكون الحرف الاول للباسورد 1 سوف يعرض النتيجة حسب الاسم وإذا لم تكن صحيحة اي الحرف الاول من الباسورد لا يساوي 1 سوف يعرض على حسب الايميل. ويتم الاستمرار الى ان يتم عرض الباسورد كامل على الشكل التالي: كود: SELECT * FROM users ORDER BY (case when (ORD(MID((select password from users where id=1),1,1))&2>0) then name else email end) لكن هذه العملية سوف تكون متعبة بشكل اليدوي لكن يوجد هناك سكربت بيثون قام ببرمجتة Bogdan من فريق acunetix يسهل عملية استخراج البيانات: http://im4.gulfup.com/2011-06-22/1308728096281.jpg كود: # ORDER BY data extractor (bogdan [at] acunetix.com) الحقن في شرط limit كمان نشوف ملف php مصاب : كود: <?php يكون في الشرط (limit) وهذا النوع إستغلالة سهل ليس مثل الاستغلال السابق الخاص بـ order . وباستطاعتنا استخدم (union) بطلب الصفحة بشكل التالي: كود: /limit.php?limit=2+union+select+1,2,version(),4,5,6,7,8 نفسك من هذا النوع من الهجوم بمكانك استخدام احد الدالتين كود: $limit = mysql_escape_string($_GET["limit"]) او $limit = intval($_GET["limit"]) تقوم هذه الدوال من التحقق من قيمة المدخلات ... بحب هذا الحقن لوول الحقن في شرط group by في هذه الحالة تكون مشابهه جداً الى حالة LIMIT اي يمكنك استغلالها من خلال (UNION SELECT) لاستخراج البيانات المطلوبة وسوف يكون الاستعلام بالشكل التالي: كود: select * from users group by id union select 1,2,version(),4,5,6,7,8... ذكر في (ORDER BY) اي تحدد (white list) للقيم التي يجب عمل عليها GROUP BY. وكخلاصة فحقن قواعد البيانات يبدآ من ضهور خطآ sql ويتم تتبعه الى الوصول الى الهذف دون ادنى مشكلة ... وفي الاخير تقبلو مني تحياتي واسفي حول هذا الموضوع "على السريع ... " |
amazing thx bro |
الساعة الآن 11:55 PM |
[ vBspiders.Com Network ]