أمن وحماية مواقع الويب بي أتش بي

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

  • XSS
  • CSRF
  • SQL Injection/Blind SQL Injection
  • File Upload
  • Information Disclosure
  • Local File Inclusion
  • Remote File Inclusion
  • Path Traversal
  • OS Commanding
  • Null Byte
  • Brute Force

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

XSS Cross-site scripting

برمجة عبر مواقع ،هذا هو. كل إضافة تتم من طرف مستخدم (html,javascript…) ولا يملك الصلاحية وتضهر على الموقع كما أضيفة ولها نوعان المنعكس (غير الثابت)، المخزن (الثابت)
وأضراره على الموقع سرقة كوكيز لأي زائر،إرغام الزائر عن تحميل أي برنامج،تغيير إتجاه الزائر إلى مواقع أخر، ….

المنعكس

الذي لا يتم حفضه في أي مكان لكن يمكن الوصول له عبر طرف طلب get أو post
مثال
في أول تعلم للبرمجة يقلون لنا سنبرمج حقل نضع في إسمنا وعندما نضغط إرسال يكتب تحت الحقل مرحبا إضافة إلى الإسم
الكود
<?php
if(isset($_POST['submit_name'])&&($_POST['name']!="")){
echo 'مرحبا ' . $_POST['name'];
}
?>

لكن بكل إهتمام نتعود على هذه أمر و هذا الكود وننسا أنه يمكن فتح ثغرة ، ما هي المشكلة؟
المشكلة إذا أضفنا أي كود html أو javascript أو غيره نحصل على ثغرة في سبيل المثال وبكل سهولة في حقل الإسم نضع
<script>alert('ليس ما كنت تتوقع xss')</script>
تعرف مذا سيحصل أليس كذالك

حله في هذه الحالة إستعمال htmlspecialchars عند إستخراج الإسم للمستخدم
htmlspecialchars()

المخزن (الثابت)

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

CSRF

عكس السابق الذي يستغل ثقة الزائر في الموقع ، فهذا النوع يستغل الثقة التي نضعها في أفعال الزائر، وهذا يضاف إلى إستعمال ajax لطلبات مثل تغيير كلمات المرور والتنقيط والتعليقات و ….
لدينا موقع يوجد به أكثر من شخص مسجل ويتمكنون بتسجيلهم من إستعمال الموقع ويمكنهم تغيير كلمة المرور في حالة التسجيل وما نطلبه هو كلمة المرور الجديدة وإعادة كتابتها ونرسلها لملف http://domain.com/changepass.php وهذا الأخير يغيرها
في الحالة الأولى يتعين علينا في ملف تغيير كلمة المرور مراجعت هل المستخدم مسجل وهنا نغلق هذه الثغرة
في الحالة الثانية يمكن أن ما فعلاناه لم يكن كافيا و لم نغلق أي شيء وما رأيك أن كل شخص له صورة شخصية في الموقع وأحدهم يأخذ ويغيير مصدر الصورة أن تكون http://domain.com/changepass.php?newpass=admin&c-newpass=admin وبهذا فهو يطلب للملف تغيير كلمة المرور لأي شخص مسجل قام برأية صورته
الحماية من هذه الطريقة
طلب كلمة المرور الأولى لشخص المسجل
طلب رقم يتم توليده تلقائيا يسمى “token” وعمله هو إرسال رقم واحد في كل مرة وهكذا نعرف أنها لم تأتي من أي مكان أخر
قبل حقول طلب كلمة المرور نقوم بتولبد ذالك الرقم نضعه في وحدة لتخزين SESSION
$_SESSION['token'] = substr(md5(microtime(true)), 0, 5);
في حقل مخفي نقوم بإدراجه
<input type="hidden" value="<?php echo $_SESSION['token']; ?>" name="token" />
وفي الملف تغيير كلمة المرور نقوم بطلب نتيجة كلمة token هل تطابق التي وضعة في SESSION
if (isset($_GET['token']) &&  $_GET['token'] == $_SESSION['token'] ) {
// تعمل
//إفشال طلبها مرة أخرى
$_SESSION['token']="";
} else {
// لا تعمل
}

وفي كل الأحول فإستعمالها لا يتوقف على تغيير كلة المرور ويمكن أن يصل إلى أشياء أخرى التي يطلب من الزائر فعل شيء ويضع أشياء أخرى ومنها خطئ إستعمال الحقول المخفية أو الحقول التي لا يمكن تغيير حالتها

SQL Injection/ Blind Injection

هذا ما تم إحبابه من طرف الكثرين عندما أنت تحاول عمل برمجة سريعة وتترك باب لكي يمكن عمل أي شيء بالموقع أو قواعد البيانات، فهذا النوع يستغل إستعمالنا الخاطئ في معالجة الأوامر التي تعمل لقواعد البيانات ويتمكن من إضافة أكثر من أمر حتى الوصول إلى إجاد طريقة الحصول على كل معلوماتها مع إمكانية التغيير أو إمتلاك كل ما يوجد من قواعد بيانات
في الطريقة الأولى أردت شرح
admin' or '1'='1
لكن أتركها wikepedia
لكن لمذا هي خطيرة ، قبل ذالك نسيت أنهما نوعان والنوع الذي لا توضع نتائجة لزائر تسمى BLIND SQL Injection والأن الخطورة نقول أن لدينا موقع بحقل بحث لكن لا نأخذ بعين الإعتبار معالجة الأوامر فكل أمر بحث وبعدها إغلق النتيجة وإبحث على كل كلمات المرور الموجودة في قاعدة الموقع أو لما لا في قاعدة البيانات mysql
' union all select User,Password from mysql.user #
فما سنحصل عليه لن تحبه 😉
الحل
الأول عدم إظهار لزائر أي خطئ وقع فيه قواعد البيانات
إببجاد لقاعدة البيانات المستعملة مستخدم و إمتيازات التي تحتاجها، مذكرا المستخدم لإستخدام تلك قاعدة البيانات وليس الجمبع.
وأخبرا وليس أخيرا إستعمال mysql_real_escape_string() وبدون إنتضار مساعدة بي أتش بي من طرف magic_quotes_gpc التي عليها أن تكون Off
إستعمال Prepared Statements

