مواضيع ومقالات

مقال : شرح PHPIDS لحماية سكريبتات PHP من الثغرات

تم أرشفة هذا المحتوى


شرح استخدام PHPIDS وهو PHP Intrusion Detection System يستخدم لعمل طبقة حماية على سكريبتات PHP المختلفة وحمايتها بشكل شبه كامل من الثغرات التي يقع فيها المبرمجين مثل RFI/LFI , XSS , SQL Injection حتى قبل اكتشافها!

 

مقدمة:

PHP-IDS

تعتبر لغة 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 حتى نتمكن من تنصيبه واعداده على السيرفر وهذا لا يتوفّر دائما.

 

المتطلبات:

  1. ويب سيرفر جاهز للعمل يستخدم اصدار PHP 5.1.6.
  2. معرفة بعض الأساسيات في لغة PHP على الأقل.

 

التنصيب والاستخدام:

تم تنفيذ هذا الشرح على سيرفر محلي (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          tmp
Config         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.

في البداية نأخذ نسخة احتياطية من ملف default_filter.xml:

mv default_filter.xml default_filter.xml.bak

ثم نحمّل الاصدار الجديد باستخدام الأمر:

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[]    = [email protected]

بالنسبة لي سأترك باقي الاعدادات افتراضية ثم أغلق الملف وأحفظ التغييرات بالضغط على Ctrl+X ثم نضغط Y و Enter ليتم الحفظ.

الآن سننفذ الأمر التالي ليتمكن سيرفر Apache من الكتابة داخل مجلد tmp:

chown -R apache:apache /var/www/phpids-0.6.1.1/lib/IDS/tmp

ملاحظة: اذا كنت تستخدم 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

يحتوي على:

<?php
set_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 على ذلك ويعرض لنا النتائج:

PHP-IDS 1

 

جميل جداً.. هذا يعني أن 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 لكي لا يظهر المعلومات التي اكتشفها ويمنع الطلب من التنفيذ:

<?php
set_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>”);
}
?>

الآن حاول تمرير كود لأي ثغرة تختارها على أي سكريبت موجود في الموقع بهذه الحالة (ووردبريس) وشاهد النتيجة:

PHP-IDS 2

 

يمكننا طبعا تعديل السطر:

die(“<h2>Hacking Attempt!</h2>”);

واستبدال الرسالة الموجودة فيه بأي رسالة أخرى تختارها.

وسنجد في المسار:

/var/www/phpids-0.6.1.1/lib/IDS/tmp/phpids_log.txt

ملف الـ Log الخاص بـ PHPIDS يحتوي على محاولات الاختراق وجميع المعلومات الأخرى.

طبعا PHPIDS يحتوي على الكثير من الخيارات الأخرى لم أتطرق لها في  هذا الشرح فأنا أردت التعريف به بشكل سريع واقتراحه كبديل لمود سكيورتي مع العلم أن PHPIDS يملك ميزات أخرى كثيرة مثل امكانية تسجيل ما يحصل داخل قواعد البيانات وعرض محاولات الاختراق بصفحة مستقلة أيضا, كما يمكن الاستفادة من التوثيق الخاص به لدمجه واستخدامه مع أي سكريبت آخر نستخدمه.

سأترككم لتختبروا PHPIDS بأنفسكم وتكتشفوا باقي ميزاته أما بالنسبة لي فسأكمل تجربتي معه وسأحاول اكتشاف المزيد من الميزات الأخرى…

 

مراجع:

عن الكاتب:


عبدالمهيمن الآغا, مؤسس موقع iSecur1ty. مختص بالحماية وأساليب إختبار الإختراق. أملك خبرة في إدارة الشبكات والسيرفرات, تطوير المواقع والبرمجة بلغة Ruby التي برمجت بها عدّة مشاريع وأدوات مفتوحة المصدر.

مقالات ذات صلة

