| شرح PHPIDS لحماية سكريبتات PHP من الثغرات |
| الكاتب عبدالمهيمن |
| الثلاثاء, 25 أغسطس 2009 00:54 |
|
شرح استخدام PHPIDS وهو PHP Intrusion Detection System يستخدم لعمل طبقة حماية على سكريبتات PHP المختلفة وحمايتها بشكل شبه كامل من الثغرات التي يقع فيها المبرمجين مثل RFI/LFI , XSS , SQL Injection حتى قبل اكتشافها!
مقدمة:
تعتبر لغة PHP أكثر لغات البرمجة استخداماً في برمجة سكريبتات وتطبيقات الويب ويمكننا اعتبارها اللّغة الأساسية في وقتنا الحالي. شهرة لغة PHP الكبيرة وعدد السكريبتات المبرمجة باستخدامها دفع الكثير من الهاكرز لتركيز جهودهم على هذه اللغة وثغراتها (ان كانت ثغرات مفسّر php نفسه أو الثغرات التي يقع فيها المبرمجين عند برمجة السكريبتات). سأشرح في هذا المقال كيفة استخدام PHPIDS لحماية السكريبتات من بعض الثغرات التي يقع فيها المبرمجين مثل Remote/Local file include , XSS , SQL Injection...
ماهو PHPIDS:PHP-IDS هو اختصار لـ PHP-Intrusion Detection System مبرمج بلغة PHP ومرخّص تحت رخصة GNU Lesser General Public License مهمته حماية السكريبتات المبرمجة بهذه اللغة من الثغرات حيث يعمل PHPIDS كطبقة حماية اضافية يتأكد فيها من مدخلات المستخدم وجميع المعلومات المرسلة والمستقبلة قبل تمريرها للسكريبت الأساسي عن طريق مقارنتها بمجموعة قواعد مخزّنة مسبقاً بملف XML, فاذا قام أحد المهاجمين بارسال طلب بغرض استغلال ثغرة SQL Injection مثلاً سيتعرّف PHPIDS على ذلك ويمنع تمرير طلبه للسكريبت.
بماذا يختلف PHPIDS عن غيره من طبقات الحماية مثل mod_security:كما قلت سابقا PHPIDS مبرمج بلغة PHP هذا يعني أننا قادرين استخدامه بسهولة مع سكريبتات PHP كما يمكننا تضمينه بأساس السكريبتات التي نبرمجها اذا كانت مفتوحة المصدر بعد قيامنا بالتعديلات المناسبة. ما يميّزه عن mod_security هو أن تنصيبه واستخدامه لا يحتاج لتركيب أي اضافات أو تعديل على اعدادات الويب سيرفر وبذلك نستطيع استخدامه في الاستضافات المشتركة التي لا نملك فيها صلاحيات تمكننا من التعديل على اعدادت السيرفر, فكما نعلم mod_security هو اضافة لسيرفر Apache وبهذه الحالة نحن بحاجة لصلاحيات root حتى نتمكن من تنصيبه واعداده على السيرفر وهذا لا يتوفّر دائما.
المتطلبات:
التنصيب والاستخدام:تم تنفيذ هذا الشرح على سيرفر محلي (localhost) يستخدم توزيعة Fedora ومسار الجذر المستخدم في الويب سيرفر: /var/www/htmlالآن نبدأ بالتوجه لصفحة التحميل: http://php-ids.org/downloads/ونحمّل آخر اصدار متوفّر من PHPIDS (الاصدار الحالي: 6.1.1) باستخدام wget: wget http://php-ids.org/files/phpids-0.6.1.1.tar.gzنفك ضغطه باستخدام الأمر: tar xfz phpids-0.6.1.1.tar.gzثم ننقل المجلد phpids-0.6.1.1 الى المسار: /var/htmlباستخدام الأمر التالي: mv phpids-0.6.1.1/ /var/www/ما يهمنا الآن هو المجلد: /var/www/phpids-0.6.1.1/lib/IDSالذي يحتوي على ملفات PHPIDS لذلك نتوجّه لذلك المجلد وننفذ الأمر ls لاستعراض محتوياته: Caching default_filter.json Filter Log tmpConfig default_filter.xml Filter.php Monitor.php vendors Converter.php Event.php Init.php Report.php الملفين default_filter.json و default_filter.xml يحتويان على القواعد التي يتحقق منها PHPIDS وهذه الملفات تتحدث بشكل مستمر. سنعتمد على ملف XML ونتجاهل الملف الثاني لأنه يحتوي على نفس القواعد لكن بتنسيق مختلف, ما سنقوم به الآن هو تحديث ملف default_filter.xml. ثم نحمّل الاصدار الجديد باستخدام الأمر: wget --no-check-certificate https://svn.php-ids.org/svn/trunk/lib/IDS/default_filter.xmlالآن سنبدأ باعداد PHPIDS وذلك بالتعديل على الملف: nano /var/www/phpids-0.6.1.1/lib/IDS/Config/Config.iniسنضع في السطر 12 المسار الكامل لـ PHPIDS بهذا الشكل: base_path = /var/www/phpids-0.6.1.1/lib/IDS/وسنغيّر القيمة false الى true في السطر: use_base_path = trueونضع في السطر 51 الايميل الذي سيتم ارسال التنبيهات اليه: recipients[] = abdo@isecur1ty.orgبالنسبة لي سأترك باقي الاعدادات افتراضية ثم أغلق الملف وأحفظ التغييرات بالضغط على Ctrl+X ثم نضغط Y و Enter ليتم الحفظ. ملاحظة: اذا كنت تستخدم PHPsu أو كنت تطبّق الشرح على استضافة مشتركة تستخدم لوحة تحكّم cPanel مثلا فلا داعي لتنفيذ الأمر السابق ويكفي اعطاء المجلد tmp تصريح 755: chmod -R 755 /var/www/phpids-0.6.1.1/lib/IDS/tmpبعد ذلك ننشئ ملف باسم php-ids.php مثلا في المسار: /var/www/html/php-ids.phpيحتوي على: <?phpset_include_path( get_include_path() . PATH_SEPARATOR . '/var/www/phpids-0.6.1.1/lib' ); require_once 'IDS/Init.php'; $request = array( 'REQUEST' => $_REQUEST, 'GET' => $_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE ); $init = IDS_Init::init('/var/www/phpids-0.6.1.1/lib/IDS/Config/Config.ini'); $ids = new IDS_Monitor($request, $init); $result = $ids->run(); if (!$result->isEmpty()) { // Take a look at the result object echo $result; require_once 'IDS/Log/File.php'; require_once 'IDS/Log/Composite.php'; $compositeLog = new IDS_Log_Composite(); $compositeLog->addLogger(IDS_Log_File::getInstance($init)); $compositeLog->execute($result); } ?> الآن كل ما علينا هو فتح الرابط التالي من المتصفح: http://localhost/php-ids.phpلتظهر لنا صفحة بيضاء فارغة لكن اذا حاولنا تمرير كود لثغرة XSS مثلا: http://localhost/php-ids.php?data=<script>alert(1)</script>سيتعرف PHPIDS على ذلك ويعرض لنا النتائج:
جميل جداً.. هذا يعني أن PHPIDS يعمل الآن لكن كيف سنجعله يعمل مع السكريبتات الأخرى التي نستخدمها؟ ليس من المعقول أن نعدّل على جميع ملفات php واحدا تلو الآخر ونقوم بعمل include لملف php-ids.php! مفسّر php يحل لنا هذه المشكلة باستخدام الخيار: auto_prepend_fileالذي سيقوم بتشغيل السكريبت الذي نختاره قبل أي سكريبت آخر (بهذه الحالة هو php-ids.php) يمكن أن نعدّل على ملف: /etc/php.iniونضيف مسار php-ids.php بهذا الشكل: auto_prepend_file = /var/www/html/php-ids.phpأو كما قلت ان لم يكن لدينا صلاحيات تخولنا للتعديل على اعدادات السيرفر نستطيع استخدام ملف .htaccess للقيام بذلك. كل ما علينا هو انشاء ملف بالمسار: /var/www/html/.htaccessونضع فيه: php_value auto_prepend_file /var/www/html/php-ids.phpلكن لحظة! حتى الآن PHPIDS لا يمنع الطلب المرسل بل يقوم بكشفه فقط! لذلك سنقوم بالتعديل مرة أخرى على الملف php-ids.php لكي لا يظهر المعلومات التي اكتشفها ويمنع الطلب من التنفيذ: <?phpset_include_path( get_include_path() . PATH_SEPARATOR . '/var/www/phpids-0.6.1.1/lib' ); require_once 'IDS/Init.php'; $request = array( 'REQUEST' => $_REQUEST, 'GET' => $_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE ); $init = IDS_Init::init('/var/www/phpids-0.6.1.1/lib/IDS/Config/Config.ini'); $ids = new IDS_Monitor($request, $init); $result = $ids->run(); if (!$result->isEmpty()) { // Take a look at the result object //echo $result; require_once 'IDS/Log/File.php'; require_once 'IDS/Log/Composite.php'; $compositeLog = new IDS_Log_Composite(); $compositeLog->addLogger(IDS_Log_File::getInstance($init)); $compositeLog->execute($result); die("<h2>Hacking Attempt!</h2>"); } ?> الآن حاول تمرير كود لأي ثغرة تختارها على أي سكريبت موجود في الموقع بهذه الحالة (ووردبريس) وشاهد النتيجة:
يمكننا طبعا تعديل السطر: die("<h2>Hacking Attempt!</h2>");واستبدال الرسالة الموجودة فيه بأي رسالة أخرى تختارها. وسنجد في المسار: /var/www/phpids-0.6.1.1/lib/IDS/tmp/phpids_log.txtملف الـ Log الخاص بـ PHPIDS يحتوي على محاولات الاختراق وجميع المعلومات الأخرى.
مراجع:
التعليقات (15)
![]() أرسلت بواسطة: Ibrahim J. Bassa في August 25, 2009
والله برنامج جميل جدا ,
لاكن سؤالي هو .. طريقة البرنامج بفحص المدخلات جميله لاكن هل تسبب Load على السيرفر ؟ أرسلت بواسطة: Zaid في August 26, 2009
شرح جميل جدا يا عبدو
عاشت الايادي سأقوم بتجربته في اقرب وقت ان شاء الله أرسلت بواسطة: أحمد فارس في August 29, 2009
فعلا مقال رائع جداً وقدمت لنا أداة جيدة جداً ...
جزاك الله خيراً أرسلت بواسطة: عبد العزيز حسن في September 08, 2009
مشكور يا حبيبي علي الموضوع الرائع وبارك الله فيك
أرسلت بواسطة: Own3r في September 08, 2009
يعطيك العافية عبدالمهين
السكربت على كلامك جدا ممتاز وطريقة تنصيبه سهله اعتقد انه راح يمنع كثير من الاختراقات اشكرك على موضوعك الرائع تقبل تحياتي أرسلت بواسطة: Rayan في September 18, 2009
يعطيك العافيه عبدالمهيمن ,
المود سكيورتي مبهذلني هاليومين ، رافع اللود و خانقني ... لي عودة للموضوع و تجربته , :) أرسلت بواسطة: S4udi h4ck في October 25, 2009
يا خوي وربي انك ملك بس ما ودك تعلمني معرف شي يا هووووووووووو الحركات القويه ذي تعال على ايميلي يا عبدووووو ولا ازعل عليك وربي jnx-@hotmail.com
أرسلت بواسطة: command في October 29, 2009
ممكن طريقة تركيب الاسكربت على الريسيلرات و اوامر التركيب على السيرفر بصلاحية root ?
والف شكر مقدما أرسلت بواسطة: فايز الخليفي في December 22, 2009
اخي العزيز عبود فعلاً سكربت رائع
ويسمك الاخطاء الشائعه التي ذكرتها وبا مكنك اضافة بعض الرول الخاصه بك اما بنسبه لاخي Mustafa Albazy بشان موضوع المود سكيورتي فلا اجد فرق بين الاثنيين من ناحية الامن والتحقق من المدخلات وانا ارى انه افضل لمستخدمي الاستضافات بشكل عام وشكراً اخي العزيز على هذا الشرح اللطيف والمفيد وكلها يعتمد على قاعده من الاخطاء أرسلت بواسطة: mo2men في February 06, 2010
لو سمحت انا بستخدم نظام ويندوز
و بحاول اطبق الشرح على السيرفير شخصى بلاقى حاجات مش مفهومه ليا لو ممكن تشرح على نظام ويندوز لانى محتاج الدرس ده ضرورى أضف تعليق
يجب عليك الاشتراك بالموقع لتتمكن من كتابة التعليقات, الاشتراك مجاني ويستغرق بضع ثوان فقط!
اذا كنت مشترك مسبقا في الموقع فضلاً قم بتسجيل الدخول. |








بخصوص الرسالة التي تظهر للشخص الذي يحاول الاختراق, من الممكن تبديلها واستخدام كود توجية إلى صفحة اخرى تقوم انت تنسيقها وما إلى ذالك
ولكن بالنسبة الي كمدير نظم افضل mod security :D