File Uploadرفع الملفات

أحد التحديات في وقت الحالي رفع وتحميل الملفات أصبح شيء عادي ، و تعرف ما هي المشكلة عوض رفع صورة تقوم برفع ملف بي أتش بي،

الأن أترك خبالك يبحث ما يمكنك فعله بهذا الملف ونرجع إلى رفع الملفات أضن الكثرين بقومون بترك الملفات بنسيق الصور مثل (jpg,png,gif…) لكن هل فكرت في رفع ملف بتغيير .php ب .php.pjpeg فهذا يجعل الأمر معقد أليس كذالك
للحماية في الوقوع في هذا الأمر
التحقق من Content-Type بأنه النوع الذي نريده
تحقق ما إذا كان الملف هو صورة getimagesize
ووضع حد أقصى لحجم الملف

Information Disclosure

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

Local File Inclusion و Remote File Inclusion

ما زال يقع فيه الكثرين وهو جد خطير وهذا يتم عبارة عن أخطاء فادحة عند إستعمال include()، include_once()، requiere()، requiere_once() بما يرده المستخدم أو إستعمال ملف موجود بالطريقة نفسهأ
مثال Local File Inclusion و Remote File Inclusion
include($_GET['page']);
الخارج عند تغييره


ما رأيك لو قمت في الصورة الأولى بتغيير /etc/hosts إلى /etc/passwd وهكذا يكون أكثر إثارة أليس كذالك
الثاني بدون تعليق أنت فكر ما يمكن فعله
الطريقة الأولى أو الثانية لا تقم بهذه الأخطاء أو التفكير أن لا أحد سيلاحض وإذا كان ولابد من إستعماله فكر في عمل معالجة للمعلومات الداخلة وأما بالنسبة لنوع الأخر فهذان allow_url_fopen و allow_url_include أن تكون مغلقة off

Path Traversal

ما تعنيه هذه الثغرة وصول التطبيق المستعمل إلى مكان أخر في النضام الغير المخصص لها او بإسم أخر “../”
المثل السابق لكن معكوس الطلب عوض /etc/hosts فهو /../../etc/hosts

OS Commanding

أضن من وقع فيه لم يعد إستعماله هذه اللعبة وهي عبارة عن تطبيق الأوامر عبر php ورد محتوها متناسيا أن يمكن إضافة أكثر من أمر بإستعمال “|” أو “;”
مثال تطبيق لعمل ping بما يتركه المستخدم في الخانة وذالك المستخدم تذهب يده قليلا ويضع
127.0.0.1;rm -rf
الحل هو تخصيص أكثر لأخذ المعلومة وليس تطبيقها وهذا أترك لكم البحث عن كيفية حمايته

Null Byte

قنبلة موقوتة لأنه بإستعمال هذه الثغرة فإننا نوقف عمل الخادم في إكمال ما كان يبحث عنه ونوقف عمل كل معالجة المعلومات المرسلة مثال في إذا رفعنا ملف بتنسيق test.php%00.jpg ما سيراه الخادم هو test.php عند طلب الملف
لكن هذه المرة ليس لها حل إلى أن تكون magic_quotes_gpc مغلقة off

Brute Force

وهو عمل تطبيق منتضم لإستخراج مثل كلمة المرور لتطبيقك الويب وهذا يوجد له أكثر من حل لكن بعض الحلول تموت عند وجود طلب GET
إستعمال captcha ويستحسن في كم طلب خاطئ
إستعمال توليد token
إستعمال كم دخول خاطئ بإستعمال ip أو الكوكيز

DVWA

ما شرحه أخونا Boubakr في التعليق وتحميل ومعلومات أكثر http://www.dvwa.co.uk
بالتوفيق

محمد حنين

الإسم الكامل محمد حنين أحد geek من أمد طويل ، مطور ويب، محب للحرية، مستعمل نضام لينوكس، وأخيرا مجرم باللغة العربية للأسف في وقتها. معلومات أكثر عني أو الإتصال بي Mohammed Hanine

You may also like...

2 تعليقان

  1. يقول Boubakr:

    ما شاء الله عليك أخي، موضوع شامل و متكامل
    يوجد مشروع DVWA مشروع تطبيق PHP مفتوح المصدر كبيئة لاختبار حماية تطبيقات الويب تحتوي على أشهر الثغرات.
    تحياتي…

  1. فبراير 6, 2012

    […] لتحسين الأمن في تلك التطبيقات المبرمجة. في أخر شرح أمن وحماية مواقع الويب بي أتش بي كنت أقصد المبرمج لكن هذه المرة أقصد القائمين على […]

اترك تعليقاً

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