‫21 تعليقات

  1. شكراً لك عبدو على الموضوع الاكثر من رائع.
    بخصوص الرسالة التي تظهر للشخص الذي يحاول الاختراق, من الممكن تبديلها واستخدام كود توجية إلى صفحة اخرى تقوم انت تنسيقها وما إلى ذالك

    ولكن بالنسبة الي كمدير نظم افضل mod security 😀

  2. Mustafa Albazy: لكل منهم محاسن ومساوء.. mod_security مشهور واستخدامه لكني وضحت الحالات التي قد نحتاج لاستخدام PHP-IDS كما أني أجد أن التعامل مع PHP-IDS أسهل من مود سكيورتي نوعا ما.

    Ibrahim J. Bassa: حسب ما قرأت في الموقع PHP-IDS لا يسبب ضغط على السيرفر ويمكنك معرفة التفاصيل في هذه الصفحة: http://php-ids.org/faq

    السؤال قبل الأخير…

  3. والله برنامج جميل جدا ,
    لاكن سؤالي هو .. طريقة البرنامج بفحص المدخلات جميله لاكن هل تسبب Load على السيرفر ؟

  4. يعطيك العافية عبدالمهين
    السكربت على كلامك جدا ممتاز
    وطريقة تنصيبه سهله
    اعتقد انه راح يمنع كثير من الاختراقات
    اشكرك على موضوعك الرائع
    تقبل تحياتي

  5. يعطيك العافيه عبدالمهيمن ,

    المود سكيورتي مبهذلني هاليومين ، رافع اللود و خانقني …
    لي عودة للموضوع و تجربته , 🙂

  6. ممكن طريقة تركيب الاسكربت على الريسيلرات و اوامر التركيب على السيرفر بصلاحية root ?
    والف شكر مقدما

  7. اخي العزيز عبود فعلاً سكربت رائع

    ويسمك الاخطاء الشائعه التي ذكرتها وبا مكنك اضافة بعض الرول الخاصه بك

    اما بنسبه لاخي Mustafa Albazy بشان موضوع المود سكيورتي فلا اجد فرق بين الاثنيين

    من ناحية الامن والتحقق من المدخلات وانا ارى انه افضل لمستخدمي الاستضافات

    بشكل عام وشكراً اخي العزيز على هذا الشرح اللطيف والمفيد

    وكلها يعتمد على قاعده من الاخطاء

  8. لو سمحت انا بستخدم نظام ويندوز

    و بحاول اطبق الشرح على السيرفير شخصى

    بلاقى حاجات مش مفهومه ليا

    لو ممكن تشرح على نظام ويندوز

    لانى محتاج الدرس ده ضرورى

  9. السلام عليكم ورحمة الله وبركاته
    شكرا على الشرح اخي عبدالمهيمن ولكن لدي سؤال هل يحمي من سكريبت حجب الخدمه الخاص بدروبال
    وجملا ووردبريس وهل هو افضل ام المود سيكيورتي ياليت اذا ماعليك كلافه تعطينا رايك وشكرا

  10. @mo2men: أخي أنا لا أستخدم نظام ويندوز كجهاز شخصي كيف تريدني أن أستخدمه كسيرفر؟ D:
    راجع موقع PHPIDS ربما ستجد بعض المعلومات المفيدة…

    @مجلاد السبيعي: لا أتوقع ذلك الا اذا اضفت توقيع للثغرة وسيتمكن المهاجم من تخطيه في حال غيّر الاستغلال المنتشر.. ايقاف ثغرات حجب الخدمة يجب أن يتم من الجدار الناري في السيرفر. أما أيهم أفضل فـ mod_security أقدم وتواقيعه أكثر وخياراته أكثر لكن قد يجب البعض صعوبة باستخدامه والتحكم بخيارته. PHPIDS أبسط وأسهل ويعمل كأنه سكريبت php على السيرفر عكس mod_security الذي هو موديول للأباتشي والتحكم به يتطلب صلاحيات root.

  11. مهم كانت حماية فهي 0 الحامية كلها من السيرفر

    شكرااااا لك اخي عبد المهين

    مع فائق احترامي

  12. السلام عليكم ،
    شكراً استاذي على الشرح الممتاز تم التطبيق ولكن حدثت بعض المشاكل

    انا الان قمت بتركيب السكربت على السيرفر الشخصي وهذا المسار التفصيلي لمكان السكربت
    C:/AppServx/www/s/phpids-0.6.3.1/lib/IDS
    وقمت بعمل ملف config.ini بهذا الشكل

    ومن ثم عملت ملف php-ids.php بهذا الشكل

    وكل ما أجي ادخل على ملف php-ids.php من المتصفح تظهر هذه الرسالة

    Fatal error: Uncaught exception ‘Exception’ with message ‘Configuration file could not be found at C:/AppServx/www/s/phpids-0.6.3.1/lib/IDS/Config/Config.ini’ in C:AppServxwwwsphpids-0.6.3.1libIDSInit.php:137 Stack trace: #0 C:AppServxwwwsphpids-0.6.3.1libIDSInit.php(91): IDS_Init->setConfigPath(‘C:/AppServx/www…’) #1 C:AppServxwwwsphpids-0.6.3.1libIDSInit.php(118): IDS_Init->__construct(‘C:/AppServx/www…’) #2 C:AppServxwwwshtmlphp-ids.php(15): IDS_Init::init(‘C:/AppServx/www…’) #3 {main} thrown in C:AppServxwwwsphpids-0.6.3.1libIDSInit.php on line 137

    مع العلم انني لم اقم بإعطاء التصريح 755 لمجلد tmp لاني لا اعرف الطريقة على السيرفر الشخصي

    ياريت بالله عليكم حد يقلي فين الخطأ وشكراً

  13. جزاك الله خيرا على هذا الموضوع الهام
    والذى يعتبر طبقه جيده من الحمايه
    ونتظر المزيد من الموضوعات بهذا الشأن

  14. بسم الله الرحمن الرحيم
    أخي أنا قمت ببرمجة منتدى خاص و أرددت تركيب هته الأداة لأني أعلم بأن النسخة بها ثغرات كثيرة و ليس لدي الخبرة الكافية في مجال الحماية
    و لا الإستضافة لا تمنحني القدرة على تغيير إعدادات السيرفر
    فكيف يمكنني التركيب على منتداي الشخصي

  15. تنبيه: غير معروف

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى