You are on page 1of 187

‫إعداد ‪:‬محمد سعود الدهٌمً‬

‫مراجعة وإشراف ‪ :‬د‪.‬خالد سلٌمان الغثبر‬


‫‪ 0202‬م‪ 0340-‬هـ‬

‫‪1‬‬
‫عن الكاتب‬
‫‪ ‬محمد بن سعود الدهٌمً‬
‫مطور ومبرمج مواقع وأنظمة‪ ,‬وكذلك مهتم فً أمن المعلومات ‪ .‬له عدة‬
‫مشارٌع ومواقع من ضمنها موقع تجارب ‪. www.tagarub.com‬‬

‫للتواصل مع الكاتب ‪:‬‬

‫‪m.s.aldeheme@gmail.com‬‬ ‫البرٌد اإللكترونً ‪:‬‬

‫عن المراجع والمشرف‬


‫‪ ‬د‪ .‬خالد بن سلٌمان الغثبر‬
‫مدٌر مركز التمٌز ألمن المعلومات ( ‪. )www.coeia.edu.sa‬‬

‫‪2‬‬
‫فهزس انًحتىياث‬
‫‪7‬‬
‫‪................................‬‬
‫‪.............‬‬ ‫‪................................................................................................‬‬ ‫المقدمـــــة‬
‫‪7.. ................................................................................................‬‬
‫‪................................‬‬ ‫أهداف الكتاب ‪:‬‬
‫‪7................................................................................................‬‬
‫‪..............................‬‬ ‫ٌهدف الكتاب إلى ‪:‬‬
‫‪7.. ................................................................................................‬‬
‫‪................................‬‬ ‫منهجٌة الكتاب ‪:‬‬
‫‪8‬‬
‫‪............................‬‬
‫‪................................‬‬‫‪................................................................‬‬ ‫األدوات المستخدمة ‪:‬‬
‫‪8‬‬
‫‪...........................‬‬
‫‪................................‬‬‫‪................................................................‬‬ ‫الدوافع وراء الكتاب ‪:‬‬
‫‪ٕٔ.. ................................................................................................‬‬
‫‪................................‬‬ ‫مفاهٌم البد منها ‪:‬‬
‫ٕٔ‬
‫‪....................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫أمن المعلومات]‪[IA] [InformationAssurance‬‬
‫ٕٔ‬
‫‪...................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫سرٌة المعلومات ]‪[IS] [Information Security‬‬
‫ٕٔ‬
‫‪................................‬‬
‫‪............‬‬ ‫‪................................................................‬‬ ‫شروط تصمٌم نظام برمجً آمن‬
‫ٖٔ‬
‫‪................................‬‬
‫‪.........‬‬ ‫‪................................................................‬‬ ‫عناصر األمان فً نظام المعلومات‬
‫ٗٔ‬
‫‪................................‬‬
‫‪...............‬‬ ‫‪................................................................‬‬ ‫الثغرات ]‪:[Vulnerability‬‬
‫‪ٔٗ................................................................................................‬‬
‫‪...............................‬‬ ‫الخطر ]‪: [Risk‬‬
‫‪ٔٙ‬‬
‫‪....................‬‬
‫‪................................‬‬‫‪................................................................‬‬ ‫أنواع الهجوم ]‪[Attacks‬‬
‫‪ٔ7‬‬
‫‪............................‬‬
‫‪................................................................................................‬‬ ‫الجرائم اإللكترونٌة‬
‫ٕٓ‬
‫‪................................‬‬
‫‪..............‬‬ ‫‪................................................................‬‬ ‫ً‬
‫وحدوثا‬ ‫أكثر عشرٌن ثغرة انتشارً ا‬
‫ٕٔ‬
‫‪.............................‬‬ ‫عدم التحقق من صحة المعلومات المدخلة بشكل صحٌح ]‪[Improper Input Validation‬‬
‫ٕ٘‬
‫‪................................‬‬
‫‪.........‬‬ ‫الحلول المتوافرة لمشكلة (عدم التحقق من صحة المعلومات المدخلة بشكل صحٌح )‬
‫ٖٔ‬
‫‪...................‬‬
‫‪................................‬‬ ‫الطلبات المزٌفة عبر الموقع ]‪[Cross-Site Request Forgery] [CSRF‬‬
‫‪ٖ8‬‬
‫‪................................‬‬
‫‪.............‬‬ ‫‪................................‬‬ ‫الحلول المتوفرة لمشكلة (الطلبات المزٌفة عبر الموقع)‬
‫ٖٗ‬
‫‪......................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحقن االستعالمٌة ]‪[SQL Injection] [SQLI‬‬
‫‪ٗ8‬‬
‫‪........................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (الحقن االستعالمٌة)‬
‫‪ٖ٘................................................................‬‬
‫‪..............................‬‬ ‫اإلخالل بالشروط ]‪[Race Condition‬‬
‫‪٘7‬‬
‫‪.........................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوفرة لمشكلة (اإلخالل بالشروط)‬
‫ٓ‪ٙ‬‬
‫‪...................‬‬
‫‪................................‬‬ ‫رسائل الخطأ المسربة للبٌانات ]‪[Error Message Information Leak‬‬
‫ٗ‪ٙ‬‬
‫‪................................‬‬
‫‪.........‬‬ ‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (رسائل الخطأ المسربة للبٌانات)‬
‫‪ٙ9‬‬
‫‪................................‬‬
‫‪.........‬‬ ‫‪................................‬‬ ‫حقنة أوامر نظم التشغٌل ]‪[OS Command Injection‬‬
‫ٖ‪7‬‬
‫‪................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (حقنة أوامر نظم التشغٌل)‬
‫‪7ٙ‬‬
‫‪....................‬‬ ‫نقل البٌانات الحساسة بشكل واضح ]‪[Cleartext Transmission of Sensitive Information‬‬
‫‪79‬‬
‫‪................................‬‬
‫‪... ................................‬‬ ‫الحلول المتوافرة لمشكلة (نقل البٌانات الحساسة بشكل واضح)‬
‫ٔ‪8‬‬
‫‪................................‬‬
‫‪...‬‬ ‫التحكم الخارجً بالملفات أو الروابط []‪External Control of File Name or Path‬‬

‫‪3‬‬
‫‪8ٖ. ................................‬‬
‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (التحكم الخارجً بالملفات أو الروابط)‬
‫‪8ٙ‬‬
‫‪................................‬‬
‫‪..........‬‬ ‫‪................................‬‬ ‫البرمجة عبر الموقع ]"‪[Cross-Site Scripting "XSS‬‬
‫ٕ‪9‬‬
‫‪.....................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (البرمجة عبر الموقع)‬
‫‪97‬‬
‫‪................................‬‬
‫‪.... ................................................................‬‬ ‫استدعاء الملفات ]‪[file Inclusion‬‬
‫ٖٓٔ‬
‫‪.......................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (استدعاء الملفات)‬
‫‪ٔٓٙ‬‬
‫‪................................‬‬
‫‪....‬‬ ‫التحكم الخارجً بحالة المعلومات]‪[External Control of Critical State Data‬‬
‫‪ٔٓ9.. ................................‬‬
‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (التحكم الخارجً بحالة المعلومات)‬
‫ٖٔٔ‬
‫‪................................‬‬
‫‪... ................................‬‬ ‫مسار البحث غٌر الموثوق ]‪[Untrusted Search Path‬‬
‫٘ٔٔ‬
‫‪................................‬‬
‫‪...........‬‬ ‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (مسار البحث غٌر الموثوق)‬
‫‪ٔٔ7‬‬
‫‪....‬‬ ‫إغالق أو التخلص من المصادر بطرٌقة غٌر صحٌحة ]‪[Improper Resource Shutdown or Release‬‬
‫ٕٓٔ‬
‫‪................................‬‬
‫‪.........‬‬ ‫الحلول المتوافرة لمشكلة (إغالق أو التخلص من المصادر بطرٌقة غٌر صحٌحة)‬
‫ٕ٘ٔ‬
‫‪.................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحسابات الخاطئة ]‪[Incorrect Calculation‬‬
‫‪ٕٔ8‬‬
‫‪.....................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (الحسابات الخاطئة)‬
‫ٕٖٔ‬
‫‪...................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫حقن النصوص البرمجٌة ]‪[Code Injection‬‬
‫‪ٖٔٙ‬‬
‫‪................................‬‬
‫‪.............‬‬ ‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (حقن النصوص البرمجٌة)‬
‫‪ٖٔ8‬‬
‫‪................................‬‬
‫‪...........‬‬ ‫‪................................‬‬ ‫اإلنشاء الغٌر صحٌح ]‪[Improper Initialization‬‬
‫ٔٗٔ‬
‫‪..................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (اإلنشاء الغٌر صحٌح)‬
‫ٖٗٔ‬
‫‪..........................‬‬ ‫التحكم بالوصول بطرٌقة غٌر صحٌحة ]‪[Improper Access Control Authorization‬‬
‫‪ٔٗ7‬‬
‫‪............................‬‬
‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (التحكم بالوصول بطرٌقة غٌر صحٌحة)‬
‫‪ٔٗ9‬‬
‫‪.........‬‬ ‫استخدام طرٌقة تشفٌر خطرة أو مدمرة []‪Use of a Broken or Risky Cryptographic Algorithm‬‬
‫ٔ٘ٔ‬
‫‪..........................‬‬
‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (استخدام طرٌقة تشفٌر خطرة أو مدمرة)‬
‫٘٘ٔ‬
‫‪................................‬‬
‫‪...........‬‬ ‫‪................................‬‬ ‫كلمة المرور المدمجة ]‪[Hard-Coded Password‬‬
‫‪ٔ٘8‬‬
‫‪.................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (كلمة المرور المدمجة)‬
‫إسناد الصالحٌات غٌر اآلمنة للمصادر الحساسة ‪[Insecure Permission Assignment for Critical‬‬
‫ٕ‪ٔٙ‬‬
‫‪..........................‬‬
‫‪................................................................................................‬‬ ‫]‪: Resource‬‬
‫٘‪ٔٙ‬‬
‫‪................‬‬
‫‪................................‬‬ ‫الحلول المتوافرة لمشكلة (إسناد الصالحٌات غٌر اآلمنة للمصادر الحساسة)‬
‫‪ٔٙ9‬‬
‫‪..................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫الثغرات البرمجٌة التً اهتمتها بها منظمة ]‪[OWASP‬‬
‫ٓ‪ٔ7‬‬
‫‪...........................‬‬
‫‪................................................................‬‬ ‫فٌض الذاكرة ]‪: [Buffer Overflows‬‬
‫‪ٔ7ٕ................................................................‬‬
‫‪..............................‬‬ ‫اختراق حساب معٌن و إدارة الجلسات‬
‫ٕ‪ٔ7‬‬
‫‪................................‬‬
‫‪...... ................................‬‬ ‫]‪[Broken Account and Session Management‬‬
‫‪ٔ7٘.. ................................................................‬‬
‫‪................................‬‬ ‫اإلعدادات الخاصة بالموقع والخادم‬
‫‪ٔ7٘................................‬‬
‫‪..............................‬‬ ‫]‪: [Web and Application Server Misconfiguration‬‬

‫‪4‬‬
‫‪ٔ79‬‬
‫‪................................‬‬
‫‪............‬‬ ‫‪................................................................................................‬‬ ‫التشفٌر‬
‫‪ٔ79‬‬
‫‪..................‬‬
‫‪................................‬‬‫‪................................‬‬ ‫التشفٌر المتناظر (‪: )Symmetric Algorithms‬‬
‫‪ٔ79‬‬
‫‪................................‬‬
‫‪.............‬‬ ‫‪................................‬‬ ‫التشفٌر غٌر المتناظر (‪)Asymmetric Algorithms‬‬
‫ٖ‪ٔ8‬‬
‫‪................................‬‬
‫‪... ................................‬‬ ‫الطرٌقة المبتكرة فً حفظ الحقوق و منع ثغرة الحقن االستعالمٌة ‪:‬‬
‫ٗ‪ٔ8‬‬
‫‪................‬‬
‫‪................................‬‬‫‪................................................................‬‬ ‫فوائد استخدام هذه التقنٌة ‪:‬‬
‫ٗ‪ٔ8‬‬
‫‪..................‬‬
‫‪................................‬‬‫‪................................................................‬‬ ‫طرٌقة عمل هذه التقنٌة ‪:‬‬
‫‪ٔ87‬‬
‫‪................................‬‬
‫‪............‬‬ ‫‪................................................................................................‬‬ ‫الخاتمة‬

‫‪5‬‬
6
‫المقدمـــــة‬
‫أهذاف انكتاب ‪:‬‬
‫ٌهدف الكتاب إلى ‪:‬‬
‫إبراز أهم المشاكل التً تتعرض لها المواقع اإللكترونٌة ‪ ,‬و عرض وتحلٌلل كلل مشلكلة‬
‫برمجٌة بشكل مستقل عن المشاكل األخرى ‪ ,‬وإبراز األخطاء البرمجٌة التً قلد ٌرتكبهلا‬
‫كثٌلللر ملللن المبلللرمجٌن‪,‬باإلضلللافة إللللى علللرض طلللرق االسلللتغالل الممكنلللة لكلللل ثغلللرة ‪,‬‬
‫وعللرض وتحلٌللل الحلللول المناسللبة لكللل ثغللرة ‪ ,‬و وضللع بعللض النصللائح لكللً ٌسللتفٌد‬
‫ضا تقلٌل وقت المبرمج العربً فً إٌجاد الحلول المناسبة لكلل‬ ‫المبرمج العربً منها‪ .‬وأٌ ً‬
‫مشكلة برمجٌة قد ٌعانً منها‪,‬وكذلك إثراء المحتوى العربلً بملا ٌتعللق بالبرمجلة بشلكل‬
‫آمللن‪ ,‬أخٌللرً ا زٌللادة ثقافللة المبللرمج العربللً و جعل ل علللى معرفللة بالمشللاكل التللً قللد‬
‫ٌتعرض لها‪.‬‬

‫يُهجيت انكتاب ‪:‬‬


‫اخللتص الكتللاب بعللرض و تحلٌللل المشللاكل البرمجٌللة الخاصللة بلغللة ]ٔ‪ , [PHP‬وأٌ ً‬
‫ضللا‬
‫اعتمللد علللى التنصللٌف المعتمللد مللن قبللل المنظمتللٌن]ٕ‪ , [SANS‬و ]ٖ‪ [OWASP‬حٌللث‬
‫أنهملللا ملللن المنظملللات الرائلللدة فلللً مجلللال أملللن المعلوملللات ‪ ,‬فمنظملللة ]‪ [SANS‬قاملللت‬
‫بتنصٌف أهم و أخطر الثغرات انتشلارً ا وهلً خمل وعشلرون ثغلرة وهلذه الثغلرات قلد‬
‫تحدث على فً كثٌر من اللغات البرمجٌة ‪ ,‬أما ]‪ [OWASP‬فتملك قائملة بعشلر ثغلرات‬
‫برمجٌة متخصصة فً لغة ]‪ .[php‬قمنلا بدارسلة جمٌلع الثغلرات التلً قاملت المنظمتلان‬
‫بتصنٌفهما ‪,‬ودمج الثغرات الموجودة فً كال القائمٌن بعنوان موحد ‪,‬وكلذلك قمنلا بشلر‬
‫بعلض الثغللرات بشللكل سلطحً ألنهللا تحللدث عللى مسللتوى الخللادم وهلذا الكتللاب مخللتص‬
‫بالثغرات التً تحلدث عللى مسلتوى اللنص البرمجلً ‪,‬فكلان مجملوع الثغلرات التلً قمنلا‬
‫بشللرحها (عشللرون ثغللرة تللم اعتمادهللا مللن ]‪ [SANS‬وخم ل ثغللرات تللم اعتمادهللا مللن‬
‫ضلا قمنلا بعملل دراسلة دقٌقلة وإٌجلاد أمثللة واقعٌلة لجمٌلع الثغلرات ‪ ,‬و‬ ‫]‪, [OWASP‬وأٌ ً‬

‫ٔ‬
‫‪ )php( Hypertext Preprocessor‬هً لغة نصٌة صممت لبرمجة تطبٌقات االنترنت وهً مفتوحة المصدر ‪,‬تستطٌع االستزادة عن طرٌق الرابط ‪:‬‬
‫‪http://en.wikipedia.org/wiki/PHP‬‬
‫ٕ تستطٌع الذهاب لمنظمة (‪ [SANS] )Computer Security Training, Network Research & Resources‬عن طرٌق الرابط ‪:‬‬
‫‪www. SANS.org‬‬
‫ٖ تستطٌع الذهاب لمنظمة ( ‪ [OWASP])The Open Web Application Security Project‬عن طرٌق الرابط ‪:‬‬
‫‪www.owasp.org‬‬

‫‪7‬‬
‫كٌفٌة استغاللها من قبل المهاجم أو المخترق ‪ ,‬وفً الوقلت نفسل إٌجلاد الحللول المناسلبة‬
‫والمقترحة للمبرمج العربً لسد هذه الثغرات ‪.‬‬

‫األدواث انًستخذيت ‪:‬‬


‫لقللد قمنللا باسللتخدام عللدة أدوات برمجٌللة أثنللاء العمللل فللً هللذا المشللروع ‪ ,‬منهللا محللرر‬
‫النصللوص البرمجٌللة للغللة الللـ ]‪ [php‬هللو ]ٗ‪ , [PHP Expert Editor‬وأٌ ً‬
‫ضللا الخللادم‬
‫المسللتخدم لتنفٌللذ النصللوص البرمجٌللة ‪,‬و هللو ]٘‪, [The AppServ Open Project‬‬
‫وإصلللدار لغلللة اللللـ ]‪ [php‬هلللو ]‪ , [4.3.4‬وكلللذلك اسلللتخدمت المتصلللفح ‪[Internet‬‬
‫]‪ , Explorer 8ٙ‬لتنفٌذ الثغرات البرمجٌة ‪.‬‬

‫انذوافغ وراء انكتاب ‪:‬‬


‫من أحد الدوافع وراء دراسة الثغرات البرمجٌة توضٌح الخطر الحالً والمستقبلً على‬
‫المواقع العربٌة إذا لم ٌتم تدارك الوضع الحالً ! ‪ ,‬حٌث إن استغالل الثغرات البرمجٌة‬
‫سهل ج ًدا‪ ,‬ولذلك ٌستطٌع المهاجم اختراق المواقع وتدمٌرها‪ ,‬دون أن ٌمتلك الخبرات‬
‫الكافٌة فً البرمجة‪ ,‬وكذلك ال ننسى أن حٌاة اإلنسان أصبحت تعتمد على المعلومة ! ‪,‬‬
‫فقد تتحول حٌاة اإلنسان إلى جحٌم بسبب أن المعلومات الخاص ب تغٌرت ‪ ,‬وأصبح‬
‫عندها مطلوبًا للعدالة بعدما كان إنسا ًنا معتدالً ‪,‬فعلى سبٌل المثال ‪ ,‬عندما ٌستطٌع‬
‫المهاجم الوصول إلى قواعد البٌانات وتعدٌلها وتغٌٌر المعلومات الخاصة بالمواطنٌن‪,‬‬
‫عندها قد ٌتحول المواطن السوي إلى مواطن مطلوب أمنًٌا ‪ ,‬والعك صحٌح ‪.‬‬
‫أضع بٌن ٌدٌك أخً القارئ بعض المشاهدات ‪ ,‬والتً تمت باسلتخدام األداة الخاصلة‬
‫بكشف الثغرات البرمجٌة فً المواقع اإللكترونٌلة ‪[Acunetix Web Vulnerability‬‬
‫]‪: Scanner7‬‬

‫ٗ‬
‫‪ PHP Expert Editor‬هو عبارة عن برنامج ٌحتوي على واجهة رسومٌة تسهل على المبرمج التعامل مع لغة )‪ٌ, (php‬حتوي على أربع أجزاء من‬
‫ضمنها محرر للنصوص البرمجٌة ‪ ,‬تستطٌع االستزادة عن طرٌق الرابط ‪http://www.ankord.com/phpxedit.html :‬‬

‫٘ هو عبارة عن حزمة تحتوي على (‪, Apache‬و‪,PHP‬و‪, MySQL‬و‪ ) phpMyAdmin‬تستطٌع االستزادة عن طرٌق الرابط ‪:‬‬
‫‪http://www.appservnetwork.com/modules.php?name=Content&pa=showpage&pid=7‬‬
‫‪ٙ‬‬
‫هو عبارة عن متصفح إنترنت ‪ ,‬وٌستخدم لتصفح المواقع ‪,‬و كذلك تمت مبرمج من قبل شركة (‪, )microsoft‬لالستزادة عن طرٌق‬
‫الرابط ‪http://www.microsoft.com/windows/internet-explorer/default.aspx‬‬
‫‪7‬‬
‫هو برنامج ٌقوم بفصح المواقع ‪,‬واكتشاف الثغرات البرمجة ‪,‬وكذلك إعطاء تقرٌر عنها ‪,‬لالستزادة عن طرٌق الرابط‬
‫‪http://www.acunetix.com‬‬

‫‪8‬‬
‫طبق لا ً لصحصللائٌات التللً أجرتهللا م سسللة ]‪ ,[Acunetix8‬فقللد أظهللرت الدراسللة التللً‬
‫أجرٌت فً عام ‪ ٕٓٓٙ‬م على أكثر من ٓٓٓٓٔ موقلع إلكترونلً منهلا ٕٖٓٓ موقلع‬
‫غٌللر تجللاري أن ٓ‪ %7‬مللن المواقللع اإللكترونٌللة تتعللرض لمشللاكل أمنٌللة خطللرة تهللدد‬
‫استقرار المواقع اإللكترونٌة ‪.‬‬
‫بمتوسللط ٔ‪ %9‬مللن هللذه المواقللع تعللانً مللن نقللاط ضللعف إمللا أن تكللون ثغللرة حقنللة‬
‫االسلتعالم أو مللا ٌعلرف بللـ ]‪ ,[SQL Injection‬أو أنهللا تعلانً مللن ثغلرة البرمجللة عبللر‬
‫الموقع ]‪. [Cross-site scripting‬‬

‫ٓ٘‪ %‬من ثغرات هذه المواقلع كانلت تشلكلها ثغلرة حقنلة االسلتعالم ‪ ,‬و ٕٗ‪ %‬كلان ملن‬
‫نصٌب البرمجة عبر الموقع ‪ ,‬عزٌزي القارئ هذه النسب مرتفع جلداً وتسلبب أضلرارً ا‬
‫وخٌمة للمستخدم النهائً ‪ ,‬أو مدٌر الم سسة ‪ ,‬أو الدائرة الحكومٌة انظر الشكل ٔ ‪.‬‬

‫شكل ‪0.1‬‬

‫لقد قمت بتجربلة األداة ]‪ [Acunetix‬عللى ملا ٌقلارب سلبعة مواقلع إلكترونٌلة ‪ ,‬واتضلح‬
‫لً أن ستة من هذه المواقلع تعلانً ملن مشلاكل أمنٌلة خطٌلرة ‪ ,‬بلل إن أحلد هلذه المواقلع‬
‫وهلو ملن المواقلع المعروفلة بل أكثلر ملن ٗ‪ ٔ7‬ثغلرة وكانلت ملن نلوع “ البرمجلة عبلر‬
‫الموقع” وبال شك أن المواقع األخرى بها ثغرات أمنٌة منوعة ‪ ,‬ففٌها ملا هلو خطلر جلداً‬
‫ومتوسط الخطورة ‪ ,‬و ثالثها ‪ ,‬و هو أقلها خطورة ‪ ,‬أو أن ال ٌشكل خطراً نهائٌا ً ‪.‬‬
‫واتضح لً من خالل التجربة أن هنلاك مشلاكل تتعللق بالخلادم ]‪ , [server‬فملع األسلف‬
‫الشللدٌد ف ل ن كثٌللراً مللن هللذه المواقللع ال تهللتم بالتحللدٌثات الخاصللة بلغللات البرمجللة مثللل‬
‫]‪ ,[php‬أو قد ال ٌكون لدى صاحب الخادم المعرفة التامة بـالمنافذ ]‪ [ports‬التً ٌجب‬
‫‪8‬‬
‫الرابط الخاص بم سسة ]‪ [acunetix‬هو ‪[http://www.acunetix.com] :‬‬

‫‪9‬‬
‫إغالقها أو فتحها ‪ ,‬فلذلك ٌجب علٌك أخً المبرمج الحرص الشدٌد عنلد اختٌلار الشلركة‬
‫أو المنظمللة التللً سلتمنحك المسللاحة الخاصللة بللك لتضللع موقعللك علٌهللا ‪ ,‬فهنللاك مشللاكل‬
‫وثغرات تحدث على مستوى الخادم وهً فً الغالب لٌ للمبرمج سٌطرة علٌها ‪ ,‬وإنملا‬
‫التحكم فً هذه الثغرات ٌتم من خالل المدٌر و المس ولٌن عن الخادم ! ‪.‬‬

‫‪10‬‬
11
‫مفاهٌم البد منها‬
‫قبل البدء فً سرد التفاصٌل المتعلقة بالكتاب أجد أن من المالئم توضٌح بعض المفاهٌم‬
‫والمصطلحات المهمة التً سترد فً موضوعات الكتاب‪:‬‬

‫]‪:[IA‬‬ ‫أيٍ انًؼهىياث]‪[InformationAssurance‬‬


‫ٌقصد بأمن المعلومات حماٌة وتأمٌن كافة الموارد المستخدمة فً معالجة‬
‫المعلومات‪.‬وٌتم ذلك عن طرٌق اتباع إجراءات و وسائل حماٌة عدٌدة تضمن فً‬
‫النهاٌة سالمة المعلومات وهً الكنز الثمٌن الذي ٌجب على المنشأة الحفاظ علٌ ‪.‬‬
‫وبمعنى آخر هو حماٌة المعلومات لمنع وصول األشخاص غٌر المسمو لهلم الحصلول‬
‫علٌها وضمان سرٌتها و وصولها بشكل سللٌم دون إجلراء أي تعلدٌل أو تغٌٌلر لمحتواهلا‬
‫األصلً‪.‬‬

‫سزيت انًؼهىياث ]‪[IS] [Information Security‬‬


‫هً عملٌة حماٌة المعلومات بحٌث ٌتحقق ما ٌلً‪:‬‬

‫‪ ‬الخصوصٌة ]‪ : [Confidentiality‬عرض المعلوملات لصلاحب الصلالحٌة لالطلالع‬


‫علٌها فقط‪.‬‬
‫‪ ‬سالمة المعلومات ]‪ :[Integrity‬التأكد من صحة المعلومات وأن لم ٌطرأ علٌهلا تغٌٌلر‬
‫سواء عم ًدا أو دون قصد‪.‬‬
‫‪ ‬اإلتاحة ]‪ : [Availability‬وٌقصد بها توفٌر المعلومات المطلوبة للمستفٌد عند طلبها‪.‬‬

‫وٌمكن اختصار مسمٌات المتطلبات بـ ]‪[CIA‬‬


‫الحظ أن مفهوم أمن المعلومات أعم من سرٌة المعلومات‪.‬‬

‫شزوط تصًيى َظاو بزيجي آيٍ‪:‬‬


‫‪ ‬قابلٌت للتحكم ]‪:[ Controllability‬وٌقصد بها السما لمدٌر النظام بالتحكم الكامل فلً‬
‫الصالحٌات‪.‬‬

‫‪12‬‬
‫‪ ‬السلللالمة والتكاملللل ]‪:[ Integrity‬وتعنلللً قلللدرة النظلللام عللللى حماٌلللة نفسللل و فلللرض‬
‫خصوصٌة على بٌانات و معلومات المستفٌدٌن بحٌث ال ٌستفٌد منها إال من لل صلالحٌة‬
‫لذلك‪.‬‬
‫‪ ‬القابلٌة للفحص والمراجعة ]‪ :[ Auditability‬هً خاصٌة تمكن من فحلص ومراجعلة‬
‫النظلام وٌكلون ذللك علن طرٌلق تقلارٌر تلفللت االنتبلاه إللى سللوك غٌلر مشلروع ملن قبللل‬
‫المستخدمٌن ‪.‬‬
‫وٌمكن اختصار مسمٌات المتطلبات بـ ]‪ [CIA‬كما فً متطلبات سرٌة المعلومات ! ‪.‬‬

‫ػُاصز األياٌ في َظاو انًؼهىياث‪:‬‬


‫تمٌٌزززز المسزززتفٌد (التعرٌزززف) ‪:[Identification]:‬وهلللً التعلللرف عللللى المسلللتفٌد ملللن‬ ‫ٔ‪.‬‬
‫الخدمة إما عن طرٌق اسم المستخدم أو رقم خاص ب )‪.(User ID‬‬
‫التأكد من شخصٌة المستفٌد (التصدٌق) ]‪:[User Authentication‬وٌتم ذلك بطلرق‬ ‫ٕ‪.‬‬
‫عدٌللدة منهللا‪:‬كلمللة المللرور‪-‬البصللمة –هندسللة الٌللد‪ -‬الوجل ‪-‬بطاقللات التعرٌللف الممغنطللة‪-‬‬
‫بصمة الصوت ‪-‬التوقٌع وغٌرها من الوسائل المتعددة‪.‬‬
‫ضزززوابط اسزززتخدام المعلومزززات ]‪:[Access control‬وتعنلللً فلللرض قواعلللد واضلللحة‬ ‫ٖ‪.‬‬
‫الستخدام المعلومات ال ٌمكن الحٌاد عنها أو االلتفاف حولها من جانب أحلد المسلتخدمٌن‬
‫وبعبارة أخرى هً تحدٌد من ٌحق ل الوصول إلى المعلومة‪.‬‬
‫إدارة ضوابط استخدام المعلومات ]‪:[Administration‬وهً االمكانٌات التلً ٌلتم بهلا‬ ‫ٗ‪.‬‬
‫منح أو نزع الصالحٌات من المستفٌدٌن‪.‬‬
‫تسززجٌل الوقززا ع ]‪:[Logging‬تقللوم معظللم األنظمللة التللً تتللوخى األمللن بتسللجٌل وقللائع‬ ‫٘‪.‬‬
‫اسلتخدام المعلوملات‪ ,‬مثلل حللاالت فشلل اللدخول إللى النظام‪,‬وحللاالت الخطلأ فلً إدخللال‬
‫كلمة المرور‪,‬وتكرار محاوالت الدخول الخاطئة إلى النظام من مستفٌد معٌن‪,‬وهكذا‪.‬‬
‫إخراج التقارٌر ]‪: [Reporting‬وٌقصد بها ترتٌب وتحلٌلل البٌانلات التلً ٌلتم تسلجٌلها‬ ‫‪.ٙ‬‬
‫عن الوقائع األمنٌة وإخراجها فً شكل تقارٌر واضحة تسلهل فهلم الوقلائع واللربط بٌنهلا‬
‫وتساعد بذلك على التصرف بشأنها بالشكل الصحٌح‪.‬‬
‫اإلنذار ]‪:[Alarms‬تصدر معظم األنظمة األمنٌة إنذارات تكلون عللى هٌئلة رسلائل ملن‬ ‫‪.7‬‬
‫خالل لوحة التحكم ]‪ , [Control Panel‬وهذه اإلنذارات تعتمد على تسجٌل الوقائع ‪.‬‬
‫الرسزززا ل ]‪:[Messages‬بعلللض اللللنظم تصلللدر رسلللائل إللللى المسلللتفٌدٌن ملللن ملللالكً‬ ‫‪.8‬‬
‫المعلومات عن استخدام هذه المعلومات أو أي تعدٌل ٌطرأ علٌها‪.‬‬

‫‪13‬‬
‫‪ .9‬تخزٌن المعلومات السرٌة بطرٌقة سرٌة‪:‬وٌكلون هلذا باسلتخدام التشلفٌر]‪[Encryption‬‬
‫أو البعثرة]‪. [Hashing‬‬
‫عززدم اإلنكززار ]‪ٌ: [Non-repudiation‬مكللن تطبٌللق هللذا باسللتخدام التوقٌعللات‬ ‫ٓٔ‪.‬‬
‫الرقمٌة‪.‬‬

‫انثغزاث ]‪:[Vulnerability‬‬
‫الثغرة هو ضعف أو خلل بالنظام ٌلتمكن ملن خاللل المهلاجم أو المختلرق ]‪[Attacker‬‬
‫من استغالل النظام بطرٌقلة غٌلر مشلروعة وقلد تسلبب أضلراراً بالغلة‪ .‬وتنشلأ الثغلرات‬
‫نتٌجة أحد األسباب التالٌة‪:‬‬

‫ضعف كلمات المرور ]‪[Weak Passwords‬‬ ‫‪‬‬


‫األخطاء البرمجٌة ]‪[Software Bugs‬‬ ‫‪‬‬
‫الفٌروسات ]‪[Computer Virus‬‬ ‫‪‬‬
‫البرمجٌات الخبٌثة ]‪[Malware‬‬ ‫‪‬‬
‫سوء إعدادات الخادم]‪[misconfiguration] [server‬‬ ‫‪‬‬

‫انخطز ]‪: [Risk‬‬


‫هو احتمالٌة وجود تهدٌد ]‪ٌ [Threat‬مكن استغالل ومن ثلم ٌمكلن أن نطللق علٌل ثغلرة‬
‫]‪[Vulnerability‬‬

‫ومن هذا التعرٌف ٌمكن تقسٌم الخطر ]‪ [Risk‬إلى قسمٌن‪:‬‬

‫‪ ‬التهدٌد ]‪:[Threat‬وهو عملٌة المحاولة للوصول إلى المعلومات السرٌة‪.‬‬


‫]‪[Vulnerabilities‬‬ ‫‪ ‬الثغللللللللللللللللللللللللللللللللللللللللللللللللللرات‬

‫وٌوضح الشكل التالً هذا المعنى‪:‬‬

‫‪14‬‬
‫وٌسللتخدم هللذا المصللطلح لوصللف المخللاطر ]‪ [Risks‬التللً ٌللتم تفعٌلهللا بوجللود كللل مللن‬
‫ضلا مصلطلحً ا‬ ‫عناصر التهدٌد ونقاط الضعف فً المنظومة األمنٌة كما أضاف العلماء أٌ ً‬
‫آخر وهو الـتأثٌر الذي ٌحدث الخطر]‪[Impact‬‬

‫والمعادلة التالٌة توضح كٌفٌة حساب المخاطر لمنظومة األمن‪:‬‬


‫‪Risk = Threats X Vulnerabilities X Impact‬‬

‫كلمللا زادت التهدٌللدات زادت المخللاطر‪ ,‬وكلمللا زادت نقللاط الضللعف أو الثغللرات فسللوف‬
‫ٌزداد الخطر بالـتأكٌد ‪,‬ولذلك سوف ٌزداد الخطر بحجم التأثٌر الخاص بالخطر كل ‪.‬‬
‫سوف نأخذ مثاالً مبسطا ً لهذه المعادلة من أرض الواقع ‪,‬لدٌك سٌارة لكن اإلنلذار معطلل‬
‫وموجودة فً منطقة تعج باللصوص ‪ ,‬كٌف تحسب الخطر هنا؟‬
‫الخطلللر = التهدٌلللد (علللدد اللصلللوص) ‪( X‬نقلللاط ضلللعف السلللٌارة) اإلنلللذار المعطلللل ‪X‬‬
‫(خسارتك لهذه السٌارة)‬
‫ًإذا الخطر كبٌر ج ًدا ولكن هل ٌمكنك التحكم فً التهدٌلد؟ بلالطبع ال ولكلن ٌمكنلك اللتحكم‬
‫فً نقاط الضعف ك صال اإلنذار!‬

‫‪15‬‬
‫أَىاع انهجىو ]‪[Attacks‬‬
‫هجوم التصنت على الرسائل ]‪[Interception Attacks‬‬ ‫ٔ‪.‬‬
‫وفكرة عمل هذا الهجوم أن المهاجم ٌراقب االتصال بٌن المرسل والمستقبل للحصول‬
‫على المعلومات السرٌة‪.‬‬
‫هجوم اإلٌقاف ]‪[Interruption Attacks‬‬ ‫ٕ‪.‬‬
‫ٌعتمد هذا النوع على قطع قناة االتصال إلٌقاف الرسالة أو البٌانات من الوصول‬
‫ضا رفض الخدمة ]‪[Denial of service‬‬ ‫للمستقبل وهو ما ٌسمى أٌ ً‬
‫هجوم تعدٌل الرسالة ‪[Modification Attacks]:‬‬ ‫ٖ‪.‬‬
‫هنا ٌتدخل المهاجم بٌن المرسل والمستقبل (ٌعتبر وسٌط بٌن المرسل والمستقبل)‬
‫وعندما تصل إلٌ الرسالة ٌقوم بتغٌر محتوى الرسالة ومن ثم إرسالها إلى المستقبل ‪,‬‬
‫والمستقبل طبعا ال ٌعلم بتعدٌل الرسالة من قبل‪.‬‬
‫الهجوم المزور أو المفبرك‪[Fabrication Attacks] .‬‬ ‫ٗ‪.‬‬
‫وهنا ٌرسل المهاجم رسالة بوصف جهة ٌعرفها المستقبل وٌطلب من معلومات أو‬
‫كلمات سرٌة ‪.‬والشكل التالً ٌوضح أنواع الهجوم‬

‫‪ :Script Kiddies ‬هم من ٌقومون بعملٌات اختراق ولكن لٌسوا على دراٌة عالٌة‬
‫باالختراق وأمن المعلومات‪.‬‬

‫‪ ‬المهاجمون ]‪ : [Hackers‬هم األشخاص الذٌن ٌمتلكون مقدرة عالٌة على اإللمام‬


‫بتقنٌة المعلومات وباألخص كٌف تعمل أنظمة الحاسوب ‪Computer Systems‬‬
‫ضا ٌحب دائ ًما ابتكار طرق جدٌدة فً التعامل مع األنظمة التقنٌة‪ .‬والٌوم اختلف‬‫وأٌ ً‬
‫تعرٌف الهاكرز شٌ ًئا ما حٌث أصبحت كلمة (هاكرز) تطلق على من ٌخترقون األنظمة‬
‫ضا ‪ Black-hat‬ذوي‬ ‫وٌستولون على المعلومات بالسطو أو باإلتالف! وٌطلق علٌهم أٌ ً‬
‫القبعة السوداء أو ‪ Bad Guys‬وهناك هاكرز آخرون وهم الـ ‪ Ethical Hackers‬أو‬
‫ضا ‪ White-hat‬أي ذوي القبعات البٌضاء وهم‬ ‫الهاكرز األخالقٌون وهم ٌطلق علٌهم أٌ ً‬
‫من ٌتعلمون سبل االختراق من أجل الدفاع والتـامٌن والحماٌة ال من اجل اإلضرار‬
‫باآلخرٌن!‪.‬‬
‫ضا ‪ Gray-hats‬وهم الذٌن ٌقومون بالعملٌن من حٌن آلخر العمل غٌر‬ ‫وهناك أٌ ً‬

‫‪16‬‬
‫أخالقً والعمل األخالقً ! ‪.‬‬

‫‪Crackers ‬‬
‫كلمة ‪ Cracker‬تشٌر إلى الشخص الذي ٌستخدم تقنٌات الـ ‪ Hacking‬فً أمور غٌر‬
‫ضا إلى األشخاص الذٌن لدٌهم القدرة على كسر‬ ‫دفاعٌة وإنما ألذى اآلخرٌن‪ .‬وتشٌر أٌ ً‬
‫حماٌة البرامج أو التطبٌقات بشكل غٌر قانونً أو الذٌن لدٌهم مقدرة عالٌة ج ًدا فً‬
‫ضا عمل الهندسة العكسٌة ‪Reverse‬‬ ‫البرمجة والبرمجٌات وٌستطٌعون أٌ ً‬
‫‪ Engineering‬سواء للبرمجٌات أو لألنظمة‪.‬‬

‫انجزائى اإلنكتزوَيت‬

‫‪ ‬الجرٌمة المنظمة ]‪ :[Organized Cybercrime‬وهو ما تقوم ب عصابات‬


‫متخصصة فً الهجوم اإللكترونً على المواقع‪.‬‬

‫‪ ‬قد ال َتجد كلمة ‪ , Cybercrime‬أو الجرٌمة اإللكترونٌة فً معجم اللغة اإلنجلٌزٌَّة إالَّ‬
‫أن مصطلَح شائع ٌصف األعمال اإلجرامٌَّة المتعلِّقة بالعالم االفتراضً أو اإلنترنت ‪-‬‬
‫كما ٌطلق علٌ ‪ -Cyber Space‬وطب ًقا لتعرٌف المجل األوروبً ف نَّ الجرٌمة‬
‫اإللكترونٌَّة هً‪ :‬كل فعل إجرامً ضِ د شبكات الحاسوب أو است ِْخدام شبكات الحاسوب‬
‫استِخدا ًما ٌَ َت َرتب علٌه َتهدٌد لِعناصر أمن المعلومات الثالثة (توافر المعلومة‪ ,‬و سرٌة‬
‫المعلومة‪ ,‬وسالمتها)‪.‬‬

‫‪: Cyber Laws ‬هً قوانٌن وتشرٌعات تسعى بها الدول للحد من الجرائم اإللكترونٌة‪.‬‬

‫‪ ‬برامج توعٌة أمنٌَّة ]‪: [Security awareness Programs‬‬


‫برامج ال َّتوعٌة بأمن المعلومات من أكثر الطرق فعالٌة فً مُحاربة الجرٌمة‬
‫صا شدٌ ًدا ج ًّدا فً برامج ال َّتوعٌة بأمن‬
‫اإللكترونٌَّة‪ ,‬وجدٌر بالذكر أن هناك نق ً‬
‫المعلومات على مستوى األفراد والم سسات والحكومات مقارنة بالدول األخرى مثل‬
‫أوروبا والوالٌات الم َّتحدة‪ ,‬فالجهود فً الشرق األوسط ضئٌلة ج ًّدا‪.‬‬

‫‪17‬‬
18
19
‫انتشارا وحدو ًثا التً اهتمت بها‬
‫ً‬ ‫أكثر عشرٌن ثغرة‬
‫منظمة ]‪[SANS‬‬
‫اهتمت عدد من المنظمات الرسمٌة والجمعٌات بدراسة الثغرات البرمجٌة التً ت ثر‬
‫على األنظمة (التطبٌقات) ‪ ,‬وتجعلها عرضة لالختراق‪ ,‬ومن ثم حدوث خسائر أمنٌة‬
‫واقتصادٌة هائلة‪.‬ومن أبرز تلك المنظمات منظمة ]‪ [SANS‬التً تحرص بصفة دورٌة‬
‫ً‬
‫حدوثا وانتشارً ا ‪ ,‬وفٌما ٌلً عشرون‬ ‫على إصدار تقارٌر عن أكثر الثغرات األمنٌة‬
‫ثغرة التً اهتمت بها ]‪. [SNAS‬‬
‫الثغرة باللغة اإلنجلٌزٌة‬ ‫الثغرة باللغة العربٌة‬
‫‪Improper Input Validation‬‬ ‫عدم التحقق من صحة المعلومات المدخلة بشكل صحٌح‬
‫‪Cross-Site Request Forgery CSRF‬‬ ‫الطلبات المزٌفة عبر الموقع‬
‫]‪SQL Injection [SQLI‬‬ ‫الحقن االستعالمٌة‬
‫‪Race Condition‬‬ ‫اإلخالل بالشروط‬
‫‪Error Message Information Leak‬‬ ‫رسا ل الخطأ المسربة للبٌانات‬
‫‪OS Command Injection‬‬ ‫حقنة أوامر نظم التشغٌل‬
‫‪Cleartext Transmission of Sensitive‬‬ ‫نقل البٌانات الحساسة بشكل واضح‬
‫‪Information‬‬
‫‪External Control of File Name or Path‬‬ ‫التحكم الخارجً بالملفات أو الروابط‬
‫]‪Cross-Site Scripting [XSS‬‬ ‫البرمجة عبر الموقع‬
‫‪file Inclusion‬‬ ‫استدعاء الملفات‬
‫‪External Control of Critical State Data‬‬ ‫التحكم الخارجً بحالة المعلومات‬
‫‪Untrusted Search Path‬‬ ‫مسار البحث غٌر الموثوق‬
‫‪Improper Resource Shutdown or‬‬ ‫إغالق أو التخلص من المصادر بطرٌقة غٌر صحٌحة‬
‫‪Release‬‬
‫‪Incorrect Calculation‬‬ ‫الحسابات الخاط ة‬
‫‪Code Injection‬‬ ‫حقن النصوص البرمجٌة‬
‫‪Improper Initialization‬‬ ‫اإلنشاء الغٌر صحٌح‬
‫‪Improper Access Control Authorization‬‬ ‫التحكم بالوصول بطرٌقة غٌر صحٌحة‬
‫‪Use of a Broken or Risky‬‬ ‫استخدام طرٌقة تشفٌر خطرة أو مدمرة‬
‫‪Cryptographic Algorithm‬‬
‫‪Hard-Coded Password‬‬ ‫كلمة المرور المدمجة‬
‫‪Insecure Permission Assignment for‬‬ ‫إسناد الصالحٌات غٌر اآلمنة للمصادر الحساسة‬
‫‪Critical Resource‬‬

‫‪.‬‬

‫‪20‬‬
‫عدم التحقق من صحة المعلومات المدخلة بشكل صحٌح‬

‫]‪[Improper Input Validation‬‬

‫إن تعامللل النظللام(التطبٌللق)‪ ,‬أو الموقللع اإللكترونللً مللع المللدخالت المكتوبللة مللن قبللل‬
‫المستخدمٌن قد ٌ دي إلى مشاكل ملا للم ٌكلن هنلاك حلذر وحٌطلة ‪ ,‬وٌلزداد األملر تعقٌلداً‬
‫عندما ال ٌتعامل النظام مع االستثناءات ]‪ [expectations‬فهلذا ٌوللد مشلاكل عدٌلدة ‪,‬‬
‫‪9‬‬
‫موقع منظمة الـ ]‪ , http://cwe.mitre.org/top25/#CWE-20 [SANS‬وضعت منظمة الـ]‪ [SANS‬أرقامًا لكل ثغرة ‪ ,‬فرقم هذه‬
‫الثغرة ]‪[20‬‬

‫‪21‬‬
‫على سبٌل المثلال رقلم الموظلف ]‪ [identifier employee‬هلو رقلم صلحٌح ولكلن قلد‬
‫ٌحتللوي علللى أحللرف ! ولللذلك تكللون عملٌللة توقللع المللدخالت عملٌللة صللعبة علللى معظللم‬
‫المبرمجٌن وقد ٌحتاج إلى خبراء فً مجال اختبار النظم ]‪. [testing‬‬
‫على أي مستوى تحدث هذه الثغرة ؟ ما هزً اللغزات التزً تتزأثر بهزا؟ ومزا هزو مسزتوى‬
‫خطورتها ؟‬
‫تحدث هذه الثغرة على مستوى تصمٌم ‪ ,‬و هٌكلٌة ‪,‬و برمجة النظام ‪.‬‬
‫اللغات التً تتأثر بها جمٌع اللغات البرمجٌة بال استثناء وباألخص األنظمة التلً تتعاملل‬
‫مع المدخالت من الخارج وكذلك قامت منظمة ]‪ [Sans‬بتصلنٌف هلذه الثغلرة بأنهلا ذات‬
‫خطللورة عالٌللة ]‪ . [High‬عزٌللزي القللارئ ‪ ,‬سللوف أبللدأ بشللر األمثلللة بشللكل واف‬
‫وبطرٌقة سلسة لكً تتماشى مع جمٌع مستوٌات المبرمجٌن ‪.‬‬

‫?<‬

‫‪class pay‬‬

‫{‬

‫{)(‪function pay‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫سعر المنتج ‪$price =100; //‬‬

‫الكمٌة ‪$qty=$HTTP_POST_VARS['quantity']; //‬‬

‫;‪echo $chargeUser=$price*$qty‬‬

‫}‬

‫;}‬

‫;)(‪$start_new=new pay‬‬

‫>?‬

‫النص البرمجً ‪1.1‬‬

‫‪22‬‬
‫فللً المثللال السللابق ٌوجللد خطللأ برمجللً وهللو عللدم التأكللد مللن البٌانللات المسللتقبلة مللن‬
‫المستخدم لهذا النظلام ! فملن الممكلن أن ٌقلوم المسلتخدم بوضلع كمٌلة المنلتج علد ًدا سلال ًبا‬
‫وبالتلالً سللوف ٌكللون النللاتج مللن العملٌللة الحاسللبة قٌمللة سللالبة وبشللكل تلقللائً سللوف ٌللتم‬
‫خصم قٌمة المنتجات من حساب العمٌل ]‪ [chargeUser‬مع أن المفروض عكل ذللك‬
‫!‬
‫لتقرٌب الفكرة ! لو فرضنا أن قٌمة البضاعة]‪ [qty‬التً ٌرٌد الزائر شرائها ]‪([-50‬علدد‬
‫سللالب) ف نل بللال شللك أن النللاتج مللن عملٌللة الضللرب افترا ً‬
‫ضلا أنهللا ]‪ [-1000‬ومللن هنللا‬
‫ف ملن حسلاب الواجلب سلداده‬ ‫أصبح حساب الزائر ]‪ [-1000‬وهلذا ٌعنلً أن الزائلر حُل ِذ َ‬
‫لصاحب المنظمة ]‪ [-1000‬بدالً ملن إضلافة ]‪ [1000‬إللى المدٌونٌلة التلً ٌجلب سلدادها‬
‫إلى صاحب المنظمة(الموقع) ! ‪.‬‬
‫عزٌزي القارئ ‪ ,‬سوف أطر مثاالً آخر لعل الصورة تكون أوضح لجمٌلع المبلرمجٌن!‬
‫انظر إلى النص البرمجً رقم ‪.1.2‬‬

‫?<‬

‫‪class ex_2‬‬

‫{‬

‫{)(‪function ex_2‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$birthday = $HTTP_GET_VARS['birthday‬‬

‫; ;]'‪$homepage =$HTTP_GET_VARS['homepage‬‬

‫‪23‬‬ ‫;">‪echo "Birthday: $birthday<br>Homepage: <a href=$homepage>click here</a‬‬

‫}‬
‫فً النص ‪ 1.2‬عند استقبال المتغٌلرات ملن الخلارج دون أي تأكلد قلد ٌل دي إللى أخطلاء‬
‫برمجٌللة سللواء منطقٌللة كمللا شللاهدنا فللً المثللال األول أو أخطللاء مللن الممكللن اسللتغاللها‬
‫للتالعب باألشخاص وتحوٌلهم إلى مواقع تضر بهم ‪ ,‬فكما تشاهد فً المثال السابق قمنلا‬
‫باسلللتقبال المتغٌلللر ]]'‪ [HTTP_GET_VARS['homepage‬وملللن ثلللم طباعتللل عللللى‬
‫الشاشة ! ولذلك قد ٌقود هذا الخطأ إلى تضللٌل المسلتخدم وتحوٌلل إللى مواقلع ال ٌرغلب‬
‫بها أو ٌ دي إلى تحوٌل إلى مواقع تقوم بسلرقة المعلوملات الخاصلة بل ! ‪ ,‬عللى سلبٌل‬
‫المثال لو قمنا بطلب الصفحة ]‪ [birthday.php‬والتً تحتوي عللى اللنص البرمجلً ‪ 1.2‬و‬
‫قمنللا بتغٌللر قٌمللة المتغٌللر ]‪ [homepage‬بقٌمللة أخللرى مللثالً ]‪ [hack.com‬سللٌكون‬
‫الرابط بالشكل التالً ‪:‬‬
‫]‪[http://localhost/p2/homepage.php?homepage=http://www.hack.com‬‬
‫وبالتالً تستطٌع اآلن أن تقوم بتضلٌل الضحٌة عند طرٌق إرسال هذا الرابط إلٌ ومن‬
‫ثم سوف ٌقوم بالضغط على الرابط حٌث أن بداٌة الرابط ستجعل الزائر ٌثق بالموقع‬
‫]‪ [http://localhost/p2/homepage.php‬ولكن تم التالعب بالمتغٌر‬
‫]‪ [homepage‬و وضع موقع آخر غٌر الموقع المراد وبالتالً سٌقوم الضحٌة‬
‫بالضغط علٌ وال ٌعلم وبعدها ٌقوم المهاجم بتحوٌل الزائر إلى موقع ]‪[hack.com‬‬
‫والتً هً عبارة عن صفحة مزٌفة للموقع األساسً وعندها ٌستطٌع سرقة كلمة‬
‫المرور أو اسم المستخدم الخاص بالعضو ‪.‬‬

‫‪24‬‬
‫الحلول المتوافرة لمشكلة (عدم التحقق من صحة المعلومات المدخلة بشكل صحٌح‬
‫)‪02‬‬

‫ٓٔ‬
‫‪http://cwe.mitre.org/data/definitions/20.html‬‬

‫‪25‬‬
‫الحل األول ‪:‬‬
‫الحلل األول نسللتخدم فٌل طرٌقللة تصلفٌة المعلومللات المسلتقبلة مللن قبلل العمٌللل باسللتخدام‬
‫األصللناف ]‪ [classes‬وداولهللا المكتوبللة مللن قبللل منظمللة ]‪ [OWASP‬حٌللث المشللروع‬
‫ٌعلرف بللـ ]‪ . [OWASP ESAPI Validation API‬ولكللن لألسللف للم تنتهللً منظمللة‬
‫]‪ [OWASP‬ملن إعلداد اللدوال الخاصلة بلغلة ]‪[php‬حٌلث إن هلذا المشلروع الضلخم و‬
‫سٌمكن المبرمج من السٌطرة على المدخالت فً مرحلتً التصمٌم والبرمجة ‪.‬‬

‫الحل الثانً ‪:‬‬


‫قم بعمل القوائم السوداء والبٌضاء ! ‪ ,‬فعند إدخال المستخدم قٌمة معٌنة إلى موقعلك تقلوم‬
‫بالتأكد من المدخالت باسلتخدام هلذه القلوائم ‪ ,‬فل ذا كانلت القٌملة المدخللة موجلودة ضلمن‬
‫القائمة البٌضاء تقبل و ما عدا ذلك ترفض‪ ,‬وتقوم بتحوٌل الزائر إلى صلفحة أخلرى‪ ,‬أو‬
‫تقوم ب ظهار رسالة خطأ تخبر فٌها المسلتخدم أنل أدخلل قٌملا ً غٌلر صلحٌحة ‪ .‬كلذلك قلم‬
‫بعمٌلة التأكد من المدخالت عن طرٌق التأكد من طول و نلوع الملدخل هلل هلو نلص ‪,‬‬
‫]‪ [string‬أو رقلللم صلللحٌح ]‪ ! [integer‬وكلللذلك ال تلللن َ أن تتأكلللد ملللن أن الملللدخالت‬
‫صحٌحة من حٌث البناء ‪ ,‬على سلبٌل المثلال‪ ! ,‬إذا كلان المتغٌلر هلو اسلم األسلرة فالبلد‬
‫أن ٌدخل المستخدم فقط حروفا ً ولٌ أرقاما ً ‪ .‬انظر إلى النص رقم ‪ 2.1‬لكلً تتضلح للك‬
‫الفكرة ‪.‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$id =$HTTP_POST_VARS['id‬‬

‫{ )‪if(is_numeric($id)!=1‬‬

‫;)" تأكد من رقمك الجامعً"(‪echo‬‬


‫فللً الللنص البرمجللً رقللم ‪ 2.1‬تقللوم دالللة ])‪ [is_numeric($id‬بالتأكللد مللا }إذا كانللت‬
‫القٌمللة المدخلللة للمتغٌللر الللرقم الجللامعً ]‪ [$id‬صللحٌحة أم ال ! ‪ ,‬فل ذا كللان المللدخل فقللط‬
‫النص البرمجً ‪2.1‬‬
‫أرقا ًما بدون أي نصوص أو رموز أخرى فسوف تقوم ب رجلاع رقلم )‪ (1‬و ملا علدا ذللك‬
‫ترجع لنا رقلم )‪ , (0‬لنشلاهد ملثالً أخلرى مكتوبًلا بلغلة جافلا سلكربت ‪ ,‬انظلر إللى اللنص‬
‫البرمجً ‪. 2.2‬‬

‫;)‪var matches1 = document.getElementById("username").value.match(/[a-zA-Z0-9_]/‬‬

‫‪26‬‬ ‫)‪if (matches1‬‬

‫{‬
‫فً النص البرمجً ‪ 2.2‬قمنا باستقبال المتغٌر ]‪ [username‬والتأكد من أن حرو ًفا عربٌ فقط وال‬
‫ٌحتوي على أرقام أو حلروف انجلٌزٌلة وهلذا ملا ٌعلرف التعبٌلر القٌاسلً ]‪[regular expression‬‬
‫وهً عملٌلة مطابقلة نملط معلٌن لحاللة معٌنلة ملثالً فلً السلطر األول قمنلا باسلتخدام الداللة ]‪[match‬‬
‫والتللً سللتقوم مطابقللة الللنمط ]_‪ [a-zA-Z0-9‬مللع المتغٌللر ]‪ [username‬ف ل ذا تطابقللا ف ل ن المللدخل‬
‫ٌحتوي على أرقام أو حروف إنجلٌزٌ عندها ستظهر الرسالة (ٌجب أن ٌكون اسم المستخدم عربًٌا)‬
‫‪.‬‬

‫الحل الثالث ‪:‬‬


‫إن التأكللد مللن المعلومللات المدخلللة مللن جهللة العمٌللل ]‪ , [client-side‬باسللتخدام إحللدى‬
‫لغات البرمجة التً تعمل ملن جهلة العمٌلل مثلل جافلا سلكربت ]‪ٌ [JavaScript‬علد شلٌ ًئا‬
‫رائ ًعا ول فوائد عدٌدة ‪ ,‬إال أن المهاجم ٌستطٌع تعطٌل هلذه اإلمكانٌلة ألن جافلا سلكربت‬
‫تعملل ملن جهللاز العمٌلل ونحلن ال نملللك القلدرة عللى الللتحكم فلً جهلازه ‪ ,‬ومللن ثلم ٌقللوم‬
‫ب دخللال مللدخالت خبٌثللة إلللى الخللادم ‪ ,‬فلللذلك ٌجللب علٌللك عزٌللزي المبللرمج التأكللد مللن‬
‫المدخالت فً كال الطرفٌن (العمٌل ‪,‬الخادم ) ‪ ,‬مع العلم أن التأكد باستخدام جهة العمٌلل‬
‫ل ممٌزات عدٌلدة منهلا تسلرٌع عملٌلة التأكلد ملن الملدخالت و تقلٌلل عملل الخلادم وعلدم‬
‫إرهاق ‪,‬انظر المثال لكً تتضح الفكرة لك ‪ .‬شاهد النص البرمجلً رقلم ‪ ,2.3.‬وسلوف‬

‫‪27‬‬
‫نستخدم الحل الثالث لكون جزءًا من الحلل الرابلع اللذي سلوف ٌتأكلد ملن الملدخالت ملن‬
‫جهة العمٌل ! ‪.‬‬

‫عزٌللزي المبللرمج ‪,‬إن الللنص البرمجللً رقللم ‪ٌ 1.5‬مثللل ك لالً مللن ‪ :‬جافللا سللكربت بللاللون‬
‫األحمر واألزرق الـ ]‪ , [HTML‬و عندما ٌقوم العمٌل أو المهاجم ب دخال الرقم الجلامعً‬
‫الذي ٌحتوي على أرقام باإلضافة إلى رموز أو أحرف فسوف تظهر ل رسلالة (الرجلاء‬
‫إدخال رقمك الجلامعً بشلكل صلحٌح) ولكلن عنلدما ٌقلوم بوضلع أرقلام فقلط ف نل سلوف‬
‫ٌحول مباشرة إلى صفحة المعالجة الموجودة فً الخادم وهً الموجودة فً الحلل الثاللث‬
‫‪ ,‬والتً سوف تقوم بعملٌة التأكد من المدخالت مره أخرى ! لماذا ؟‬
‫بكل بساطة ألن عندما ٌقوم المهاجم بتعطٌل جافا سكربت عنلدها سلوف ٌسلتطٌع تخطلً‬
‫التأكد من المدخالت‪ ,‬ولكلن ملع وجلود التأكلد الملزدوج "العمٌلل ‪,‬الخلادم " فأنل حتلى للو‬
‫استطاع أن ٌعطل جافا سكربت فلن ٌستطٌع أن ٌعطل عملٌة التأكد التً تلتم عللى الخلادم‬
‫‪.‬‬
‫و بال شك أن ])‪ [if(id_s>0‬تقوم بعملٌة التأكد من نلوع الملدخل فل ذا كلان رقمًلا قاملت بنقلل‬
‫العمٌل إلى ]‪ [is_int.php‬و إذا كان العك سوف تظهر رسالة خطأ ‪.‬‬

‫الحل الرابع ‪:‬‬

‫‪28‬‬
‫انتب ال تعتمد عزٌزي القارئ بشكل كاملل عللى القائملة السلوداء والبٌضلاء فملن الممكلن‬
‫أن ٌقوم المهلاجم ب دخلال رملوز خبٌثلة ٌكلون لهلا مثٌلل فلً القائملة السلوداء وتعملل مثلل‬
‫عملها ولكن بترمٌز آخر ‪ ,‬شاهد النص البرمجً ‪. 2.4‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$phone =$HTTP_GET_VARS['phone‬‬

‫))‪if(preg_match("/</", $phone‬‬

‫{‬

‫;)"‪echo("not ok‬‬

‫}‬

‫{‪else‬‬

‫;)"‪echo("ok‬‬

‫}‬

‫النص البرمجً ‪2.4‬‬

‫الحل الخامس ‪:‬‬


‫بعد استقبال المعلومات تأكد عزٌزي المبرمج أنك ستقوم بتحوٌلها إللى الصلٌغة المناسلبة‬
‫‪ ,‬فمللثالً لللو اسللتقبلت رقللم هللاتف مللن خللالل نمللوذج اتصللال فٌجللب علٌللك تحوٌل ل بشللكل‬
‫مباشر إلى النوع المناسب والذي ٌمثل رقم صلحٌحً ا ]‪ [integer‬انظلر اللنص البرمجلً‬
‫رقم ‪. 2.5‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$phone =$HTTP_GET_VARS['phone‬‬

‫;)‪echo $phone_int=intval($phone‬‬

‫النص البرمجً ‪2.5‬‬

‫‪29‬‬
‫كمللا شللاهدت عزٌللزي القللارئ‪ ,‬أننللا اسللتخدامنا الدالللة ]‪ [intval‬التللً تقللوم بتحوٌللل القللٌم‬
‫المستقبلة إلى أرقام فقط ‪ ,‬فلذلك عندما ٌقوم المهلاجم ب دخلال رملوز خبٌثلة ف ننلا نسلتطٌع‬
‫أن نتغلللللللللللللللللللللب علٌهللللللللللللللللللللا ! ‪,‬فمللللللللللللللللللللثالً لللللللللللللللللللللو قللللللللللللللللللللام ب دخللللللللللللللللللللال‬
‫]‪ [123<script>alert('test');</script>4444‬سللللتقوم باسللللتخالص الللللرقم ]‪[123‬‬
‫وحللذف جمٌللع الللذي ٌللأتً بعلد هللذا الللرقم ‪ ,‬وكللذلك لللو قللام بوضللع نللص برمجللً خبٌللث‬
‫مكتوب بلغة جافا سكربت مثل ]>‪ [<script>alert('test');</script‬سترجع لنا ]‪[0‬‬
‫‪.‬‬

‫الحل السادس ‪:‬‬


‫عندما ٌتم نقل المعلومات من جزء إلى جزء آخر فلً الموقلع نفسل ٌجلب التأكلد ملن أن‬
‫لغة الترمٌز هً نفسها ‪.‬تحدث هذه المشكلة خاصة على مستوى اللغلة العربٌلة حٌلث أنل‬
‫مللن المعللروف أن اللغللة العربٌللة دائ ًمللا تتضللارب مللع قواعللد البٌانللات التللً ترمٌزهللا ال‬
‫ٌحتوي على ترمٌز اللغة العربٌة ‪ ,‬وكلذلك عنلدما تسلتخدم تقنٌلة أجلاك ]‪ [AJAX‬سلوف‬
‫تالحظ أن اللغة العربٌلة غٌلر مدعوملة بشلكل كاملل‪ ,‬وللذا ٌجلب علٌلك أن تقلوم بتحوٌلل‬
‫جمٌللع القللٌم إلللى الترمٌللز الموحللد ]‪ , [UTF‬قللم باسللتخدام الدالللة ]‪ [iconv‬أنظللر الللنص‬
‫البرمجً ‪. 2.6‬‬

‫;)"أهال وسهال"‪$hi=iconv('windows-1256','utf-8',‬‬

‫النص البرمجً ‪2.6‬‬

‫ستقوم الدالة ]‪ [iconv‬بتحوٌل ("أهال وسهال") إلى الترمٌز ]‪. [UTF-8‬‬

‫‪30‬‬
00[Cross-Site Request Forgery] [CSRF] ‫الطلبات المزٌفة عبر الموقع‬

ٔٔ
352 : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-352

31
‫إن قٌللام المهللاجم بتصللرفات خطللرة ولكللن بشللكل غٌللر مباشللر أمللر ٌسللتدعً النظللر فٌ ل‬
‫ً‬
‫حقٌبلة‬ ‫والتحقق من ‪ ,‬عزٌزي القارئ لو أردت أن تسافر فقلام أحلد األشلخاص ب عطائلك‬
‫ل لتأخذها معك على متن الطائرة ثم توجهت إلى صالة اإلقالع ‪ ,‬وعندما قلام الموظلف‬
‫المسل ول بأخللذ تللذكرة اإلقللالع لركللوب الطللائرة و تفتللٌه هللذه الحقٌبللة وجللد بهللا أدوات‬
‫ممنوعة االستخدام على متن الطائرة ! ماذا سوف تكلون ردة فعللك ! هلل هلو اإلنكلار ؟‬
‫بال شك سوف تقر وتسجل باسمك هذه الجرٌمة على الرغم من أنك لم تفعل شٌ ًئا ! ‪.‬‬

‫الطلبات المزٌفة عبر الموقع هً عملٌة زرع أوامر برمجٌة فً صفحة العمٌل]‪[Client‬‬
‫ثم إرسالها إلى الخادم ]‪. [server‬‬

‫ٌقوم المهاجم بزرع أوامر برمجٌة بداخل صفحات العمٌل ومن ثم ٌنفلذ أو ٌطللب العمٌلل‬
‫هللذه الصللفحة و حٌنئللذ و بشللكل تلقللائً تنفللذ األوامللر المزروعللة مللن قبللل المهللاجم باسللم‬
‫"العمٌل" ولٌ المهاجم ‪ ,‬وهذا تعرف آخر للطلبات المزٌفة عبر الموقع‪ ,‬فالمهاجم ٌقلوم‬
‫بتنفٌذ األوامر التً ٌرٌدها عن طرٌق استغالل متصفح "العمٌل " ‪.‬‬

‫على أي مستوى تحدث هذه الثغرة ؟ ما هً اللغات التً تتأثر بها ؟ ومزا هزو مسزتوى‬
‫خطورتها ؟‬
‫تحدث هذه الثغرة على مستوى تصمٌم ‪ ,‬و هٌكلٌة ‪,‬و برمجة النظام ‪.‬‬
‫أما اللغات التلً تتلأثر بهلا فهلً جمٌلع اللغلات البرمجٌلة بلال اسلتثناء وبلاألخص األنظملة‬
‫التلً تتعامللل ملع الخللادم ]‪ [Server‬وكلذلك قامللت منظملة ]‪ [Sans‬بتصللنٌف هلذه الثغللرة‬
‫على أنها ذات خطورة عالٌة ]‪. [High‬‬

‫‪32‬‬
‫عزٌزي القارئ ‪ ,‬فً المثال التالً نصوص برمجٌة سلٌمة وكلذلك نصلوص برمجٌلة تلم‬
‫التالعب بها وإدخال لغة جافا سكربت ]‪ [javascript‬علٌها ‪.‬‬
‫> ”‪<form action="profile.php" method="POST" name="s" id=”s‬‬

‫>‪<blockquote‬‬

‫>‪<label>f_name</label><input type="text" name="firstname" /‬‬

‫>‪<label>l_name</label><input type="text" name="lastname"/> <br/‬‬

‫>‪<label>email</label><input type="text" name="email" /‬‬

‫>‪" /‬تحدٌث"=‪<input type="submit" name="submit" value‬‬

‫>‪</blockquote‬‬

‫>‪</form‬‬

‫النص البرمجً ‪3.1‬‬

‫كملا تشلاهد فلً اللنص رقلم ‪ 3.1‬و هلو ]‪ [HTML‬بسلٌط جل ًدا ٌحتلوي عللى ثالثلة حقللول‬
‫البرٌلٔللد اإللكترونلللً ‪ ,‬وعنلللد النقلللر عللللى زر‬ ‫النص و‬
‫البرمجً‬ ‫وهلللً االسلللم األول ‪,‬و االسلللم األخٌلللر ‪,‬‬
‫"تحدٌث" سوف ٌتم نقل التحكم إلى الصفحة التً لها النص البرمجً رقم ‪.3.2‬‬

‫‪33‬‬
‫?<‬

‫;)(‪session_start‬‬

‫>?‬

‫?<‬

‫‪class profile‬‬

‫{‬

‫{)(‪function profile‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$firstname = $HTTP_POST_VARS['firstname‬‬

‫;]'‪$lastname =$HTTP_POST_VARS['lastname‬‬

‫;]'‪$email =$HTTP_POST_VARS['email‬‬

‫{)]'‪if (!$_SESSION['username‬‬

‫لم ٌتم تسجٌل العمٌل وبالتالً سوف ٌتم تحوٌل إلى صفحة تسجٌل الدخول ‪//‬‬

‫}‬

‫{‪else‬‬

‫;)‪$this->update_has_info_in_db($firstname,$lastname,$email‬‬

‫}‬

‫}‬

‫{)‪function update_has_info_in_db($firstname,$lastname,$email‬‬

‫تحدٌث المعلومات فً قاعدة البٌانات ‪//‬‬

‫;)"تم التحدٌث"(‪echo‬‬

‫}‬ ‫عند النظر للمرة األولى إلى النص البرمجً رقم ‪ 3.2‬للن ٌتوقلع المبلرمج أن هلذا اللنص‬
‫البرمجً قد ٌسبب ل مشاكل عدة ‪,‬و بما أن طرٌقة البرمجة تعتمد على جلسلات العملالء ;}‬
‫;)(‪profile‬العمٌللل قللد سللجل‬
‫‪$start_new=new‬‬ ‫]‪ [session client‬وأن لكللل عمٌللل جلسللة خاصللة بل ‪ ,‬و إذا لللم ٌكللن‬
‫الدخول فسوف ٌنتقل بشكل تلقائً إللى صلفحة التسلجٌل وللن ٌلتم تحلدٌث المعلوملات أي>?‬
‫شخص ما لم تسجل ل جلسة خاصة باسم ‪.‬‬
‫النص البرمجً ‪3.2‬‬

‫‪34‬‬
‫األملر ] )]'‪ٌ [ if (!$_SESSION['username‬تأكلد ملن أن العمٌلل ُمسلجل لل جلسلة‬
‫خاصللة به لً أم ال ا ! وعنللدما ال ٌتحقللق الشللرط كمللا قلنللا سللابقا ً ٌللتم تحوٌل ل إلللى صللفحة‬
‫التسجٌل ‪.‬‬
‫ٌستطٌع المهاجم وضع نص برمجلً باسلتخدام أحلد أوسلمة ]‪ [tags‬لغلة ]‪ [HTML‬وملن‬
‫ثللم ٌقللوم العمٌللل بطلللب أو تنفٌللذ هللذه الصللفحة التللً دمللج بهللا الللنص البرمجللً الخبٌللث‬
‫ً‬
‫حقٌقلة‬ ‫وبالتالً ٌتم تنفٌلذ هلذا اللنص البرمجلً عللى أسلا أن العمٌلل قلام بتنفٌلذه‪ ,‬ولكلن‬
‫األمر أن المهاجم قام بدمج النص البرمجً فً صفحة العمٌل وتم تنفٌلذ اللنص البرمجلً‬
‫الخبٌث بواسطة العمٌل وهو ال ٌدري !‪ ,‬أنظر إلى النص البرمجً رقم ‪: 3.3‬‬

‫>‪<SCRIPT‬‬

‫{ )( ‪function SendAttack‬‬

‫;"‪document.s.email.value= "aldeheme@ksu.edu.sa‬‬

‫;)(‪document.s.submit‬‬

‫}‬

‫>‪</SCRIPT‬‬

‫> ‪<BODY‬‬

‫;)(‪<form action="profile.php" method="POST" name="s" id=”s” onsubmit=SendAttack‬‬


‫>‬

‫>‪<blockquote‬‬

‫>‪<label>f_name</label><input type="text" name="firstname" /‬‬

‫>‪<label>l_name</label><input type="text" name="lastname"/> <br/‬‬

‫>‪<label>email</label><input type="text" name="email" /‬‬

‫>‪" /‬تحدٌث"=‪<input type="submit" name="submit" value‬‬

‫>‪</blockquote‬‬
‫‪35‬‬
‫>‪</form‬‬
‫تشاهد فً النص رقم ‪ 2.3‬أن المهاجم قام بدمج النص البرمجً جافا سلكربت باسلتخدام‬
‫وسللامٌن ]‪ [tags‬وهمللا ]‪ [body‬و ]‪ , [SCRIPT‬و لتوضللٌح الفكللرة ف نلل عنللدما ٌقللوم‬
‫العمٌلل بلدخول هللذه الصلفحة سللوف ٌلتم تنفٌللذ الحلدث ]‪ [onload‬والللذي ٌسلتدعً الدالللة‬
‫]‪ [SendAttack‬و التللً تقللوم بتغٌٌللر البرٌللد اإللكترونللً الخللاص بالعمٌللل عللن طرٌللق‬
‫تغٌٌر قٌمة الحقل ]‪ [email‬الذي أسند ل برٌد المهلاجم ‪[aldeheme@ksu.edu.sa] :‬‬
‫بللللدالً مللللن البرٌللللد الللللذي سللللوف ٌللللتم وضللللع مللللن قبللللل العمٌللللل ‪ ,‬وبعللللد تنفٌللللذ الدالللللة‬
‫])(‪[form.submit‬سوف تنقل التحكم وبالبٌانات إلى الصفحة النص البرمجً رقلم ‪3.2‬‬
‫‪.‬‬
‫ما هً ردة فعل الصفحة المستقبلة للبٌانات (النص البرمجً رقم ‪ . ) 3.2‬بكل تأكٌلد إذا‬
‫‪[if‬‬ ‫كلللللللان العمٌلللللللل قلللللللد تلللللللم تسلللللللجٌل مسلللللللبقا ً فلللللللً الموقلللللللع فللللللل ن األملللللللر‬
‫])]'‪ (!$_SESSION['username‬فلللً اللللنص البرمجلللً رقلللم ٔ للللن ٌتحقلللق وبشلللكل‬
‫مباشلللر سلللوف ٌلللذهب إللللى ])‪[$this->update_has_info_in_db($firstname,$lastname,$email‬‬
‫وٌقوم بتحدٌث بٌانات العمٌل و وضع البرٌد اإللكترونً للمهاجم بدالً من البرٌلد الحقٌقلً‬
‫للعمٌل وهذا ما ٌعرف بالطلبات المزٌفة عبر الموقع ‪.‬‬
‫عزٌزي القارئ ‪ ,‬كما شاهدت ف ن المهاجم قام بتزٌٌف طلب وتغٌٌلر المعلوملات "البرٌلد‬
‫اإللكترونً " الخاص بالعمٌل وإرسال هلذه المعلوملات إللى الخلادم علن طرٌلق اسلتخدام‬
‫متصفح العمٌل ‪.‬‬

‫‪36‬‬
‫لنشاهد سوٌا ً تنفٌذ هذه الثغرة بالرسم و نواتجها ‪.‬‬
‫هللذا هللو الللنص البرمجللً وسللوف ٌللتم تنفٌللذ األوامللر بالتسلسللل الرقمللً ٔ ‪ٗ , ٖ , ٕ ,‬‬
‫انظر الشكل ‪. 3.1‬‬

‫شكل ‪3.1‬‬

‫سوف تنفلذ الصلفحة ]‪( [html‬اللنص البرمجلً رقلم ‪ ) 3.3‬كملا فلً الشلكل ‪ , 3.1‬وبعلد‬
‫الضغط على ]‪ [submit‬سوف ٌكون الناتج بالشكل التالً ‪ ,‬انظر شكل ‪. 3.1‬‬

‫الشكل ‪3.1‬‬

‫‪37‬‬
‫الحلول المتوفرة لمشكلة (الطلبات المزٌفة عبر الموقع‪)00‬‬

‫الحل األول ‪:‬‬


‫تأكد من خللو موقعلك ملن ثغلرة " البرمجلة عبلر الموقلع " ]‪ [xss‬النل ملن خاللهلا ٌمكلن‬
‫تنفٌذ ثغرة الطلبات المزٌفة عبر الموقع ‪ ,‬فلو كلان موقعلك ٌحتلوى عللى ثغلرة (البرمجلة‬
‫عبللر الموقللع )ٌسللتطٌع تنفٌللذ (نصللوص جافللا سللكربت الموجللودة فللً الللنص البرمجللً‬

‫ٕٔ‬
‫‪http://cwe.mitre.org/data/definitions/352.html‬‬

‫‪38‬‬
‫‪4.1‬التللً تمثللل بللاللون األحمللر ) وهللذا النللوع ٌسللمى البرمجللة عبللر الموقللع القابلللة‬
‫للتخزٌن‬
‫]‪, [Stored Cross Site Scripting‬أي أن البرمجة عبر الموقلع تنفلذ ملره واحلد عللى‬
‫مستوى المتصفح وبعدها ٌتنهً مفعولها ولكن البرمجة عبر الموقع القابلة للتخزٌن ف نهلا‬
‫ستدمج مع الـ ‪ , html‬حٌث الزائر فً كل مره ٌطلب الصفحة سٌتم تنفٌذ جافا سلكربت‬
‫‪.‬‬

‫الحل الثانً ‪:‬‬


‫اسللتخدام مضللاد للطلبللات المزٌفللة عللن طرٌللق ]‪ , [CSRFGuard‬وهللو أداة مللن برمجللة‬
‫منظمللة ]‪ , [owasp‬و تتمركللز قوتهللا فللً أنه لا تسللتطٌع التفرٌللق بللٌن الطلللب المزٌللف‬
‫والطلللب الصللحٌح ‪ ,‬عللن طرٌللق اسللتخدام رقللم الجلسللة الحالٌللة وإسللنادها لكللل نمللوذج‬
‫]‪ [form‬بحٌث نستطٌع عن طرٌق رقم الجلسة أن نحدد من قام بالطلب ‪ ,‬وبال شلك فل ن‬
‫رقللم الجلسللة هللو رقللم ٌصللعب تخمٌن ل ‪ ,‬وقللد ٌكللون شللب مسللتحٌل ‪ .‬هززل تززود أن نقززوم‬
‫ببرمجة برنامج خاص بنا لنقوم بتجربة الفكرة ؟‬
‫ٌعتمززد هززذا المثززال علززى نظززام القوالززب ]‪ , [template‬تسززتخدم نظززام القوالززب لفصززل‬
‫الـ]‪ [html‬عن ]‪ , [php‬عن طرٌق المتغٌلرات التلً توضلع فلً مللف ]‪ [html‬وبعلدها‬
‫ٌتم استبدال هذه المتغٌرات بقٌم موضوعة من قبل ملف ]‪ . [php‬للن أتحلدث كثٌلرً ا علن‬
‫القوالللب ألن مجالهللا واسللع ج ل ًدا ولهللا تطبٌقللات كثٌللرة ‪ ,‬لنبللدأ المثللال انظللر إلللى الللنص‬
‫البرمجً رقم ‪. 4.2‬‬

‫>"‪<form method="POST" action="../session.php‬‬

‫>"‪<p><input type="text" name="pass" size="20‬‬

‫>‪" name="B1"></p‬حدث كلمة المرور"=‪<input type="submit" value‬‬

‫> "‪<input type="hidden" name="{session_id}" size="20‬‬

‫>‪</form‬‬

‫النص البرمجً ‪4.2‬‬

‫‪39‬‬
‫فً النص البرمجً رقم ‪ 4.2‬نجد نموذج ]‪ٌ [html‬حتوي على حقل كلمة الملرور وهلو‬
‫]‪ , [pass‬الجدٌد هنا أننً قملت باسلتخدام متغٌلر ]‪ [html‬حٌلث سنسلند لهلذا المتغٌلر رقلم‬
‫الجلسللة الخاصللة بللالزائر ]‪ [session id‬عللن طرٌللق لغللة ]‪ , [php‬انظللر إلللى الللنص‬
‫البرمجً رقم ‪. 4.3‬‬

‫;) "‪$form=new TemplatePower("html/form_reg.htm‬‬

‫;)(‪$form->prepare‬‬

‫;))(‪$form->assign("session_id",session_id‬‬

‫;)(‪echo $form=$form->getOutputContent‬‬

‫النص البرمجً ‪4.3‬‬


‫بعدما ٌقوم الزائر بالضغط على (حدث كلمة المرور ) ‪ ,‬سوف ترسلل جمٌلع المعلوملات‬
‫إلى النص البرمجً رقم ‪ , 4.5‬بال شك أن من هذه المعلومات رقم الجلسة المخزنة فلً‬
‫حقل مخفً ‪ ,‬انظر النص البرمجً رقم ‪. 4.4‬‬

‫> "‪<input type="hidden" name="{session_id}" size="20‬‬

‫النص البرمجً ‪4.4‬‬

‫الصللفحة المسللتقبلة سللوف تتأكللد مللن رقللم الجلسللة الخاصللة بللالزائر ‪ ,‬وهللل هللً نفسللها‬
‫المسجلة عندها ؟ ‪ ,‬انظر إلى النص رقم ‪. 4.5‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$your_session = $HTTP_POST_VARS['your_session‬‬

‫{))(‪if($your_session==session_id‬‬

‫;)" لقد تم تحدٌث كلمة المرور الخاصة بك "(‪echo‬‬

‫}‬

‫النص البرمجً ‪4.5‬‬ ‫الحل الثالث ‪:‬‬


‫قم باسلتخدام طرٌقلة التأكٌلد الملزدوج التلً تلم ابتكارهلا بواسلطة ]‪ [Felten‬و ]‪[Zeller‬‬
‫حٌث أنها مقارنة قٌم الكعك مع قٌم المتغٌرات التلً فلً النملوذج ]‪ , [form‬بمعنلى آخلر‬

‫‪40‬‬
‫عندما ٌقوم المستخدم بالدخول إلى الموقع ف ن معلومات النموذج تخزن فً الكعك و هً‬
‫مشللفرة ! فعنللدما ٌقللوم العمٌللل بطلللب الصللفحة المزٌفللة ٌتأكللد الخللادم مللن المعلومللات فللً‬
‫الكعك ‪ ,‬ف ذا كانت معلومات النموذج المرسلة تتطابق مع الموجودة فً الكعك ف نل ٌعلد‬
‫هذا الطلب صحٌحً ا و ماعدا ذلك ٌتم رفض ‪.‬‬

‫الحل الرابع ‪:‬‬


‫قم بتحذٌر المستخدم ! عندما ٌقوم المستخدم بطلب مزٌف وهو ال ٌعللم قلم باسلتقبال هلذا‬
‫الطلللب وإظهللار رسللالة تأكٌللد علللى هللذا الطلللب وأن ل غٌللر صللحٌح وخطللر ‪ ,‬لكللً ٌعلللم‬
‫المسللتخدم أن السللم ُد فللً العسللل و إحللدى طززرق التحقززق مززن الطلززب تززم شززرحها فززً‬
‫الحل الثانً ‪.‬‬

‫الحل الخامس ‪:‬‬


‫أنتب ! ال تقم ب رسال المعلوملات التلً لهلا عالقلة بحاللة المسلتخدم ! (مثلل هلل هلو ملدٌر‬
‫الموقلللع]‪ [administrator‬أم ال ؟) باسلللتخدام ]‪ , [GET‬ألن أي شلللخص ٌسلللتطٌع‬
‫تعللدٌلها حٌللث أنهللا ترسللل بشللكل واضللح وصللرٌح !‪ ,‬وبللال شللك أن ل حتللى مللع اسللتخدام‬
‫]‪ [POST‬هناك طرٌقة ٌستطٌع الشخص بها تعلدٌل حاللة المسلتخدم ‪ ,‬وهلً اسلتخدام لغلة‬
‫]‪ ,[perl‬طب ًعلللا هلللذا ال ٌعنلللً أن طرٌقلللة ]‪ [POST‬و ]‪ [GET‬لهلللا التلللأثٌر نفسللل ! ولكلللن‬
‫الحقٌقة أن ]‪ [POST‬أكثر أم ًنا من ]‪ [GET‬من ناحٌة علدم ظهلور المعلوملات فلً اللرابط‬
‫]‪ [URL‬فقط ال غٌر ‪ ,‬لنشاهد المثال التالً ‪ ,‬لو أردت أن تقوم بنقل كلمة المرور لعضلو‬
‫]‪ [password‬من صفحة إلى أخرى باستخدام ]‪ [GET‬فأنها سترسل بالشكل التالً ‪:‬‬

‫ولكن لو استخدام ]‪ [POST‬ف نها سترسل بشكل مخفً ‪ ,‬بال شك أن إمكانٌة تعدٌل كلمة‬
‫‪Localhost/login.php?password=1234567‬‬
‫المرور سوا ًء باستخدام ]‪ [GET‬أو ]‪ [POST‬أمر سهل ولكن االختالف فً أن ]‪[POST‬‬
‫النص البرمجً ‪4.6‬‬
‫صعبت األمر قلٌالً ‪.‬‬

‫‪41‬‬
42
04[SQL Injection] [SQLI] ‫الحقن االستعالمٌة‬

ٖٔ
89 : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-352

43
‫إن التطبٌقللات (األنظمللة ‪ ,‬المواقللع ) التللً تتعامللل مللع مللدخالت المسللتخدمٌن‪ ,‬ومللن ثللم‬
‫تقوم بدمجها بشلكل مباشلر ملع األملر االسلتعالمً ]‪, [SQL‬وبعلد ذللك سلوف ٌلتم إرسلال‬
‫هللذا األمللر إلللى خللادم قاعللدة البٌانللات ]‪ ,[database server‬وبللذلك ٌللتم إرجللاع ‪ ,‬أو‬
‫إضللافة ‪ ,‬أو حللذف ‪ ,‬أو تعللدٌل فللً قاعللدة البٌانللات ]‪ [database‬التللً تكللون دائمللا ً‬
‫معرضللة لالسللتغالل والهجللوم علٌهللا مللن قبللل المختللرقٌن أو المهللاجمٌن وهللذا مللا ٌعللرف‬
‫بـالحقنة االستعالمٌة ‪.‬‬
‫بعبارة أخرى إن الحقن االستعالمٌة هً ‪:‬‬
‫استعالم ضار من الممكن أن ٌدمج مع االستعالم الصحٌح الذي ٌقلوم بجللب المعلوملات‬
‫من قاعدة البٌانات ‪ ,‬على سبٌل المثال ‪ :‬عندما ٌقوم المبرمج بعملٌلة اسلتعالم معٌنلة ملثالً‬
‫لجلب اسم العمٌل ]‪ [x‬ف ن سوف ٌرسل هذا األمر إلى قاعدة البٌانات وبالتالً ترجع لنلا‬
‫اسللم العمٌللل فقللط‪ٌ ,‬للأتً هنللا دور ]‪ [SQL Injection‬الللذي مللن الممكللن إضللافتها إلللى‬
‫االستعالم السابق بحٌث أن ٌجلب لنا اسم العمٌل باإلضافة إلى معلوملات أخلرى ‪ ,‬حٌلث‬
‫مللن المفللروض أن تكللون غٌللر ظللاهرة فللً االسللتعالم]‪ ,[x‬المسللألة أشللب بحقللن أوامللر‬
‫]‪ [SQL‬السلٌمة والصحٌحة والتلً هلً فلً أصللها مكتوبلة فلً اللنص البرمجلً ملن قبلل‬
‫المبللرمج بللأوامر خبٌثللة تمكللن المهللاجم مللن الحصللول علللى معلومللات حساسللة فللً غاٌللة‬
‫األهمٌة‪.‬‬

‫عزٌللزي القللارئ ‪ ,‬إن عللدم التأكللد مللن مللدخالت المسللتخدمٌن قللد ٌسللبب مشللاكل كبٌللرة‬
‫ومنها إدخال أوامر خبٌثة قد تتالعب باألمر االستعالمً ‪.‬‬
‫ما هً مصادر الحقنة االستعالمٌة ؟‬
‫ٔ ‪-‬عدم التأكد التام من مدخالت المسلتخدم علن طرٌلق نملوذج]‪ [form‬معلٌن مثلل "نملوذج‬
‫الدخول " ‪.‬‬
‫ٕ ‪-‬عللدم اسللتخدام بعللض الللدوال المهم لة والتللً تمكللن المبللرمج مللن ال لتخلص مللن الزوائللد‬
‫المضافة إلى االستعالم الصحٌح ‪.‬‬
‫ٖ ‪-‬عدم التأكد من المتغٌرات المرسلة سواء كانت مخفٌة بطرٌقة ]‪ [POST‬أو عبلر اللرابط‬
‫]‪. [URL‬‬

‫‪44‬‬
‫شاهد األمثلة التالٌة التً تشر طرٌقة استغالل الحقنة االستعالمٌة ‪:‬‬
‫سللوف نسللتعرض أوالً الملللف الخللاص بتسللجٌل الللدخول الللذي ٌمكللن الزائللر مللن وضللع‬
‫وكتاب كلمة المرور الخاصة ب ‪ ,‬ومن ثم االنتقال إلى صفح الترحٌب التلً تعلرض لل‬
‫معلومات وكل ما ٌتعلق ب بعد الضغط على زر ]‪ [Submit‬أنظلر إللى اللنص البرمجلً‬
‫رقم ‪. 5.1‬‬
‫>"‪<form method="POST" action="../check.php‬‬

‫>"‪<p><input name="password" size="20‬‬

‫>"‪<input type="submit" value="Submit‬‬

‫>‪<input type="reset" value="Reset" name="B2"></p‬‬

‫>‪</form‬‬

‫النص البرمجً ‪5.1‬‬


‫كما تشاهد فهذا نص برمجً بسٌط جداً وهو نموذج إلدخال كلملة الملرور ‪,‬سلوف أضلع‬
‫بللٌن ٌللدٌك الللنص البرمجللً المكتللوب بلغلة ]‪ [PHP‬للصللفحة التللً سللوف تسللتقبل كلم ل‬
‫المللرور مللن الصللفحة األولللى وتقللوم بعملٌ لة معالجتهللا مللن خللالل االسللتعالم مللن قاعللدة‬
‫البٌانات بنا ًء على كلملة الملرور و بعلدها تقلوم بعلرض المعلوملات الخاصلة بهلذا الزائلر‬
‫انظر النص البرمجً رقم ‪. 5.2‬‬
‫;)"‪include("config.php‬‬

‫‪class check‬‬

‫{‬

‫{)(‪function check‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;‪$c =new con‬‬

‫;)(‪$c->con‬‬

‫;]'‪$password=$HTTP_POST_VARS['password‬‬

‫;"‪$sql="SELECT * FROM cus where pass=$password‬‬

‫;)‪$q=mysql_query($sql‬‬

‫{))‪while($row=mysql_fetch_array($q‬‬

‫;)]'‪echo("your name is : ".$row['name‬‬

‫;)">‪echo("<br‬‬
‫‪45‬‬
‫;)]'‪echo("your pass is : ".$row['pass‬‬
‫فللً الللنص البرمجللً رقللم ‪ ,5.2‬نقللوم باالتصللال بقاعللدة البٌانللات باسللتخدام الداللة ‪[$c-‬‬
‫])(‪>con‬بعدها نقوم بدمج كلمة السر المرسلة من الصفحة األولى بشكل مباشر ملع أملر‬
‫االستعالم ]‪ [SQL‬و دون التأكد من مدخالت المستخدم‪.‬‬

‫قبل أن أتطرق للخطأ البرمجً سوف أعرض للك حقلول وأعملدة قاعلدة البٌانلات الملراد‬
‫االستعالم منها‪:‬‬

‫‪pass‬‬ ‫‪name‬‬ ‫‪id‬‬


‫‪1234‬‬ ‫‪mohmmed‬‬ ‫‪1‬‬
‫‪555664‬‬ ‫‪aldeheme‬‬ ‫‪2‬‬
‫‪saad‬‬ ‫‪3‬‬

‫حٌث أن قاعدة البٌانات تتكون من ثالثة أعملدة وهلً ]‪ [name,pass,id‬كلذلك تحتلوي‬


‫على سطرٌن]‪. [two rows‬‬

‫نعود مرة أخرى للنص البرمجً ‪ 5.2‬حٌث ب خطأ فاد قد ٌقع فٌ الكثٌرون ‪,‬فالمهاجم‬
‫اآلن ٌستطٌع إضافة أوامر خبٌثلة]‪ [SQLI‬فٌجللب جمٌلع المعلوملات الموجلودة فلً قاعلدة‬
‫البٌانات عن طرٌق إضافة]‪[.or 4>3‬إلى كلم السر و تكون بهذا الشكل‬

‫]‪ [123.or 4>3‬فهلذه اإلضلافة البسلٌطة]‪ [or 4>3‬صلحٌحة دائملا ً ولجمٌلع األسلطر‬
‫]‪ , [rows‬و سوف ٌجلب جمٌع المعلومات و ٌكلون شلكل االسلتعالم بعلد إضلافة األملر‬
‫الخبٌث بالشكل التالً ‪:‬‬

‫; ‪$sql="SELECT * FROM cus where pass=$password".or 4>3‬‬


‫استخدمنا إحدى خصلائص المتغٌلرات النصلٌة ]‪ [string‬والتلً تمكلن المهلاجم ملن دملج‬
‫مجموعة من الكلمات مع بعضها البعض فلً المتغٌلر نفسل و ٌمكلن عملهلا بلغلة ]‪[php‬‬
‫ب ضافة رمز]‪( [.‬نقطة) ‪ ,‬انظر إلى الشكل ‪. 5.1‬‬

‫‪46‬‬
‫الشكل ‪5.1‬‬

‫وبعد تنفٌذ هذا األمر وجدنا فعالً أن قام بعملٌ طباع جمٌع األسلطر فلً قاعلدة البٌانلات‬
‫أنظر شكل ‪! 5.2‬‬

‫الشكل ‪5.2‬‬

‫‪47‬‬
‫الحلول المتوافرة لمشكلة (الحقن االستعالمٌة‪)03‬‬

‫ٗٔ‬
‫‪http://cwe.mitre.org/data/definitions/89.html‬‬

‫‪48‬‬
‫الحل األول‪:‬‬
‫من الجٌلد أن تقلوم باسلتخدام المتغٌلر ]]'‪ , [$HTTP_GET_VARS['id‬أو ]]"‪, [$_GET["id‬‬
‫أو ما ٌتبع من متغٌرات مثل ]]'‪ [[$HTTP_POST_VARS['id‬فً استقبال المتغٌرات المرسلة‬
‫بدالً من استقبالها مباشرة كـ(‪ )$id‬ألسباب أمنٌة ‪.‬‬

‫حٌث إن عدم استقبال المتغٌر بشكل مباشلر ٌمكنلك ملن معرفلة الحقنلة االسلتعالمٌة علن‬
‫طرٌللق تخصللٌص البٌانللات المسللتقبلة‪ ,‬وتحدٌللد نوعٌتهللا‪ ,‬والتغلللب علٌهللا ‪ ,‬ومللن الممكللن‬
‫التالعللب بهللذه المتغٌللرات‪ ,‬و نتٌجللة لللذلك تفشللل هللذه المتغٌللرات فللً عملٌ لة التصللدي‬
‫للهجمات الخبٌثة ‪.‬‬

‫فً اإلصدارات األخٌرة من لغة]‪ [PHP‬أصبحت بشكل افتراضً ال تقبلل أن تتعاملل ملع‬
‫اسللتقبال المتغٌللرات بشلكل مباشللر ألنل ٌسللبب مشللاكل أمنٌلة خطٌللرة‪ ,‬فمللن الممكللن حقللن‬
‫]‪ [SQL‬بكل سهولة ‪ ,‬ولذلك قامت ب غالق المتغٌر]‪ , [Register Globals‬وجعل حالت‬
‫مغلق ]‪ [OFF‬فً إعدادات لغة]‪ , [PHP‬لكً تمنع المبرمج من استقبال المتغٌرات بشكل‬
‫مباشر‪ ,‬لذلك البد من تغٌٌر حالة هذا المتغٌر من إعدادات اللغلة فلً مللف ]‪, [PHP.ini‬‬
‫بجعل مغل ًقا ]‪. [OFF‬‬

‫‪ , magic_quotes_gpc‬هو متغٌر موجلود فلً مللف إعلدادات لغلة ]‪ , [php‬و ٌقلوم‬


‫بدوره فً عملٌ إضافة الشرطة المائلة (\) ]‪ [SLASH‬إلى القٌم المسلتقبلة علن طرٌلق‬
‫المتغٌر]‪ [$HTTP‬أو ]‪. [$_GET‬‬

‫لنللر المثللال التللالً سللوٌا ً ومللن خللالل المثللال سللوف تتضللح الصللورة ‪ ,‬انظللر إلللى الللنص‬
‫البرمجً رقم ‪.6.1‬‬
‫>‪</a‬للذهاب إلى الصفحة الرئٌسٌة اضغط هنا>"‪<a href="../check.php?id=1‬‬

‫النص البرمجً ‪6.1‬‬

‫فلً اللنص البرمجلً رقلم ‪ٌ [html] 6.1‬قلوم بعلرض اللرابط التلابع للصلفحة الرئٌسلٌة ‪,‬‬
‫ض لا عنللد الضللغط علٌلل نقللوم ب رسللال ]‪ [id‬إلللى الصللفحة ]‪( [check.php‬الللنص‬ ‫وأٌ ً‬
‫البرمجللً رقللم ‪)6.2‬لجلللب المعلومللات مللن قاعللدة البٌانللات للسللطر الللذي ٌحتللوي علللى‬
‫الـ]‪ [id‬رقم ]‪. [1‬‬

‫‪49‬‬
‫أما نص الصفحة ]‪ [check.php‬فهو ‪:‬‬
‫;]'‪$id=$HTTP_GET_VARS['id‬‬
‫;"'‪echo $sql="SELECT * FROM page where id='$id‬‬
‫;)">‪echo("<br‬‬
‫;)‪$q=mysql_query($sql‬‬
‫{))‪while($row=mysql_fetch_array($q‬‬
‫;)]'‪echo(" title Is : ".$row['title‬‬
‫}‬
‫النص البرمجً ‪6.2‬‬

‫بكل تأكٌد ملع اسلتخدام ];]'‪ [$HTTP_GET_VARS['id‬سلٌكون أكثلر أمانلا ً حٌلث أننلا‬
‫خصصنا البٌانات المستقبلة بالطرٌقة التالٌة ‪:‬‬

‫ٔ ‪ , [$HTTP_GET]-‬البٌانات المرسلة سوف تستقبل بطرٌقة ]‪. [GET‬‬


‫ٕ ‪ , [_VARS]-‬البٌانللات المرسلللة هللً متغٌللرات ولٌسللت ملفللات سللواء كانللت فٌللدٌو‪ ,‬أو‬
‫صورً ا ‪ ,‬أو غٌرها ‪.‬‬
‫ٖ ‪ ['id']-‬اسم المتغٌر المستقبل ‪.‬‬

‫من الناحٌة األخلرى فقلد قمنلا بتفعٌلل المتغٌلر ]‪ , [magic_quotes_gpc‬وذللك بجعلل‬


‫]‪ [ON‬فللً الملللف ]‪ , [php.ini‬وبكللل تأكٌللد سللوف ٌقللوم بعملٌللة الللتخلص مللن بعللض‬
‫النصوص البرمجٌة الخبٌثلة المضلافة إللى المتغٌلرات المرسللة ‪ ,‬وذللك ب ضلافة ]\[ إللى‬
‫هذه المتغٌرات ‪ ,‬والتلً ستوضلع أملام اإلضلافات غٌلر المرغوبلة ‪ ,‬وبعلدها اسلتخالص‬
‫رقم واحد من القٌم المستقبلة ‪.‬‬

‫فلو أضفنا رمز ]‘[ ‪,‬سٌقوم ب ضلافة ]\[ إللى االسلتعالم‪ ,‬و ٌكلون عنلدها قلد تخللص ملن‬
‫اإلضللافة الخبٌثللة ‪ ,‬وسللٌعمل االسللتعالم بشللكل سلللٌم ‪ ,‬انظللر إلللى الشللكل ‪ 6.1‬الللذي ٌمثللل‬
‫المخرجات بعد تنفٌذ النص رقم ‪. 6.2‬‬

‫الشكل ‪6.1‬‬

‫‪50‬‬
‫ولكلن ٌبقلى دور ]‪ [magic_quotes_gpc‬محلدو ًدا‪ ,‬فقلد ٌلتم إضلافة رملوز مثلل ]‪[- -‬‬
‫(التعلٌقات) التً تقوم بالتالعب باالستعالم ( ولذلك ال ت دي عملها بالشكل المطلوب أو‬
‫قد ٌعطلها كلٌا ً) ‪.‬‬

‫من أنواع المتغٌر ]_‪: [$HTTP‬‬

‫ٔ ‪ٌ [$HTTP_GET_VARS]-‬ستخدم الستقبال قٌم المتغٌرات عن طرٌق ]‪. [GET‬‬


‫ٕ ‪ٌ [$HTTP_POST_VARS]-‬ستخدم الستقبال قٌم المتغٌرات عن طرٌق ]‪. [POST‬‬

‫الحل الثانً ‪:‬‬


‫ملن الممكللن اسللتخدام الداللة ]‪ , [magic_quotes‬أو الدالللة ])(‪ [addslashes‬إلضللافة‬
‫]\[ ‪ ,‬وهذا األمر ٌلتم تلوفٌره ملن قبلل لغلة ]‪ [php‬لتسلهٌل عملٌلة حلذف العالملات غٌلر‬
‫المرغوب بها ‪.‬‬
‫كما تشاهد فً األسفل بعض التطبٌقات على هذه الدوال ‪:‬‬
‫; ]'‪$id=$HTTP_GET_VARS['id‬‬
‫;)‪$new_id=addslashes($id‬‬
‫;"'‪$sql="SELECT * FROM page where id='$new_id‬‬
‫;)">‪echo("<br‬‬
‫;)‪$q=mysql_query($sql‬‬
‫{))‪while($row=mysql_fetch_array($q‬‬
‫;)]'‪echo(" title Is : ".$row['title‬‬
‫}‬
‫النص البرمجً ‪6.3‬‬
‫‪ magic_quotes‬ولكلللن عنلللد تنفٌلللذ اللللنص‬ ‫داللللة ‪ addslashes‬تعملللل بلللنف طرٌقلللة‬
‫البرمجً رقم ‪ 6.3‬كان الناتج انظر إلى الشكل ‪. 6.2‬‬

‫‪51‬‬
‫الشكل ‪6.2‬‬
‫الحل الثالث‪:‬‬
‫إذاً كما شاهدنا ‪,‬من إحدى الطرق المستخدمة تخصلٌص البٌانلات المسلتقبلة‪ ,‬وللذلك للو‬
‫أردنا اسلتقبال معلوملات خاصلة باللـكعك‪ ,‬وبعلد ذللك تلم إرسلال مللف ملن أي نلوع غٌلر‬
‫الكعللك ‪ ,‬فلللن ٌللتم اسللتقبال ‪,‬وكللذلك لللو أردنللا اسللتقبال نصللوص]‪ [string‬وتللم إرسللال‬
‫معلومات خاصة بالـكعك فلن ٌتم استقبالها وسوف ٌتم تجاهلها ‪.‬‬

‫بالنسللبة للدالللة ]‪ , [mysql_real_escape_string‬فهللً تسللتخدم للللتخلص مللن بعللض‬


‫الرموز الثنائٌة‪ ,‬أو اللغلات التلً تسلمى (متعلددة الباٌلات ]‪,[Multi-byte languages‬‬
‫مثللل اللغللة الٌابانٌللةالتً قللد تسللبب مشللاكل فللً قواعللد البٌانللات ‪ ,‬مللن حللذف الجللداول‬
‫والتالعب بها و طرٌقة عملها كالسلابق ب ضلافة رملز ]\[ إللى المتغٌلر المسلتقبل ‪ ,‬انظلر‬
‫إلى النص البرمجً رقم ‪:6.4‬‬

‫; ]'‪$id=$HTTP_GET_VARS['id‬‬
‫;)‪echo $new_id= mysql_real_escape_string($id‬‬
‫;)">‪echo("<br‬‬
‫;"'‪echo $sql="SELECT * FROM page where id='$new_id‬‬
‫;)‪$q=mysql_query($sql‬‬
‫{))‪while($row=mysql_fetch_array($q‬‬
‫;)]'‪echo(" title Is : ".$row['title‬‬
‫}‬
‫النص البرمجً ‪6.4‬‬

‫‪52‬‬
0 [Race Condition] ‫اإلخالل بالشروط‬

ٔ٘
http://drupal.org/node/43511 , ٖٕٙ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-362

53
‫عزٌللزي القللارئ ‪ ,‬تخٌللل أنللك تقللود سللٌارتك علللى طرٌللق سللرٌع ذي اتجللاه واحللد وكانللت‬
‫هناك سٌارة أخرى تحاول أن تعبر الطرٌق نفسل ملاذا تتوقلع أن ٌحصلل ؟ ‪ ,‬بكلل تأكٌلد‬
‫سوف تتصادم السٌارتان معا ً بسبب أن كلتٌهما تحاول الحصول على المصلدر(الطرٌلق)‬
‫نفس ‪,‬وبسبب ذلك حصل ما ال تحمد عقباه ‪.‬‬

‫األمر نفس ٌحصل مع تطبٌقات اإلنترنت‪ ,‬فٌقوم المهاجم بمحاولة العبث وإربلاك الموقلع‬
‫و أٌض لا ً تخرٌللب المعلومللات و تعطٌللل الخدمللة عللن العمللل عللن طرٌللق اإلخللالل بللبعض‬
‫الشروط واستخدام المصادر المشتركة ‪.‬‬

‫اإلخالل بالشروط قد ٌ دي إلى تخرٌب كاملل النظلام أو جلزء معلٌن سلواء كلان أمنٌلا ً أو‬
‫حالة متغٌر معٌن ‪,‬وسوف ٌتم شرح مع األمثلة الح ًقا ‪.‬‬

‫على أي مستوى تحدث هذه الثغرة ؟ ‪ ,‬مزا هزً اللغزات التزً تتزأثر بهزا ؟‪ ,‬ومزا هزو مسزتوى‬
‫خطورتها ؟‪:‬‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪,‬و هٌكلٌة ‪ ,‬وبرمجة النظام ‪.‬‬
‫لقلد قلد قاملت منظملة ]‪ [SANS‬بتصلنٌف هلذه الثغلرة عللى أنهلا ذات خطلورة متوسلطة‬
‫]‪.[Medium‬‬

‫لنشاهد سوٌا ً هذا المثال لكً تتضح فكلرة "اإلخلالل بالشلروط" وهلً تحوٌلل قٌملة معٌنلة‬
‫من الحساب الجاري إلى حساب آخر‪.‬‬

‫‪54‬‬
<?

class Transfer

function Transfer(){

global $HTTP_POST_VARS;

$transfer_amount = $HTTP_POST_VARS['transfer_amount']; // ‫قٌمة التحوٌل‬

$balance =$this->GetBalanceFromDatabase(); // ‫االستعالم عن قٌمة الحساب الجاري‬

if($transfer_amount<0){

echo("wrong the $transfer amount > 0");

else{

$newbalance = $balance - $transfer_amount;

if($newbalance<0){

echo("Insufficient Funds");

else{

$this->SendNewBalanceToDatabase($newbalance);

echo ("Transfer of $transfer_amount succeeded.");

function SendNewBalanceToDatabase($newbalance){

// ‫تحدٌث المعلومات فً قاعدة البٌانات‬

function GetBalanceFromDatabase(){

};

$start_new=new Transfer();

?>

55 7.1 ً‫النص البرمج‬


‫لنقم سوٌا ً بتحلٌل النص البرمجً رقم ‪ 7.1‬ونشاهد ماذا سوف ٌحصل !‬

‫لنفرض أنك قمت بفلتح هلذه الصلفحة ملرتٌن ‪ ,‬وقملت بتنفٌلذ وطللب الصلفحة فلً الوقلت‬
‫نفسلللل تقرٌبللللا ً ‪ ,‬مللللا هللللً النللللواتج الممكللللن حصللللولها ؟ علمللللا ً بللللأن الثغللللرة تبللللدأ مللللن‬
‫]‪ [GetBalanceFromDatabase‬وحتى ]‪. [SendNewBalanceToDatabase‬‬

‫للنعطِ اسلمًا للصلفحة األوللى ٔ وللصلفحة الثانٌلة ٕ ‪ ,‬سلوف ٌبلدأ تنفٌلذ ٔ‪ ,‬وكلان‬
‫المبللللل المطللللوب تحوٌلللل إللللى حسلللاب مختللللف ٓٓٔ لاير ]‪ ,[$transfer_amount‬والمبللللل‬
‫المتلللللوافر فلللللً الحسلللللاب الجلللللاري ٕٓٓ لاير ]‪ ,[$balance‬وبعلللللد عملٌلللللة الخصلللللم‬
‫]‪ ,[$newbalance‬بقللً اآلن نقللل قٌمللة الحسللاب الجللاري إلللى قاعللدة البٌانللات وعملٌللة النقللل‬
‫تلأخرت وللم تكتمللل بعلد ! ‪ ,‬وفللً هلذه الفتلرة بللدأ ٕ بالتنفٌلذ ‪ ,‬وكللان المبللل المطلللوب‬
‫تحوٌللل ٔ لاير ‪ ,‬وتللم خصللم هلللذه القٌمللة مللن الحسللاب الجلللاري وإرسللالها إلللى قاعلللدة‬
‫البٌانات‪ ,‬وأصبح الرصلٌد ‪ , ٔ99‬وبعلد أن اكتملل تنفٌلذ ٔ قلام بخصلم ٓٓٔ لاير ملن‬
‫ٕٓٓ لاير ‪ ,‬و تللم تعللدٌل البٌانللات ‪,‬أصللبح الرصللٌد ٓٓٔ لاير وهللذا غٌللر صللحٌح ‪ ,‬ألن‬
‫الصحٌح أن ٌكون الرصٌد النهائً ‪ 99‬رٌاالً بدالً من ٓٓٔ لاير أو ‪ ٔ99‬رٌاالً ‪.‬‬

‫بسبب أن كلتا الصفحتٌن تسلتخدمان المصلدر نفسل "قاعلدة البٌانلات" حصلل تصلادم فلً‬
‫هذه البٌانات ! كٌف ؟‬

‫أثنللاء تللأخر ٔ فللً نقللل القٌمللة الجدٌللدة للحسللاب الجللاري بللدأ تنفٌللذ ٕ وأكمللل تنفٌللذه‬
‫وكانت قٌمة الحساب الجلاري الجدٌلد ‪ ,ٔ99‬ولكلن قٌملة الحسلاب الجلاري المخلزن للدى‬
‫ٔ ٕٓٓ لاير ولللٌ ‪ ٔ99‬رٌللاالً ولللذلك سللوف ٌبنللً جمٌللع العملٌللات علللى المعلومللات‬
‫التً ٌملكها وهً أن الحساب الجاري هو ٕٓٓ لاير ولٌ القٌمة الجدٌلدة للحسلاب وهلو‬
‫‪ ٔ99‬رٌاالً ‪.‬‬

‫‪56‬‬
) ‫انحهىل انًتىفزة نًشكهت (اإلخالل بانشزوط‬

ٔٙ
http://cwe.mitre.org/data/definitions/362.html

57
‫الحل األول ‪:‬‬
‫قللم بعملٌللة تللزامن المعلومللات ]‪ , [Data synchronization‬التللً ٌقصللد بهللا جعللل‬
‫المعلوملات تتعلاون مللع بعضلها الللبعض وتتماسلك وٌحصللل بٌنهلا تكاملل مللن أخلذها مللن‬
‫المصللدر وحتللى تخزٌنهللا فللً جهللاز التخللزٌن والعك ل صللحٌح ‪ ,‬وٌللتم ذلللك باسللتخدام‬
‫األقفال ]‪ , [locks‬التً تقوم بحجز المصدر الملراد اسلتخدام لشلخص واحلد فلً لحظلة‬
‫معٌنللة مللن الللزمن وهللذا مللا ٌسللمى ]‪ , [exclusive‬أو قللد ٌكللون المصللدر مشللتر ًكا فٌللتم‬
‫تعدٌل من أكثر من شخص فً الوقت نفس ]‪ [shared‬شاهد النص البرمجلً رقلم ‪8.1‬‬
‫لكً تتضح الفكرة ‪.‬‬

‫;)"‪$fp = fopen("messages.txt", "r+‬‬

‫{ ))‪if (flock($fp, LOCK_EX‬‬

‫;)‪ftruncate($fp, 0‬‬

‫;)"‪fwrite($fp, "Write something here\n‬‬

‫;)‪flock($fp, LOCK_UN‬‬

‫{ ‪} else‬‬

‫;"!‪echo "Couldn't get the lock‬‬

‫}‬

‫النص البرمجً ‪8.1‬‬


‫‪58‬‬
‫فللً الللنص البرمجللً رقللم ‪ 8.1‬قمنللا فللً سللطر ])‪ , [flock($fp, LOCK_EX‬بحصللر القللراءة‬
‫والكتابة بعمٌل واحد فً لحظة معٌنة فجعلنها حصرٌة ]‪, [exclusive‬وبعدما ٌنتهً هلذا‬
‫العمٌللل ملللن الكتابلللة عللللى مللللف ]‪ٌ [messages.txt‬قللوم بفلللك هلللذا الحصلللر باسلللتخدام الداللللة‬
‫])‪. [flock($fp, LOCK_UN‬‬

‫باستخدام الدالة ]‪ , [flock‬التً تستقبل متغٌرٌن األول هو الملف المراد التعامل معل ]‪[$fp‬‬
‫واآلخر هو الحالة التً سوف ٌسند إلٌها هذا المللف ! وهنلاك علدة حلاالت منهلا (حصلر‬
‫الملف بعمٌل واحد فً وقت معٌن ‪ ) LOCK_EX‬وعند االنتهاء ملن عملٌلة الحصلر نقلوم‬
‫بفك الحصر بتغٌٌر المتغٌر فً الدالة بجعل ]‪. [LOCK_UN‬‬

‫الحل الثانً ‪:‬‬


‫فً مرحلة التأكد من صحة النظام ]‪ : [testing‬تأكلد ملن أن اللنص البرمجلً خلال‬
‫من ]‪.[infinite loop‬‬

‫‪59‬‬
0 [Error Message Information Leak] ‫رسا ل الخطأ المسربة للبٌانات‬

ٔ7
ٕٙٗ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-209

60
‫عزٌلزي القللارئ‪ ,‬إن إخبلار المسللتخدم باألخطللاء التلً ترسللل ملن قبللل الخللادم ]‪[server‬‬
‫إلللى المتصللفح فللً كثٌللر مللن األحٌللان قللد تكشللف أسللرار وخصللائص الخللادم أو تكشللف‬
‫كلمات المرور ‪.‬‬

‫قد تفٌد رسائل الخطأ فً اكتشاف ثغرات أخرى ‪ ,‬حٌث ملن المعللوم أن طرٌقلة اكتشلاف‬
‫ثغرة الحقنة االستعالمٌة عن طرٌق األخطاء التً ٌنشئها الخادم ‪.‬‬
‫ضا تكشف رسائل الخطأ مسارات الملفات فً الخادم و عنلدها تسلتطٌع قلراءة الملفلات‬ ‫أٌ ً‬
‫الحساسة ‪.‬‬

‫على أي مستوى تحدث هذه الثغرة ؟ ما هً اللغات التً تتأثر بها ؟ ومزا هزو مسزتوى‬
‫خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪,‬و هٌكلٌة ‪,‬و برمجة النظام ‪ ,‬وإعدادات النظلام "‬
‫الخادم " ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وبللاألخص لغللة ]‪[PHP‬‬
‫وكذلك قامت منظمة ]‪ [Sans‬بتصنٌف هذه الثغرة بأنها ذات خطورة عالٌة ]‪. [High‬‬

‫‪61‬‬
‫لنشاهد المثال التالً لتوضٌح الفكرة أكثر ‪.‬‬

‫> "‪<form action="users.php" method="post‬‬

‫>"‪<input type="text" name="username‬‬

‫>‪" /‬دخول"=‪<input type="submit" name="submit_" value‬‬

‫>‪</form‬‬

‫ٌوجللد‪9.1‬بل حقللل واحللد فقللط اسللم المسللتخدم‬ ‫لجٌل‬


‫البرمجً‬ ‫الللنص البرمجللً رقللم ‪ 9.1‬هللو نمللوذج تسل‬
‫النص‬
‫]‪ [username‬و زر لتسللللجٌل الللللدخول ]_‪ [submit‬مكتللللوب بلغللللة ]‪ , [Html‬وعنللللد‬
‫الضلغط علللى زر (دخللول) سللوف ترسلل المعلومللات إلللى صللفحة ]‪ [users.php‬الللنص‬
‫البرمجً رقم ٕ ‪.‬‬

‫أما بالنسبة لملف ]‪ [users.php‬فهو بالشكل التالً ‪:‬‬


‫?<‬

‫‪class file_check‬‬

‫{‬

‫{)(‪function file_check‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$username = $HTTP_POST_VARS['username‬‬

‫;)‪echo file($username‬‬

‫}‬

‫;}‬ ‫عنلللدما ٌقلللوم المهلللاجم ب دخلللال اسلللم مسلللتخدم ]‪ [$username‬غٌلللر موجلللود تقلللوم الداللللة‬
‫])‪ [file($username‬بتسرٌب بٌانات أماكن وجود الملفات على الخادم ‪ ,‬وبلال شلك ظهلور‬
‫;)(‪$start_new=new file_check‬‬
‫هذا الخطأ ما هو إال بسبب أن اسم المستخدم الذي ٌمثل اسم الملف المراد قراءت لم ٌكن‬
‫>?‬
‫موجوداً ‪.‬‬
‫النص البرمجً ‪9.2‬‬

‫الشكل ‪9.1‬‬

‫‪62‬‬
‫ٌمثللل الشللكل ‪ 9.1‬القٌمللة المدخلللة وهللً اسللم الملللف المللراد قراءتل وبعللد الضللغط علللى‬
‫دخول كان الناتج ‪ ,‬انظر إلى الشكل رقم ‪. 9.2‬‬

‫الشكل ‪9.2‬‬

‫كما تالحظ فً الشكل رقم ‪ 9.2‬أن قام ب ظهار رسالة على أسا أن الملف غٌر موجلود‬
‫باإلضللللللللللافة إلللللللللللى معلومللللللللللات أمللللللللللاكن وجللللللللللود الملفللللللللللات علللللللللللى الخللللللللللادم‬
‫]‪ , [c:\AppServ\www\p2\users.php‬هذه الثغرة ال تمثل خطرً ا كبٌرً ا على الموقع ولكن قد‬
‫تظهر بعض الملفات المهمة مثالً قلد تمثلل أسلماء األعضلاء بشلكل مجللدات فعنلد ظهلور‬
‫رسالة الخطأ قد ٌعرض مع اسم المستخدم لهذا المجلد على سبٌل المثال ‪,‬المسار التلالً‬
‫‪:‬‬
‫]‪ [c:\AppServ\www\aldeheme\users.php‬هنللللا قللللام بعللللرض لنللللا اسللللم المجلللللد الخللللاص‬
‫بالمسللتخدم ]‪ [aldeheme‬وعنللدها قمنللا ب ل عالم المختللرق أن ل ٌوجللد لللدٌنا عضللو اسللم‬
‫]‪.[aldeheme‬‬

‫‪63‬‬
‫)‬ ‫انحهىل انًتىافزة نًشكهت (رسائم انخطأ انًسزبت نهبياَاث‬

‫الحل األول ‪:‬‬


‫تأكللد مللن أن المعلومللات التللً سللتظهر عنللد وجللود خطللأ معللٌن ‪ ,‬تعطللً معلومللات كافٌللة‬
‫لألشخاص المستهدفٌن بالرسالة ‪ ,‬وأٌضا ً ال تقم ب ظهار اسم الدالة التً حدث فٌها الخطلأ‬
‫‪ ,‬كللذلك قللم ب ظهللار الرسللائل ولكللن ٌجللب أن تكللون مبهمللة‪ ,‬و قلٌلللة الوضللو بحٌللث أن‬
‫ٌكون لهلا ملدلول ولكلن لشلخص معلٌن وللٌ للمهلاجم ! عزٌلزي القلارئ ‪ ,‬إذا أردت أن‬
‫تظهر معلومات مفصلة علن الخطلأ قلم بتخلزٌن الطلبلات غٌلر الصلحٌحة فلً السلجالت‬
‫]‪ [logs‬وال تنسلى أنل ٌجللب علٌللك إخفللاء هللذا الملللف قللدر المسللتطاع لكللً ال ٌصللل إلٌل‬
‫المهاجم‪ ,‬وكذلك ال تقم بتسجٌل المعلومات الحساسلة مثلل كلملة الملرور داخلل السلجالت‬
‫]‪.[logs‬‬
‫لنشللاهد مثللاالً واقعٌلا ً علللى السللجالت ]‪ [logs‬وطرٌقللة تتبللع زوار الموقللع ‪ ,‬سللوف أقللوم‬
‫بالللللللللللللللللللدخول إلللللللللللللللللللى مللللللللللللللللللوقعً الخللللللللللللللللللاص وأطلللللللللللللللللللب الصللللللللللللللللللفحة‬

‫‪ٔ8‬‬
‫‪http://cwe.mitre.org/data/definitions/209.html‬‬

‫‪64‬‬
‫]'‪ , [http://aldeheme.com/?info.php?id=11‬سللوف ٌسللجل هللذا الطلللب فللً‬
‫ملف السجالت]‪ [logs‬على أن الشخص صاحب ]‪ [188.248.152.82] [ip‬قام بطلب‬
‫هذه الصفحة محاوالً اختراق الموقع ‪ ,‬عند معرفتك رقم ]‪ [ip‬للمهاجم تستطٌع منع ملن‬
‫دخول الموقع ‪ ,‬وقد ٌعد هذا الحل غٌر جلذري ألنل ملن الممكلن أن ٌقلوم المهلاجم بتغٌلر‬
‫رقللم ]‪ [ip‬الخللاص ب ل ‪ ,‬ومللن ثللم ٌسللتطٌع الللدخول بكللل ٌسللر ! ‪ ,‬انظللر إلللى الشللكل رقللم‬
‫‪. 10.1‬‬

‫الشكل ‪10.1‬‬

‫الحل الثانً ‪:‬‬


‫قم بمعالجة األخطاء داخل نطاق النص البرمجً ‪ ,‬وال تظهر هلذا الخطلأ عللى الشاشلة ‪,‬‬
‫وتمت هذه العملٌة باستخدام ]‪ [try‬و ]‪ , [catch‬انظر إلى النص رقم ‪. 10.1‬‬

‫{)‪function try_($x‬‬

‫{ )‪if (!$x‬‬

‫;)"‪throw new Exception("no_zero‬‬

‫}‬

‫;‪else return 1/$x‬‬

‫}‬

‫{ ‪try‬‬

‫;"‪echo try_(10) . "\n‬‬

‫;"‪echo try_(0) . "\n‬‬

‫}‬

‫{ )‪catch (Exception $e‬‬


‫‪65‬‬ ‫;"‪echo 'Caught exception: ', $e->getMessage(), "\n‬‬

‫}‬
‫كمللا شللاهدت عزٌللزي المبللرمج فب مكانللك اسللتخدام ]‪ [try‬لكللً تضللع رسللالة الخطللأ التللً‬
‫ترٌد أن تظهر وهً ( ال تدخل صفرً ا) ‪.‬‬

‫الحل الثالث ‪:‬‬


‫معظللم اللغللات ومنهللا ]‪ [php‬تمتلللك دوال خاصللة تقللوم بعللرض األخطللاء فننصللحك بللأن‬
‫تستخدمها ألنها تعطً معلوملات قلٌللة ومفٌلدة وال ٌسلتطٌع المهلاجم اسلتغاللها وملن هلذه‬
‫الدوال ])(‪ , [error_reporting‬أنظر إلى النص رقم ‪ 10.2‬لكً تتضح الفكرة ‪.‬‬

‫;)‪error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE‬‬

‫أولهلا خطلأ إمالئلً ]‪, [E_PARSE‬أو‬ ‫أصناف‬


‫‪10.2‬‬ ‫إن لغة ]‪ , [php‬تقوم بتقسٌم األخطاء إلى‬
‫النص البرمجً‬

‫تنبٌ ]‪ [E_NOTICE‬وتظهر هذه الرسالة عند اسلتخدام متغٌلر بلدون تعرٌلف مسلبق لل ‪,‬‬
‫أو تحلللذٌر ]‪ [E_WARNING‬وتظهلللر هلللذه الرسلللالة عنلللد القسلللمة عللللى صلللفر أو عنلللد‬
‫اسلللتدعاء داللللة ولكلللن ملللع زٌلللادة أو حلللف بعلللض متغٌرهلللا‪ ,‬أو خطلللأ قبلللل التنفٌلللذ‬
‫]‪ ,[E_ERROR‬بالنسبة للخطأ اإلمالئً لن ٌكتمل تنفٌلذ الصلفحة ‪ ,‬وسلوف تظهلر رسلالة‬
‫خطأ ‪ ,‬أما األخطاء التحذٌرٌة ‪,‬فسوف ٌكتمل التنفٌذ ولكن مع إظهار رسالة التحذٌر ‪.‬‬
‫فللً الللنص البرمجللً رقللم ‪ , 10.2‬قمنللا بتحدٌللد إعللدادات لغللة ]‪ , [php‬بحٌللث أنل لللو‬
‫حصل خطأ سواء قمنا باستخدام متغٌر لم ٌتم إنشا ه أو قمنلا بكتابلة متغٌلر بشلكل خلاط‬
‫‪,‬على سبٌل المثال لم نضع ];[ فً نهاٌة األمر البرمجً ‪ ,‬عندها سوف ٌتم إظهار جمٌلع‬
‫موضحة الخطأ الذي حصل ! كذلك فً النص البرمجلً رقلم ‪ ٔ 0.2‬جعلنلا‬ ‫ً‬ ‫هذه الرسائل‬
‫الدالة ]‪ [error_reporting‬تظهر لنا جمٌع األخطاء ‪ ,‬ولكن نسلتطٌع أن نحصلرها بأخطلاء‬
‫معٌنة بالطرٌقة التالٌة ‪ ,‬انظر إلى النص البرمجً رقم ‪: 10.3‬‬

‫‪66‬‬
‫;)‪error_reporting(all‬‬

‫النص البرمجً ‪10.3‬‬

‫الحل الرابع ‪:‬‬


‫قم ب نشاء صفحة أخطاء بحٌث لو حدث خطأ ُتعرض هذه الصفحة التلً ال تحتلوي عللى‬
‫معلومات عن الخطأ ‪ ,‬انظر إلى النص البرمجً رقم ‪. 10.4‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$id = $HTTP_GET_VARS['id‬‬

‫{)""==‪if($id==0 || $id‬‬

‫;)" >‪echo("<script>window.location='html/index.htm';</script‬‬

‫}‬

‫{‪else‬‬

‫;)"شكرً ا"(‪echo‬‬

‫}‬
‫ً‬
‫بسلٌطا ٌتحقلق ملن‬ ‫عزٌزي المبرمج فً النص البرمجً رقلم ‪ 10.4‬أنشلأنا ن ً‬
‫صلا برمجًٌلا‬
‫النص البرمجً ‪10.4‬‬
‫القٌمة المدخلة ]‪ [$id‬ال تساوي صفر ‪ ,‬أو أنها لٌست فارغلة ]‪ , ! [null‬وعنلدما ٌتحقلق‬
‫أحللد الشللرطٌن السللابقٌن ٌقللوم بتحوٌللل الزائللر إلللى الصللفحة ]‪ [index.htm‬التللً قمنللا‬
‫ب نشائها ‪ ,‬انظر إلى النص رقم ‪ , 10.5‬وطرٌقة التحوٌل تمت بلغة الجافا السكربت ‪.‬‬

‫];)" >‪[echo("<script>window.location='html/index.htm';</script‬‬

‫"‪<p align="center"><b><span lang="ar-sa"><font size="6‬‬


‫عزٌزي>"‪color="#FF0000‬‬

‫>‪ ! </font></span></b></p‬الزائر لقد قمت بطلب صفحة غٌر موجودة‬

‫‪<p align="center"><font color="#FF0000"><b><span lang="ar-sa"><font‬‬


‫>"‪size="6‬‬

‫>‪ </font></span></b‬الرجوع إلى الصفحة السابقة ;‪</font><font size="6">&nbsp‬نرجو‬


‫للللللللنقم بتجربلللللللة هلللللللذه النصلللللللوص البرمجٌلللللللة ‪ ,‬لقلللللللد قملللللللت بطللللللللب الصلللللللفحة‬
‫>‪</font></p‬‬
‫]‪ [localhost/p2/rei.php?id=0‬وكان الناتج كما فً الشكل ‪. 10.2‬‬
‫النص البرمجً ‪10.5‬‬

‫‪67‬‬
‫الشكل ‪10.2‬‬

‫‪68‬‬
0 [OS Command Injection] ‫حقنة أوامر نظم التشغٌل‬

ٔ9
78 : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-78

69
‫عزٌللزي القللارئ ‪ ,‬عنللد وضللع برنللامج لٌقللوم بعمللل معللٌن وٌعتمللد بشللكل أساسللً علللى‬
‫مدخالت العمٌل ! ف ن من الممكن أن ٌقلوم العمٌلل ب دخلال رملوز لتنفلذ أواملره الخاصلة‬
‫بدالً من األوامر الخاصة بنا ‪.‬‬

‫حقٌقة تعرٌف حقنة أوامر نظم التشغٌل ٌختلف من شخص إلى آخر ‪ ,‬فالبعض عرفها‬ ‫ً‬
‫بأنها ‪ :‬أي نوع من أنواع المهاجمة التً تتضمن إدخال أوامر وتنفٌذها على نظام‬
‫التشغٌل والتً تسمى مسار البحث الغٌر موثوق ]‪ [untrusted search path‬وسوف‬
‫ٌتم شرحها الح ًقا ‪ ,‬وهناك من عرفها بأنها هً القدرة على حقن أوامر داخل المتغٌرات‬
‫التً تستخدم مع البرامج المسٌطرة ]‪ [application-controlled program‬وكما‬
‫هو معروف ف ن البرامج المسٌطرة مثل ]‪ [nslookup‬و ]‪. [nslookup‬‬

‫ف ن من الممكن أن ٌقوم المهاجم بتنفٌذ أوامر خطرة بشكل مباشر على النظلام ملع أنل ال‬
‫ٌملك أي صالحٌة علٌها ‪ ,‬ولحقن هذه األوامر بطرٌقتٌن ‪:‬‬

‫ٔ ‪-‬الحقن عن طرٌق دمج أمر خبٌث مع متغٌرات برنامج معٌن ‪ ,‬على سبٌل المثال برنامج‬
‫]‪ [nslookup‬الذي ٌكتب بالشكل (‪ )]nslookup [HOSTNAME‬حٌث إن‬
‫‪ HOSTNAME‬عبارة عن اسم المضٌفٕٓ الذي ٌُرسل إلى برنامج معٌن بصفت‬
‫متغٌرً ا‪ ,‬وهذه البرامج قد تسمح للمهاجم بأن ٌقوم بتحدٌد هذا المتغٌر‪ ,‬من هذه النقطة‬
‫أعطت إمكانٌة للمهاجم بأن ٌتالعب بهذا المتغٌر وٌقوم ب ضافة أوامر خبٌثة وتنفٌذها‬
‫على نظام التشغٌل ‪ ,‬وٌزٌد األمر خطورة أن إذا لم ٌمتلك البرنامج إمكانٌة فصل‬
‫األوامر التً تأتً مع اسم المضٌف‪ ,‬ب مكان المهاجم أن ٌرسل اسم المضٌف متبوعا ً‬
‫باألمر المراد تنفٌذه وبٌنهما فاصلة منقوطة ];[ !‬

‫ٕ ‪-‬حقللن أوامللر أو القٌللام بتشللغٌل بللرامج علللى مسللتوى الخللادم‪ ,‬وهللذا ٌحللدث عنللدما ٌعطللً‬
‫النظام اإلشارة الخضراء للمهاجم ‪,‬بحٌث أن النظام ٌقبل أي مدخالت ملن العمٌلل سلواء‬
‫كان زائرً ا أو مهاج ًما‪ ,‬وتكون هذه المدخالت على شكل متغٌلرات للبعض اللدوال ! عللى‬

‫ٕٓ االسم الوحٌدالممٌز وكذلك غٌر المكرر فً العالم لشبكة معٌنة مثل ]‪ [IP‬أو ]‪[DNS‬‬
‫‪.‬‬

‫‪70‬‬
‫سبٌل المثال من الممكن استخدام الدالة المعروفلة (‪ ))]exec([COMMAND‬التلً تقلوم‬
‫بتنفٌذ أوامر خاصة بنظام التشغٌل ‪ ,‬وكذلك أعطى الصالحٌة للمهاجم بلأن ٌقلوم ب ضلافة‬
‫أوامر أو تشغٌل برامج لٌ ل صالحٌة فٌها ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ ‪ ,‬مززا هززً اللغززات التززً تتززأثر بهززا ؟‪ ,‬ومززا هززو‬
‫مستوى خطورتها ؟ ‪:‬‬

‫أمللا اللغللات التللً تتللأثر بهللا فهللً جمٌللع اللغللات البرمجٌللة وكللذلك قامللت منظمللة ]‪[Sans‬‬
‫بتصنٌف هذه الثغرة بأنها ذات خطورة عالٌة ]‪. [High‬‬
‫لنشاهد سوٌا ً هذا المثال لتتضح الفكرة ‪.‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$_var = $HTTP_GET_VARS['var‬‬

‫;)‪echo exec ($_var‬‬

‫النص البرمجً ‪11.1‬‬

‫تقوم الدالة ]‪ [exec‬بتنفٌذ أوامر نظم التشغٌل ‪ ,‬وكذلك وتشغٌل برامج أو ملفات خارجٌلة‬
‫‪ ,‬كذلك لهذه الدالة فوائد منها إمكانٌة التعامل مع ملفات ]‪ [SWF‬أو ]‪ ,[PDF‬ولكلن بملا‬
‫أن األوامر تستقبل من الخارج "العمٌل" فمن الممكن أن توضع أواملر لكشلف المجللدات‬
‫وملفات الموقع بكل سهولة ‪.‬ومن ثم ٌتم االختراق ‪ ,‬شاهد النص البرمجً رقم ‪. 11.2‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$id_dep = $HTTP_GET_VARS['id_dep‬‬

‫;)"‪echo exec("$id_dep‬‬

‫النص البرمجً ‪11.2‬‬

‫‪71‬‬
‫فللً الللنص البرمجللً رقللم ‪ , 11.2‬قمنللا مباشللرة باسللتقبال ]‪ [id_dep‬وجعلنللاه كمتغٌللر‬
‫لدالللة ]‪ , [exec‬و بهللذه الطرٌقللة جعلنللا الخللادم عرضللة للخطللر ‪ ,‬حٌللث أنل بتنفٌللذ األمللر‬
‫] ‪ٌ [copy ٕٔC:\\AppServ\\www\\p2\\2.txt d:\\ss‬سلتطٌع المهلاجم نسلي أي‬
‫ملف ٌرٌده إلى جهازه ومن ثم قراءت مثلما ٌرٌد ‪ ,‬فلو فرضلنا أن المهلاجم وضلع األملر‬
‫التالً كما فً الشكل ‪. 11.1‬‬

‫الشكل ‪11.1‬‬

‫فعنللد تنفٌلللذ األمللر (شلللكل ‪ٌ ) 11.1‬سللتطٌع المهلللاجم نسللي مللللف ]‪ [config.php‬اللللذي‬


‫ٌحتوي على معلومات قاعدة البٌانات ومن ثم ٌقوم باستغاللها فً اختراق الموقلع بقلراءة‬
‫معلومللات قاعللدة البٌانللات ‪ ,‬بعللد عملٌللة نقللل الملللف سللوف ٌقللوم المهللاجم بفتح ل وقللراءة‬
‫محتوٌات ‪ ,‬انظر إلى الشكل ‪.11.2‬‬

‫الشكل ‪11.2‬‬

‫ٕٔ‬
‫‪http://www.computerhope.com/copyhlp.htm‬‬

‫‪72‬‬
‫الحلول المتوافرة لمشكلة (حقنة أوامر نظم التشغٌل‪)00‬‬

‫ٕٕ‬
‫‪http://cwe.mitre.org/data/definitions/78.html‬‬

‫‪73‬‬
‫الحل األول ‪:‬‬
‫عزٌزي القارئ ‪ ,‬عندما تقوم باستخدام معلومات معٌنة التً تمثل أمرً ا معٌ ًنلا أجعلل قلدر‬
‫المستطاع فً نطاق الموقع ولٌ للحدود الخارجٌة أي تأثٌر علٌ ‪,‬فعلى سبٌل المثلال ال‬
‫تقللم بنقللل أمللر معللٌن باسللتخدام الحقللول المخفٌللة ولكللن قللم باسللتخدام الجلسللة لتخللزٌن هللذه‬
‫المعلومات التً سوف تستخدم لتنفٌذ أمر معٌن ‪ ,‬انظر إلى النص البرمجً رقم ‪. 12.1‬‬

‫;"‪$_SESSION['Command']="mkdir admin‬‬

‫'(‪echo‬‬

‫> "‪<form action="Command.php" method="post‬‬

‫>‪<input type="text" name="firstname"/‬‬

‫>‪<input type="text" name="lastname"/‬‬

‫>‪" /‬تحدٌث"=‪<input type="submit" name="submit_" value‬‬

‫>‪</form‬‬

‫;)'‬

‫‪ [mkdir admin‬اللذي ٌقلوم ب نشلاء مجللد اسلم‬ ‫النصاألملر‬


‫البرمجً] ‪12.1‬‬ ‫فً اللنص البرمجلً رقلم ‪ , 12.1‬قمنلا بتخلزٌن‬
‫]‪ [admin‬فً الجلسة ‪ ,‬وكذلك ٌوجد نموذج ]‪ٌ [form‬تكون من حقلٌن (االسم األول ‪ ,‬الثلانً ) ‪ ,‬و‬
‫زر تحدٌث ‪.‬‬

‫وعند الضغط على زر تحدٌث سوف ترسل المعلومات إلى النص البرمجً رقم ‪. 12.2‬‬
‫;]'‪$Command=$_SESSION['Command‬‬ ‫‪.‬‬
‫;)‪exec($Command‬‬

‫النص البرمجً ‪12.2‬‬


‫فً النص البرمجً رقم ‪ , 12.2‬قمنلا باسلتقبال األملر علن طرٌلق الجلسلة وملن ثلم تنفٌلذه باسلتخدام‬
‫الدالة]‪. [exec‬‬

‫الحل الثانً ‪:‬‬

‫‪74‬‬
‫قم بتعطٌل الدوال المس ولة عن تنفٌذ أواملر نظلم التشلغٌل ‪ ,‬مثلل داللة ]‪ , [exec‬أو داللة‬
‫]‪ , [system‬بالنسللبة للتعطٌللل ف ن ل سللوف ٌللتم عللن طرٌللق مللدٌر الخللادم ‪,‬حٌللث أن ل ل ل‬
‫الصالحٌة للتعدٌل على الدوال فً لغة ]‪ [php‬التً قد تسبب مشاكل أمنٌة ‪.‬‬

‫‪75‬‬
‫نقل البٌانات الحساسة بشكل واضح‬
04[Cleartext Transmission of Sensitive
Information]

ٕٖ
. ٖٔ9 : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-319 , http://www.oxid.it/cain.html

76
‫عزٌزي القارئ ‪ ,‬من الطبٌعلً أن ٌلتم نقلل البٌانلات عبلر شلبكة اإلنترنلت باسلتخدام علدة‬
‫شبكات مختلفة وأجهزة مختلفة‪ ,‬وهذا ما ٌعرض هذه المعلومة للخطلر وأن ٌلتم اكتشلافها‬
‫من قبل المهاجم ‪.‬‬
‫عنللللللدما ٌسللللللٌطر المهللللللاجم علللللللى إحللللللدى الشللللللبكات فب مكانلللللل التجسلللللل وأخللللللذ‬
‫المعلومات]‪ [sniffing‬التً تنتقل فٌها ‪ ,‬هذه الثغرة فً الحقٌقة تتعلق بأمان الشلبكة وفلً‬
‫الوقت نفس ٌجب على المبرمج حماٌلة المعلوملة قلدر المسلتطاع ‪ ,‬سلوف تشلاهد طلرق‬
‫حماٌة المعلومات عندما تقرأ الحلول المقترحة لهذه الثغرة ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ ‪ ,‬مززا هززً اللغززات التززً تتززأثر بهززا ؟ ‪ ,‬ومززا هززو‬
‫مستوى خطورتها ؟ ‪:‬‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪ ,‬و هٌكلٌة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا فهللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [SANS‬بتصنٌف هذه الثغرة بأنها ما بٌن متوسطة الخطلورة وعالٌلة الخطلورة ‪[very‬‬
‫]‪. high‬‬

‫‪ ,‬ومللن ثللم‬ ‫سللوف أقللوم بالتجسل علللى شللبكتً المنزلٌللة باسللتخدام أحللد بللرامج التجسل‬
‫سرقة المعلومات التً تنتقل عبر الشبكة ‪ ,‬انظر إلى الشكل ‪.13.1‬‬

‫الشكل ‪13.1‬‬

‫كمللا تشللاهد فللً الشللكل ‪ , 13.1‬قمللت بالتجسل علللى شللبكتً الخاصللة عللن طرٌللق أحللد‬
‫بللرامج التجس ل التللً ال أحللب أن أذكرهللا خو ًفللا مللن االسللتخدام الخللاط ‪ ,‬فعنللدما قمللت‬
‫بالتجسل ظهللر لللً اسللم المسلتخدم وكلمللة المللرور باإلضللافة إللى طرٌقلة اإلرسللال التللً‬
‫كانت ]‪. [HTTP‬‬

‫‪77‬‬
78
‫الحلول المتوافرة لمشكلة (نقل البٌانات الحساسة بشكل واضح‪)03‬‬

‫الحل األول ‪:‬‬


‫عندما تقوم باستخدام بروتوكول طبقة المقاب ])‪ [Secure Sockets Layer(SSL‬تأكلد‬
‫أنك قمت باستخدام فً جمٌع صفحات الموقلع ملن صلفحة تسلجٌل اللدخول إللى تسلجٌل‬
‫الخروج وال تقم باستخدام فقط فلً صلفحة البداٌلة "تسلجٌل اللدخول" ‪ ,‬ولتوضلٌح عملل‬
‫بروتوكلول طبقلة المقلاب ]‪ [SSL‬أنظلر للشلكل رقلم ‪, 14.1‬واللذي ٌوضلح طرٌقلة عمللل‬
‫]‪.[SSL‬‬

‫ٕٗ‬
‫‪http://cwe.mitre.org/data/definitions/319.html‬‬

‫‪79‬‬
‫شكل ‪14.1‬‬

‫الحل الثانً ‪:‬‬


‫قللم بتشللفٌر المعلومللات مللع اسللتخدام خوارزمٌللة تشللفٌر مناسللبة ‪ ,‬انظللر حلللول مشللكلة‬
‫(استخدام طرٌقة تشفٌر خطرة أو مدمرة)‪.‬‬

‫‪80‬‬
‫التحكم الخارجً بالملفات أو الروابط‬
0 [External Control of File Name or Path]

ٕ٘
. 7ٗ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-73

81
‫عزٌزي القارئ ‪ ,‬على الرغم من أن تبادل المعلومات بلٌن الملفلات أملر طبٌعلً و شلائع‬
‫إال أن إعطاء التحكم بهذه الملفات للعمٌل أمر خطٌر جداً ‪.‬‬
‫عندما ٌكون اسم الملف الملراد قراءتل متغٌلر لداللة معٌنلة ‪ ,‬ف نل ب مكلان المهلاجم وضلع‬
‫رموز خبٌثة أو ملفات خبٌثة تضر بالخادم ملن حٌلث تعطٌلل أو حلذف الملفلات أو قلراءة‬
‫ملفات غٌر مصر للمهاجم بقراءتها ‪.‬‬
‫علزى أي مسزتوى تحزدث هزذه الثغزرة ؟ ‪ ,‬مزا هززً اللغزات التزً تتزأثر بهزا ؟ ‪ ,‬ومزا هززو‬
‫مستوى خطورتها ؟ ‪:‬‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪ ,‬و هٌكلٌة ‪,‬و برمجة النظام ‪ ,‬و النظلام " الخلادم‬
‫"‪.‬‬
‫اللغات التً تتأثر بها هً جمٌع اللغات البرمجٌة بال استثناء ‪ ,‬أملا بالنسلبة لألنظملة التلً‬
‫تتلأثر بهلا فهلً ]‪ , [Mac OS], [Windows], [UNIX‬وقلد قاملت منظملة ]‪[SANS‬‬
‫بتصنٌف هذه الثغرة بأنها ذات خطورة عادٌة وقد تصل إلى الخطورة العالٌة‪.‬‬

‫لنشاهد سوٌا ً هذا المثال لتوضٌح الفكرة ‪.‬‬

‫?<‬

‫‪class rfile‬‬

‫{‬

‫{)(‪function rfile‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$file_up = $HTTP_GET_VARS['file‬‬

‫;)"‪if(unlink($file_up)) echo("delete it‬‬

‫}‬

‫;}‬

‫;)(‪$start_new=new rfile‬‬
‫‪82‬‬
‫>?‬

‫النص البرمجً ‪15.1‬‬


‫النص البرمجً رقلم ‪ 15.1‬تملت برمجتل لٌقلوم بحلذف مللف اسلم ]‪ [test.txt‬فر ً‬
‫ضلا‪,‬‬
‫وٌللتم اسللتقبال ]‪ [test.txt‬مللن خللالل المتغٌللر ]‪ , [file‬ولكللن قللد ٌسللتطٌع المهللاجم حللذف‬
‫جمٌع الملفلات ‪,‬ألن العملٌلة سلهلة جلداً ‪ ,‬ضلع اسلم المللف اللذي ترٌلد حذفل وسلوف ٌلتم‬
‫حذف بشكل مباشر ‪,‬لنفرض أننا وضلعنا مللف ]‪ [db.txt‬بالشلكل التلالً ‪ ,‬انظلر الشلكل‬
‫رقم ‪: 15.1‬‬

‫الشكل ‪15.1‬‬

‫عنللد طلللب الللرابط "الشللكل ‪ " 15.1‬بشللكل مباشللر سللوف ٌقللوم بحللذف الملللف ]‪[db.txt‬‬
‫وٌكون الناتج بعد التنفٌذ ‪ ,‬انظر إلى الشكل ‪. 15.2‬‬

‫الشكل ‪15.2‬‬

‫الحلول المتوافرة لمشكلة (التحكم الخارجً بالملفات أو الروابط ‪)0‬‬

‫‪ٕٙ‬‬
‫‪http://cwe.mitre.org/data/definitions/73.html‬‬

‫‪83‬‬
‫الحل األول ‪:‬‬
‫عملٌة التأكد من المدخالت البد أن تكون على مستوى العمٌل وكلذلك الخلادم ‪ ,‬فالبلد للك‬
‫أخً المبرمج ملن القٌلام بالتأكلد ملن الملدخالت ملرتٌن "الملرة األوللى فلً جهلاز العمٌلل‬
‫واألخللرى فللً الخللادم " ألن ل قللد ٌقللوم العمٌللل بتعطٌللل جافللا سللكربت‪ ,‬أو أحللد اللغللات‬
‫المستخدمة للعمل فً جهلة العمٌلل ]‪ [client-side‬لمشلاهدة األمثللة ‪ ,‬أنظلر إللى حللول‬
‫مشكلة (عدم التحقق من صحة المعلومات المدخلة بشكل صحٌح)‪.‬‬

‫الحل الثانً ‪:‬‬


‫قم باستخدام بعض الدوال التً تتأكد من أن المللف الملدخل صلحٌح وللٌ بل أي رملوز‬
‫غرٌبللة مثللل ”‪ “..‬وكللذلك تقللوم هللذه الللدوال ب ظهللار المسللار الحقٌقللً للملللف ومللن خاللل‬
‫تستطٌع معرفة ما إذا كان هلذا المللف تملت إضلافت ملن الخلارج أو ملن داخلل الموقلع ‪,‬‬
‫انظر إلى النص البرمجً رقم ‪. 16.1‬‬

‫;)'‪echo realpath('psd/1.gif‬‬

‫النص البرمجً ‪16.1‬‬

‫‪84‬‬
‫فللً الللنص البرمجللً رقللم ‪ 16.1‬قمللت ب دخللال الصللورة ]‪ [psd/1.gif‬ألننللً أرٌللد أن‬
‫أعرف مسارها الحقٌقً وهل هذا الملف تمت إضافت محلٌا ً (من قبل الخادم الخلاص بنلا‬
‫) أو من الخارج ‪ .‬فكلان النلاتج أنل تملت إضلافت محلٌلا ً وكلان عنوانهلا الحقٌقلً كملا فلً‬
‫الشلكل ‪ , 16.1‬وكللذلك هلذه الدالللة تفٌلد فللً إزالللة الرملز ]‪ [../‬الللذي تسلتطٌع مللن خاللل‬
‫التنقل فً مجلدات الخادم مثل (‪. )./../../etc‬‬

‫الشكل ‪16.1‬‬

‫الحل الثالث ‪:‬‬


‫ال تقللللللللم بوضللللللللع ]‪ [register_globals‬فللللللللً حالللللللللة اإلٌقللللللللاف ]‪ [off‬حٌللللللللث أن‬
‫]‪ٌ [register_globals‬عللد أحللد المتغٌللرات التللً توجللد فللً ملللف إعللدادات لغللة ]‪[php‬‬
‫فعندما تقوم بتعطٌل فمن الممكن أن ترسل قٌم خبٌثة من الخارج إلى الموقع وهلذه القلٌم‬
‫ال تخضع للتصفٌة التلقائٌة من قبل ]‪ [php‬فلذلك ٌجب أن تقوم بتشغٌل ]‪ ,[on‬لمشاهدة‬
‫أمثلززة وشززرك متكامززل لطرٌقززة عملهززا أرجززع إلززى الحلززول المتززوافرة لمشززكلة (الحقززن‬
‫االستعالمٌة) ‪.‬‬

‫‪85‬‬
0 [Cross-Site Scripting "XSS"] ‫البرمجة عبر الموقع‬

ٕ7
, 79 : ‫ رقم الثغرة‬, http://cwe.mitre.org/data/definitions/79.html , http://cwe.mitre.org/top25/#CWE-79
, http://www.acunetix.com/websitesecurity/cross-site-scripting.htm
, http://www.arabwebtalk.com/showthread.php?t=76026
http://www.webopedia.com/TERM/X/XSS.html

86
‫إن الصفحات الثابتة التلً ال تتغٌلر باسلتمرار وال ٌكلون للزائلر أي دور فٌهلا هلً مجلرد‬
‫تصمٌم ثابت غٌر فعال ‪ ,‬أما الصفحات الفعالة فهلً التلً تتغٌلر باسلتمرار والقلادر عللى‬
‫تغٌٌرهللا أي طللرف ٌملللك صللالحٌة التعللدٌل علٌهللا ‪ .‬هللذه الخاصللٌة أعطللت الزائللر( أو‬
‫الشخص المسجل الذي ٌملك صالحٌات معٌنة تعدٌل هذه الصفحات ‪ ,‬مثالً إضافة تعلٌلق‬
‫ضا إمكانٌة إضافة ما ٌرٌد فً هذه الصفحات من خلالل‬ ‫‪ ,‬أو إضافة موضوع جدٌد)‪ ,‬وأٌ ً‬
‫إضللافة صللور ‪,‬أو فٌللدٌو‪ ,‬أو مقللال نصللً ‪ ,‬ولكللن قللد ٌتعللدى األمللر إلللى إضللافة أوامللر‬
‫برمجٌللة خبٌثللة تقللوم بعملٌللة التللدمٌر و االسللتٌالء علللى المعلومللات الحساسللة فللً الموقللع‬
‫واستغاللها الختراق الموقع ‪.‬‬

‫البرمجة عبر الموقع ‪:‬‬


‫هو خطأ برمجلً ملن الممكلن أن ٌسلتغل علن طرٌلق دملج نصلوص برمجٌلة بواسلطت ‪,‬‬
‫وعاد ًة تكون هذه النصوص مكتوبلة ب حلدى اللغلات التلً تقبلل أن تكلون مدمجلة ملع لغلة‬
‫]‪ , [html‬مثللل جافللا سللكربت]‪ [java script‬أو لغللات أخللرى ‪ ,‬والتللً تعمللل مللن جهللة‬
‫العمٌللل مثللل جافللا سللكربت أو لغللة فللً بللً سللكربت ]‪ , [vb script‬وقللد اختصللرت‬
‫بلـ ]‪ [XSS‬بلدالً ملن ]‪ [CSS‬لكلً ال ٌكلون هنلاك أي تعلارض ملن حٌلث الكتابلة ملع لغلة‬
‫تنسٌق المواقع ]‪. [CSS‬‬

‫البرمجة عبر الموقع لها تأثٌر من النواحً التالٌة ‪:‬‬


‫ٔ ‪-‬سرق الكعك الخاصة بأي عضو أو المدٌر العام للموقع ]‪. [admin‬‬
‫ٕ ‪-‬تحوٌل الروابط أو االستٌالء على الروابط ‪.‬‬
‫ٖ ‪-‬إضافات للموقع قد تكون غٌر الئقة أخالقٌا ً ‪.‬‬
‫وقد ٌحدث هذا األمر بسبب خطأ برمجً بسٌط وهو علدم التأكلد ملن ملدخالت المسلتخدم‬
‫سواء كانت عن طرٌق النموذج ]‪ ,[form‬أو عن طرٌق الرابط ]‪. [URL‬‬

‫اللغات التً تتأثر بهذا الخطأ البرمجً ‪:‬‬

‫‪87‬‬
‫‪[PHP- PERL-‬‬ ‫اللغات البرمجٌة كثٌرة و لكن أكثرهلا التلً تعتملد عللى اإلنترنلت ملثالً لغلة‬
‫]‪ASP-JSP‬‬

‫نستعرض سوٌا ً ن ً‬
‫صا برمج ًٌا ٌحتوى على خطأ برمجً ‪,‬انظر إللى اللنص البرمجلً رقلم‬
‫‪:17.1‬‬
‫>"‪<form method="POST" action="../insert.php‬‬

‫>‪<p><textarea name="gift" cols="26" rows="5" tabindex="1"></textarea‬‬

‫>"‪<input type="submit" value="Submit‬‬

‫>‪<input type="reset" value="Reset" name="B2"></p‬‬

‫>‪</form‬‬

‫النص البرمجً ‪17.1‬‬

‫هلذا الللنص البرمجللً ٌسلتطٌع الزائللر مللن خاللل إضللافة موضللوع لصلفحة معٌنلة‪,‬سللوف‬
‫ٌقللوم الزائللر بكتابللة موضللوع وبعللدها الضللغط علللى زر ]‪ [Submit‬الللذي سللوف ٌأخللذ‬
‫محتوى هذا الموضوع الذي كتب وٌنقل إلى صفحة ]‪.[insert.php‬‬

‫صفحة ]‪ [index.php‬سوف تقوم بعملٌة إضافة هذا الموضوع إلى قاعدة البٌانات وهذا‬
‫أمر معتاد وال جدال فٌ ‪ ,‬و لكن الخطأ هو أن هلذه الصلفحة قاملت بعملٌلة اإلضلافة فلً‬
‫قاعدة البٌانات دون أي تأكد من مدخالت المستخدم ‪.‬‬
‫بعدما تمت عملٌة إضافة الموضوع إلى قاعدة البٌانات والتلً حلدثت دون أي تحقلق ملن‬
‫مدخالت المهاجم ‪,‬ف ن هذا ٌعطلً فرصلة للمهلاجم كلً ٌضلٌف نصو ً‬
‫صلا برمجٌلة خبٌثلة‬
‫بالطرٌقة التالٌة ‪,‬‬

‫>‪<script‬‬
‫أنظر للنص رقم ٕ ‪:‬‬
‫"‪var redirecturl="www.ksu.edu.sa‬‬

‫‪window.location=redirecturl‬‬

‫موقلع آخلر‬
‫>‪</script‬‬ ‫دور هذا النص البرمجً أن سوف ٌقوم بعملٌة تحوٌل صفحة الموقع إلى أي‬
‫ملدمجا ً‬
‫‪17.2‬ملع اللنص البرمجلً األصللً للصلفحة‬ ‫البرمجلً‬
‫البرمجً‬ ‫وسوف ٌكلون شلكل هلذا اللنص النص‬

‫]‪ [html‬بالشكل التالً ‪ ,‬انظر النص البرمجً رقم ‪: 17.3‬‬

‫>‪<body‬‬
‫‪88‬‬
‫>‪<head‬‬
‫نالحظ فً النص البرمجً السابق أننا عندما استرجعنا المواضٌع من قاعدة البٌانات ملن‬
‫صا برمج ًٌا مكتو ًبا بلغة جافا سكربت ‪ ,‬اللذي ٌقلوم بعملٌلة تحوٌلل‬
‫ضمن هذه المواضٌع ن ً‬
‫الصفحة إلى صفحة أخرى ‪.‬‬
‫أو من الممكن تحوٌل الصفحة الصلحٌحة إللى صلفحة أخلرى باسلتخدام نلص ]‪, [html‬‬
‫انظر إلى النص البرمجً رقم ‪. 17.3‬‬
‫<‪>"meta HTTP-EQUIV="REFRESH" content="0; url=http://www.ksu.edu.sa‬‬

‫النص البرمجً ‪17.3‬‬


‫وصلنا إلى الصفحة التلً تسلتعرض آخلر المواضلٌع ملن قاعلدة البٌانلات ‪ ,‬بلال شلك هلذه‬
‫الصفحة سوف تقوم بجلب المواضٌع باستخدام النص البرمجً التالً‪: 17.4‬‬

‫?<‬

‫;)"‪include("config.php‬‬

‫‪class index‬‬

‫{‬

‫{)(‪function index‬‬

‫;‪$c =new con‬‬

‫;)(‪$c->con‬‬

‫;"ٖ ‪$sql="select * from post limit‬‬

‫;)‪$q=mysql_query($sql‬‬

‫{))‪while($row=mysql_fetch_array($q‬‬

‫;)]'‪echo($row['det‬‬
‫‪89‬‬
‫}‬
‫كما شاهدنا ف ن "البرمجة عبر الموقع" من المشاكل التً ٌعانً منها كثٌلر ملن المواقلع‬
‫‪ ,‬وكذلك هناك عدة طرق لكشف هذه الثغرات وهً‪:‬‬
‫ٔ ‪-‬الكشف الداخلً ‪.‬‬
‫ٕ ‪-‬الكشف الخارجً ‪.‬‬
‫ما هو الكشف الخارجً ؟‬
‫هنللاك بعللض األدوات المسللتخدمة التللً تعللرف بمسللح نقللاط ضللعف المواقللع ‪(Web‬‬
‫)‪, Vulnerability Scanner‬فهللً تقللوم بعملٌ لة مسللح لجمٌللع الللروابط التللً قللد تسللبب‬
‫"البرمجللة عبللر الموقللع" ومللن خاللل ٌسللتطٌع المهللاجم إضللافة أوامللر خبٌثللة وهللذه غالبلا ً‬
‫تستخدم لمسح الروابط للـتأكد ملن خللو الصلفحة ملن الحقلن االسلتعالمٌة‪ ,‬وكلذلك للتأكلد‬
‫من خلو الموقع من ثغرة "البرمجة عبر الموقع" ‪.‬‬
‫أما الكشف الداخلً ‪:‬‬
‫فهو القٌام بعملٌ التجربة ‪ ,‬فنقوم بعملٌة اختٌار أي صفح ٌوجلد بهلا منفلذ للزائلر لكتابلة‬
‫صا برمجٌلة خبٌثلة مهملا كانلت‬ ‫ما ٌرٌده و إضافت لقاعدة البٌانات ‪ ,‬ونضٌف إلٌها نصو ً‬
‫هذه النصوص‪ ,‬ثم نرى ما هً رده فعل الموقع وهل ٌرفض هذه النصلوص البرمجٌلة‬
‫أو ٌقبلها أم ماذا !!‬
‫لن تتوقف "البرمجة عبر الموقع" عللى إضلافات غٌلر مرغوبلة فلً محتلوى الموقلع بلل‬
‫األمر ٌتعدى إلى سرقة الكعك ]‪ [cookies‬الخاص بأي زائر حتلى للو كلان الملدٌر العلام‬
‫]‪. [admin‬‬
‫باسلللتخدام الداللللة‬ ‫وهلللذا العلمٌلللة تسلللتخدم فٌهلللا لغلللة جافلللا سلللكربت لسلللحب الكعلللك‬
‫]‪.[document.cookie‬‬

‫‪90‬‬
‫فللً النهاٌللة نسللتعرض سللوٌا ً بعللض الوسللوم ]‪ [tags‬التللً تسللتخدم إلضللافة النصللوص‬
‫البرمجٌة الخبٌثة التً ممكن أن تدمج مع لغة ]‪. [html‬‬

‫‪-‬الوسم (<‪ٌ )>script‬ستخدم إلضافة نصوص لغة ]‪[java script‬أو لغات أخرى‬ ‫ٔ‬
‫‪-‬الوسللم (<‪ٌ )>object‬سللتخدم إلدخللال عناصللر ]‪ [ActiveX‬إلللى صللفحات الموقللع‪ ,‬هللذا‬ ‫ٕ‬
‫الوسم فقط ٌعمل على متصفح ]‪.[Internet Explorer‬‬
‫‪-‬الوسم (<‪ٌ )>ifream‬ستخدم إلضافة صفحات داخلٌة داخل الصفحة األساسٌة‪.‬‬ ‫ٖ‬
‫‪-‬الوسلللللم (<‪ٌ )>embed‬سلللللتخدم إلضلللللافة فٌلللللدٌو أو فلللللاله وٌللللل دي عملللللل التلللللاق‬ ‫ٗ‬
‫نفس ]‪ [object‬ولكن ٌعمل على أي متصفح ‪.‬‬

‫‪91‬‬
‫الحلول المتوافرة لمشكلة (البرمجة عبر الموقع ‪)0‬‬

‫عزٌزي القارئ ‪ ,‬فً هذا البحث المتواضلع قملت بلالتركٌز كملا ذكلرت سلابقا ً عللى علدة‬
‫ثغرات ومن هذه الثغرات الحقن االستعالمٌة و إٌجاد الحلول المناسلبة لهلا بلغلة ]‪[php‬‬
‫‪ ,‬فلذلك قمت بوضع حلول برمجٌة مفصلة ج ًدا لحل مشكلة الحقن االستعالمٌة ‪.‬‬

‫‪ٕ8‬‬
‫‪, http://www.php.net/htmlspecialchars , http://www.php.net/manual/en/function.htmlentities.php‬‬
‫‪http://www.php.net/mysql_real_escape_string‬‬

‫‪92‬‬
‫الحل األول‪:‬‬
‫كما هو معلوم فأن "البرمجة عبر الموقع" ]‪ [xss‬فً أغلب األحٌان تتم عن طرٌق جهلة‬
‫العمٌللل ]‪ , [client-side‬وذلللك ب ضللافة النصللوص البرمجٌللة الخللاص بللـ ]‪ ,[html‬أو‬
‫نصوص أي لغة تعد من اللغات التً تعمل فً جهة العمٌل ‪.‬‬
‫استخدم دالة ]‪ [htmlspecialchars‬إلزاللة النصلوص الخبٌثلة ‪,‬وغٌلر المرغلوب بهلا ‪,‬‬
‫مثل نصوص جافا سكربت أو ]‪ [html‬التً تقوم بتحوٌل الزائر إلى صفحة أخرى ‪.‬‬

‫تقللوم هللذه الدالللة بتحوٌللل جمٌللع وسللوم]‪ [html‬إلللى رمللوز ‪ ,‬وهللذه الرمللوز ال ت ل ثر فللً‬
‫محتوى الموقع ‪ ,‬والمقصود هنا أن للو أضلاف المهلاجم رملز بداٌلة الوسلم )<((أصلغر‬
‫من) سوف تقوم هذه الداللة بتحوٌلل هلذا الرملز إللى ];‪ , [&lt‬وبهلذه الطرٌقلة ف نل مهملا‬
‫حاول المهاجم أن ٌقلوم ب ضلافة وسلوم أو (نصلوص) ]‪ , [html‬أو غٌرهلا فللن تعلرض‬
‫من خالل المتصفح بالشكل المطللوب ‪ ,‬وسلوف ٌعلرض لل ];‪ ,[&lt‬وهلذه لٌسلت للدٌها‬
‫إمكانٌللة التللأثٌر علللى المتصللفح ‪ .‬وعملٌللة تحوٌلل الرمللوز ٌسللتخدم فٌهللا جللدول ‪[ASCII‬‬
‫]‪ , Table‬انظر إلى النص البرمجً رقم ‪. 18.1‬‬

‫>"‪<form action="check.php‬‬

‫"‪</b><input type="text" name="username" size="29‬اسم المستخدم>‪<b‬‬


‫الضغط‬ ‫البرمجً رقم ‪ٌ, 18.1‬وجد حقل اسم المستخدم]‪ , [username‬وعند‬
‫>"‪tabindex="12‬‬ ‫فً النص‬
‫‪<input‬للم ٕ‬
‫"‪type="submit‬للً رقل‬
‫>"تسجٌل"=‪value‬اللللنص البرمجل‬
‫عللللى زر (تسلللجٌل) سلللوف ٌنقلللل المعلوملللات المدخللللة إللللى‬
‫>‪</form‬‬
‫]‪. [check.php‬‬

‫‪)htmlspecialchars( 18.1‬‬
‫ستخدام‬ ‫لنرى سوٌا ً نص صفحة (‪)check.php‬‬
‫النصمع ا‬
‫البرمجً‬

‫?<‬

‫‪class check‬‬

‫{‬

‫{)(‪function check‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$username=$HTTP_POST_VARS['username‬‬

‫دال التحوٌل ‪$username= htmlspecialchars($username);//‬‬


‫‪93‬‬
‫;)‪echo($username‬‬
‫تقللوم الدالللة ]‪ [htmlspecialchars‬بتحوٌللل أي وسللم ]‪ [html‬إلللى رمللوز]‪, [ASCII‬‬
‫ولللذلك ٌتجاهلهللا المتصللفح ‪ ,‬ولللن ٌكللون لهللا أي تللأثٌر‪ ,‬فمللثالَ ً لللو قللام المهللاجم ب دخللال‬
‫الرمز الذي ٌدل على بداٌة الوسم ]<[ فسوف تقوم هذه الدالة بتحوٌلها بشلكل تلقلائً إللى‬
‫];‪. [&lt‬‬

‫لنرى سوٌا ً النص البرمجً الخاص بالمتصفح ]‪ [html‬بعد إدخال نص خبٌث إلٌها كملا‬
‫فً الشكل التالً ‪ :‬الشكل ‪. 18.1‬‬

‫الشكل ‪18.1‬‬

‫الشكل ‪18.2‬‬

‫نالحظ فً الشكل ‪ 18.2‬أن قام بتحوٌل الرمز]<[إلى ];‪ , [&lt‬وكذلك قام بتحوٌلل جمٌلع‬
‫(") إلى];‪ ,[&quot‬وقام بتحوٌل الرمز الذي ٌدل على نهاٌة الوسم ];‪. [&gt‬‬

‫بمللا أننللا جعلنللا المتغٌللر ]‪ [magic_quotes_gpc‬مفعلالً فللً الملللف الخللاص ب عللدادات‬


‫لغة]‪ , [php‬ف ن سٌضٌف الشرطة المائلة ]‪ [/‬قبل كل ]“[ (&‪. );quot‬‬

‫‪94‬‬
‫كل األوسمة ‪.‬‬ ‫مشكلة هذه الدالة أنها تقوم بعملٌة تحوٌل بعض األوسمة ولٌ‬

‫الحل الثانً‪:‬‬
‫استخدم دالة ]‪ [Htmlentit‬المشابهة للدالة التً تم شرحها فً الحل األول ‪ ,‬ولكن هلذه‬
‫الدالة تقوم بعملٌة تحوٌل أي وسم ٌختص بلغة]‪ [html‬دون استثناء ‪,‬وهً (أكثر فعالٌلة)‬
‫من الدالة]‪. [htmlspecialchars‬‬

‫وتستخدم هذه الدالة بالطرٌقة التالٌة ‪ ,‬انظر النص البرمجً رقم ‪: 18.3‬‬
‫?<‬

‫‪class check‬‬

‫{‬

‫{)(‪function check‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$username=$HTTP_POST_VARS['username‬‬

‫هذه دال التحوٌل ‪$username= htmlentities($username);//‬‬

‫;)‪echo($username‬‬

‫}‬

‫;}‬

‫;)(‪$start_new=new check‬‬

‫>?‬

‫النص البرمجً ‪18.3‬‬

‫‪95‬‬
‫الحل الثالث ‪:‬‬
‫الطرٌقة السابقة (الحل الثانً) فعالة جداً‪ ,‬ولكن قد ٌحتاج المستخدم إللى إدخلال بعلض‬
‫الروابط أو بعض األوسلمة التلً قلد ال تشلكل خطلراً مباشلراً أو ال تشلكل خطلراً نهائٌلا ً ‪,‬‬
‫مثلل ]>‪ , [<b> , <h1‬للذلك توجلد الداللة ]‪ [strip_tags‬التلً تسلتقبل متغٌلرٌن‪ :‬األول‬
‫هللو الللنص المللراد فحص ل وتنقٌت ل وحللذف جمٌللع أوسللمة ]‪ ,[strip_tags‬والثللانً هللو‬
‫األوسمة المسمو بها مثل]>‪. [<b‬‬

‫لنرى طرٌقة استخدامها ‪ ,‬انظر إلى النص البرمجً رقم ‪.18.4‬‬


‫?<‬

‫‪class check‬‬

‫{‬

‫{)(‪function check‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$username=$HTTP_POST_VARS['username‬‬

‫دال التحوٌل ‪$username= strip_tags($username,"<b><h1>");//‬‬

‫;)‪echo($username‬‬

‫}‬

‫;}‬

‫;)(‪$start_new=new check‬‬

‫?‬

‫النص البرمجً ‪18.4‬‬

‫شللاهدنا فللً المثللال السللابق اسللتخدام];)">‪[strip_tags($username,"<b><h1‬التللً‬


‫تقللوم ب زالللة الوسللوم الخاصللة بللـ ]‪ ,[html‬ولكنهللا تسللمح باسللتخدام وإظهللار الوسللامٌن‬
‫)>‪ (<b‬و )>‪ (<h1‬فقط ‪.‬‬

‫‪96‬‬
0 [file Inclusion] ‫استدعاء الملفات‬

ٕ9
, http://www.scanit.be/uploads/php-file-upload.pdf
http://www.freeos.com/guides/lsst/ch01sec06.html

97
‫كثٌلراً ملا نسلمع بلاختراق المواقلع علن طرٌلق رفللع ملفلات خبٌثلة إللى الخلادم‪ ,‬علادة ٌللتم‬
‫االختللراق بسللرقة المعلومللات الحساسللة‪ ,‬وهللذا النللوع مللن االختللراق قللد ال ٌتعللدى إطللار‬
‫ومدى الموقع المراد إلحاق الضرر ب نفس ‪ ,‬ملاذا للو كلان الهلدف ملن االختلراق التلأثٌر‬
‫وإضعاف الخادم ؟‬
‫أوالً‪ :‬ما هً الصدفة ]‪ [SHELL‬؟‬

‫الشكل ‪19.2‬‬

‫إن ]‪ٌ [Linux Kernel‬قللوم بللالتحكم وتحدٌللد مصللادر الحاسللب اآللللً مللن الطابعللات ‪ ,‬و‬
‫الذاكرة ‪ ,‬والمعالج ‪.‬‬
‫وكلللذلك ٌتعاملللل ملللع الملفلللات وإدارتهلللا‪,‬إذاً هلللو المحلللرك األساسلللً فلللً نظلللام تشلللغٌل‬
‫لنك ]‪.[Linux‬‬
‫تخٌل معً لو أن شخصا ً استطاع أن ٌصل إللى هلذه النقطلة‪ ,‬بالتأكٌلد سلوف ٌكلون ملدٌر‬
‫الخادم بأكمل ‪ ,‬فالصدفة الذي ٌعمل وسٌطا ً بٌن اللب ]‪ [Kernel‬وبٌن مكونات الحاسب‬
‫اآللللً ٌقللوم بتنفٌ لذ جمٌللع األوامللر التللً ٌتلقاهللا مللن المسللتخدم بشللكل نصللً مثللل دو‬
‫]‪ [DOS‬فً نظام التشغٌل ]‪. [WINDOWS‬‬

‫إذاً من خالل ]‪ [shell‬تستطٌع إرسال أوامر دقٌقة وحساسة إلى اللب ‪ ,‬مثلل عملل نسلي‬
‫احتٌاطٌة ٌومٌة للخادم‪ ,‬أو القٌام بتجزئة الخادم‪ ,‬أو التحكم بمصادر الخادم ‪.‬‬

‫‪98‬‬
‫فلً الحقٌقلة هللذا األملر رائللع جلداً لمسللتخدمً الخلوادم‪ ,‬ولكللن قلد ٌسللبب بعلض األحٌللان‬
‫أضراراً ٌتحملها الخادم و قد تحدث بسبب خطأ برمجلً بسلٌط ‪ ,‬وقلد ٌتحملل هلذا الخطلأ‬
‫كللال الطللرفٌن (المبللرمج و مللدٌر الخللادم ) ‪ ,‬حٌللث أن الللبعض مللن مللدٌري الخللوادم ال‬
‫ٌنفذون فحصا ً دائما ً على بعض الدوال التً قد تسلبب مشلاكل‪ ,‬وقلد ٌكلون فٌهلا خللل ملن‬
‫أصحاب ]‪ [bug‬اللغة ‪,‬أو قد ال ٌكون بها خلل ولكن زٌادة فً أمان الخادم ‪.‬‬

‫كٌف ٌتم ذلك ؟‬


‫عندما تكون هناك ثغرة فلً الموقلع وكانلت طبٌعلة هلذا الخطلأ أنل ٌسلمح لزائلر أن ٌقلوم‬
‫برفع ملف أو حتى نصوص أو ملفات مرفقة إلى الخادم مثل ( مواقع رفلع الملفلات إللى‬
‫الخللادم ) دون التأكللد مللن طبٌعتهللا وهللل هللً سلللٌمة أو لهللا أضللرار علللى الخللادم ‪ ,‬ف ن ل‬
‫ب مكان المهاجم رفع ملف ]‪ [shell‬الذي ٌتحكم بالخادم كل عن طرٌق ‪.‬‬

‫ما هً اللغات التً تتأثر بهذا الخطأ ؟‬


‫اللغلللات البرمجٌلللة كثٌلللرة و لكلللن أكثرهلللا التلللً تعتملللد عللللى اإلنترنلللت ‪ ,‬ملللثالً لغلللة‬
‫‪[php,asp,jsp].‬‬

‫>"‪<form method="POST" action="upload.php" enctype="multipart/form-data‬‬

‫>"‪<p><input type="file" name="file_upload" size="20‬‬

‫>‪<input type="submit" value="Submit"> </p‬‬

‫>‪</form‬‬

‫النص البرمجً ‪19.1‬‬

‫الللنص البرمجللً رقللم ‪ [html] 19.1‬بسللٌط جللداً وهللو نمللوذج السللتعراض الملفللات‬
‫واختٌار أحد هذه الملفات لرفعها إلى الخادم ‪,‬بال شلك سلوف ترسلل إللى الصلفحة اللنص‬
‫البرمجً رقم ٕ لمعالجتها ورفعها ‪.‬‬

‫‪99‬‬
‫اآلن ٌأتً دور النص البرمجً ‪: 19.2‬‬

‫?<‬

‫‪class upload‬‬

‫{‬

‫{)(‪function upload‬‬

‫{))]"‪if(isset($_FILES["file_upload‬‬

‫;]"‪$img_path="c:/".$_FILES["file_upload"]["name‬‬

‫;)"‪copy($_FILES["file_upload"]["tmp_name"],$img_path) or die("cant upload this file‬‬

‫;)‪echo("The Link Of This File Is"."".$img_path‬‬

‫}‬

‫{‪else‬‬

‫;)"‪echo("THE TYPE MUST BE JPEG‬‬

‫}‬
‫فً النص البرمجً رقم ‪ 19.2‬قمنا بالبرمجة بطرٌقة صحٌحة ‪ ,‬ولكن لم نقلم بالتأكلد ملن‬
‫‪19.2‬مشاكل كثٌلرة ‪,‬وٌقلوم المهلاجم برفلع‬
‫ٌسبب‬ ‫وهذا قد‬
‫البرمجً‬ ‫نوع الملف المراد رفع إلى الخادم‪ ,‬النص‬

‫ملفات ]‪. [SHELL‬‬


‫}‬
‫بالنسبة لملفات الصلدفة فهلً ملفلات مكتوبلة بلغلة]‪ [php‬التلً تسلتطٌع ملن خاللهلا تنفٌلذ‬
‫;}‬
‫أوامر نظم التشغٌل ‪ ,‬وبعد رفع ]‪ٌ [shell‬قوم بمهاجمة الخادم عللى أسلا الصلالحٌات‬
‫والمواقع الموجلودة‬
‫‪$start_new=new‬‬ ‫التً ٌمتلكها من خالل ]‪, [shell‬فالبعض ٌقوم فقط بتصفح الملفات‬
‫;)(‪upload‬‬

‫>?‬ ‫داخل الخادم ‪ ,‬والبعض منها ٌقوم بمهاجمة الخادم و التحكم ب بشكل كامل ‪.‬‬
‫قد ٌخطر على البلال أنل ملاذا للو قمنلا بعملٌلة تفحلص لجمٌلع الملفلات الملراد رفعهلا إللى‬
‫الخللادم ‪ ,‬ولكللن قللد ٌقللوم المهللاجم بتغٌٌللر االسللم الملحللق (امتللداد الملللف) ]‪[extension‬‬
‫بحٌث أننا لن نستطٌع أن نعرف هل هذا ]‪ [shell‬أم صورة ؟‬
‫?<‬

‫‪class upload‬‬ ‫نقول فً هذه الحالة أننا مع استخدام (‪)]"FILES["file_upload"]["type_$‬‬


‫{‬ ‫نستطٌع معرفة امتداد الملف حتى لو قام المهاجم بتغٌٌره إللى امتلداد صلورة معٌنلة عللى‬
‫{)(‪function upload‬‬ ‫سبٌل المثال ]‪. [GIF‬‬
‫{)"‪if(isset($_FILES["file_upload"]) && $_FILES["file_upload"]["type"]=="jpeg‬‬

‫;]"‪$img_path="c:/".$_FILES["file_upload"]["name‬‬
‫‪100‬‬
‫;)"‪copy($_FILES["file_upload"]["tmp_name"],$img_path) or die("cant upload this file‬‬
‫وعلى هذا األسا لو قمنا بتعدٌل النص البرمجً السابق إلى الشكل التالً فسوف ٌكون‬
‫خالٌا ً من المشاكل البرمجٌة ولكن بنسبة محدودة ‪ ,‬انظر إلى النص البرمجً رقم ٖ ‪:‬‬

‫ولكن ٌبقى فً األمر بعض التخوف‪ ,‬حٌث أن من الممكن التالعب بالنص البرمجً ملن‬
‫خالل لغة بٌرل ]‪ [perl‬التً من الممكلن اسلتغاللها للتحاٌلل والتالعلب بلالنص البرمجلً‬
‫عن طرٌق إخفاء محتوى الملف ‪,‬فٌجعل الموقع ٌظن أن هذا المللف صلورة عللى اللرغم‬
‫من أن ملف خبٌث ]‪. [shell‬‬

‫لنشاهد سوٌا ً النص البرمجً ]‪ [perl‬ونرى االستجابة من الخادم لهذا األمر ‪:‬‬
‫‪#!C:/Perll/bin‬‬

‫;‪use LWP‬‬

‫;‪use HTTP::Request::Common‬‬

‫;;‪$ua = $ua = LWP::UserAgent->new‬‬

‫‪$res = $ua->request(POST 'http://localhost/myprjoect/exmple/copy/upload.php',‬‬

‫‪Content_Type => 'form-data',‬‬

‫[ >= ‪Content‬‬

‫>= "‪file_upload => ["c99.php", "c99.php", "Content-Type‬‬

‫‪"image/gif"],‬‬
‫‪101‬‬
‫‪],‬‬
‫فللً الللنص البرمجللً رقللم ‪ 19.4‬قمنللا باسللتخدام لغللة ]‪ [perl‬للتالعللب وتخطللً األمللر‬
‫الشللرطً فللً الللنص البرمجللً ‪ 19.3‬مللن خللالل قٌامنللا برفللع ملللف]‪( [c99.php‬ملللف‬
‫الصدفة) ‪,‬حٌث إن امتداده ]‪ ,[php‬وجعلنا محتوى هذا الملف صورة ملن نلوع ]‪[Gif‬‬
‫‪.‬‬
‫لنرى سوٌا ً االستجابة من الخادم ‪:‬‬

‫الشكل ‪19.2‬‬

‫كمللا تشللاهد لقللد قمنللا برفللع الملللف وتخطللً األمللر الشللرطً وبللذلك ٌكللون الموقللع تحللت‬
‫سٌطرتنا ونستطٌع أن نتحكم ب بشكل كامل ‪.‬‬
‫أٌضا ً دالة ]‪ [copy‬غالبا ً تستخدم فً نسي الملفات وهذا األمر قد ٌسبب مشاكل‪ ,‬فب مكلان‬
‫المهاجم نسي محتوٌات أي ملف ]‪ [php‬إلى ملف آخلر ملن نلوع ]‪ [text‬وملن ثلم قلراءة‬
‫النصوص البرمجٌة الخاصة بهذا الملف‪.‬‬

‫‪102‬‬
)42‫الحلول المتوافرة لمشكلة (استدعاء الملفات‬

ٖٓ
. http://corpocrat.com/2007/11/28/implementing-secure-file-upload-in-php

103
‫عزٌللزي المبللرمج ‪ ,‬لحللل مشللكلة رفللع الملفللات ٌجللب أن تملللك القللدرة علللى معرفللة نللوع‬
‫الملفات التً سوف ترفع على الخادم وامتداداتها ‪ ,‬وأال تسمح برفلع الملفلات التلً تنتهلً‬
‫بـ )‪ . (.php‬فكٌف تقوم بذلك ؟‬

‫الحلول ‪:‬‬
‫سوف أضلع بلٌن ٌلدٌك عزٌلزي القلارئ اللنص البرمجلً رقلم ‪ 20.1‬وملن خاللل سلوف‬
‫نقوم بالشر ‪ ,‬فانظر النص رقم ‪.20.1‬‬

‫))]'‪1.if (!getimagesize($_FILES['imagefile']['tmp_name‬‬

‫{‬

‫;"الملف ٌجب أن ٌكون صورة فقط" ‪echo‬‬

‫;)(‪exit‬‬

‫}‬

‫;)"‪2.$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py‬‬

‫)‪foreach ($blacklist as $file‬‬

‫{‬

‫))]'‪3.if(preg_match("/$file\$/i", $_FILES['imagefile']['name‬‬

‫{‬

‫;"لقد قمت برفع ملف تنفٌذي وهذا أمر خطٌر" ‪echo‬‬

‫;‪exit‬‬

‫}‬

‫{‪else‬‬

‫رفعل‪//‬‬
‫لرادبالرفع‬
‫المل قم‬
‫فللً السللطر األول مللن الللنص البرمجللً رقللم ‪ , 20.1‬قمنللا باسللتقبال الملللف‬
‫الداللللة‬
‫}‬ ‫والتأكلللد ملللن أنللل صلللورة وللللٌ مللللف فٌلللدٌو‪ ,‬أو أي نلللوع آخلللر علللن طرٌلللق‬
‫التلً‬
‫}‬ ‫]‪ , [getimagesize‬أما الحل اآلخر فهو وضع قائمة سوداء تحتوي على جمٌلع الملفلات‬
‫‪[$blacklist = array(".php",‬‬ ‫النصللطر ٕ‬
‫البرمجً ‪20.1‬‬ ‫ٌمنلللع رفعهلللا عللللى الخلللادم كملللا فلللً السل‬

‫‪104‬‬
‫];)"‪ ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py‬حٌلث أن هلذه‬
‫الملفات تنتهً بامتدادات خطرة وتسبب مشاكل أمنٌة للخادم ‪.‬‬
‫وكذلك قمنا فً السطر ٖ ‪ ,‬بالتأكلد ملن أن المللف الملراد رفعل غٌلر موجلود فلً القائملة‬
‫السوداء ]))]'‪. [if(preg_match("/$file\$/i", $_FILES['imagefile']['name‬‬

‫‪105‬‬
‫التحكم الخارجً بحالة المعلومات‬
40[External Control of Critical State Data]

ٖٔ
. /http://www.damasgate.com/vb/t39002 , ٕٙٗ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-642

106
‫إن تخزٌن المعلومات الحساسة المتعلقة بصلالحٌات الموقلع وحاللة المعلوملات للدى كلل‬
‫مستخدم ‪ ,‬وأٌضا ً استخدام المتغٌرات المخزنة فً الملفات ‪,‬أو قواعد البٌانات ‪ ,‬أو كعك‬
‫فً تحدٌد المصادر والموارد من أخطر المشاكل البرمجٌة ‪ ,‬فللو فرضلنا أن صلالحٌات‬
‫الموقللع تعتمللد علللى الكعللك وٌوجللد بهللا المعلومللة التالٌللة ‪, [authenticated=true] :‬‬
‫وفائدتها تحدد هل هذا العمٌل مصر لل بلدخول صلفحة معٌنلة أم ال ‪ٌ ,‬سلتطٌع المهلاجم‬
‫إنشاء كعك وتغٌٌر هذه المعلومة السابقة وبالتالً ٌمكن دخول الصلفحات الحساسلة وهلو‬
‫غٌر مصر ل بذلك ‪.‬‬
‫على أي مستوى تحدث هذه الثغرة ؟ ما هً اللغات التً تتأثر بها ؟ ومزا هزو مسزتوى‬
‫خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم و هٌكلٌة و برمجة النظام ‪.‬‬
‫اللغات التً تتأثر بهلا هلً جمٌلع اللغلات البرمجٌلة بلال اسلتثناء وبلاألخص األنظملة التلً‬
‫تتعامل مع الخادم ]‪ ,[Server‬وكلذلك قاملت منظملة ]‪ [Sans‬بتصلنٌف هلذه الثغلرة بأنهلا‬
‫ذات خطورة عالٌة ]‪. [High‬‬

‫?<‬

‫‪class Cookies‬‬

‫{‬

‫{)(‪function Cookies‬‬

‫;‪$expire=time()+60*60*24*30‬‬

‫;)‪setcookie("admin", "no", $expire‬‬

‫}‬
‫فللً الللنص البرمجللً رقللم ‪ 21.1‬نشللاهد أننللا أنشللأنا كعكلا ً ٌحتللوي علللى ;}متغٌللر واحللد هللو‬
‫;)(‪$start_new=new Cookies‬‬
‫]‪ [admin‬وقٌمة ]‪. [no‬‬
‫>?‬ ‫لنشاهد اآلن النص البرمجً رقم ‪. 21.2‬‬
‫النص البرمجً ‪21.1‬‬
‫{)(‪function login‬‬

‫{)"‪if($_COOKIE["admin"]=="yes‬‬

‫‪// login admin‬‬

‫;)"‪echo("admin‬‬
‫‪107‬‬ ‫}‬

‫{‪else‬‬
‫فً النص البرمجً رقم ‪ 21.2‬لن تالحظ عزٌزي القارئ أن هناك خطأ برمجٌا ً ومشلكلة‬
‫ال تظهللر إال بعللدما ٌقللوم المهللاجم بتغٌٌلر القللٌم الموجللودة فللً الكعللك لكللً ٌللدخل الموقللع‬
‫بصللفت مللدٌراً عام لاً‪ ,‬وبللال شللك ف لأن عملٌللة التغٌٌللر تللتم بأحللد بللرامج تغٌٌللر الكعللك أو‬
‫باسللتخدام إحللدى إضللافات ]‪ [add-ons‬متصللفح ]‪ [firefox‬فٌقللوم ب دخللال قٌمللة ]‪[yes‬‬
‫بدالً من ]‪ [no‬وٌصبح هو المدٌر العام ]‪ [admin‬انظر إلى الشكل ٔ ‪.‬‬

‫الشكل ‪21.1‬‬

‫وبعد ما قمنا بتنفٌذ النص البرمجً رقم ‪ , 21.2‬كان الناتج كما فً الشكل ‪. 21.2‬‬

‫‪108‬‬
‫الشكل ‪21.2‬‬

‫الحلول المتوافرة لمشكلة (التحكم الخارجً بحالة المعلومات‪)40‬‬

‫ٕٖ‬
‫‪. http://cwe.mitre.org/data/definitions/642.html‬‬

‫‪109‬‬
‫الحل األول ‪:‬‬
‫عزٌزي المبرمج ‪ ,‬ال تقم بتخزٌن المعلومات الخاصلة بالعمٌلل فلً جهلازه دون تشلفٌر !‬
‫أو ٌجب أن تكون لدٌك القدرة على معرفلة أن المعلوملات التلً فلً جهلاز العمٌلل للم ٌلتم‬
‫التالعللب بهللا ‪ ,‬باسللتخدام (رمللز التوثٌللق للرسللالة ) ‪[message authentication‬‬
‫])‪ , codeٖٖ (MAC‬حٌلث أن رملز رسلالة التوثٌلق هلً خوارزمٌلة تسلتخدم للتأكلد ملن‬
‫ضلا ملن‬‫تكامل المعلومات المرسلة عند وصولها إللى المسلتقبل ]‪ [Data integrity‬وأٌ ً‬
‫أن المعلومات المرسلة تم فتحها بواسطة المستقبل المصلر لل بفتحهلا وقلراءة محتواهلا‬
‫]‪.[authenticity‬‬

‫فكرة رمز التوثٌق للرسالة هو أن عنلدما ٌقلوم المرسلل (خاللد) ب رسلال رسلالة ٌجلب أن‬
‫ٌتلوافر المفتللا الخللاص باإلضلافة إلللى أنل ٌقلوم ببعثللرة الرسللالة باسلتخدام دالللة البعثللرة‬
‫(االختللزال) ]‪ [hash‬وبعللدها ٌقللوم ب رسللال قمتللٌن األولللى (الرسللالة الخللام) أمللا الثانٌللة‬
‫(الناتج من ]‪ , ) [hash‬وعند وصلها إلى المستقبل ٌقوم ب دخلال الرسلالة الخلام ]‪[hash‬‬

‫ٖٖ‬
‫‪. http://en.wikipedia.org/wiki/Message_authentication_code‬‬

‫‪110‬‬
‫ضلا ال ٌسلتطٌع‬‫وٌتأكد من ناتج ]‪ [hash‬إذا كان هو نف المرفق ملع الرسلالة أم ال ! وأٌ ً‬
‫أحد فك هذه الرسالة إال بوجود المفتا الخاص المتعلارف علٌل بلٌن المرسلل والمسلتقبل‬
‫‪ ,‬ولكن هذه الطرٌقة ضعٌفة ألن رمز توثٌق الرسالة ٌتم إنشا ه من قبلل المرسلل وللذلك‬
‫ف ن المستقبل ال ٌسلتطٌع أن ٌثبلت أن ملن أرسلل الرسلالة هلو خاللد عنلدما ٌقلوم باإلنكلار‬
‫وأن لم ٌرسل شٌئا ً‪.‬‬

‫الحل الثانً ‪:‬‬


‫بما أن البروتوكول ]‪ [HTTP‬للٌ لل طبٌعلة معٌنلة أو حالتل غٌلر مسلتمرة كملا ٌقلال ‪,‬‬
‫حٌلث أن ]‪ [HTTP‬ال ٌعطٌلك إمكانٌلة تتبلع اللزوار والكعلك والجلسلات الخاصلة بللالزوار‬
‫ومعرفة متى تم تسجٌل دخول العضو ومتى تم تسجٌل خروج فلذلك نقوم بتخلزٌن القلٌم‬
‫المدخلة من قبل المستخدم فً الجلسلة الحالٌلة وملن خلالل هلذه المعلوملات نسلتطٌع تتبلع‬
‫المستخدم ونتأكلد ملن الصلالحٌات ! ولكلن فلً الوقلت نفسل البلد أن تعتملد هلذه الطرٌقلة‬
‫علللى التشللفٌر ألن معلومللات الجلسللة قللد تخمللن مللع أنهللا صللعبة أو مسللتحٌلة التخمللٌن ‪,‬‬
‫ولكن الحٌطلة والحلذر ضلرورٌان ‪ ,‬وكلذلك قلد نسلتخدم الجلسلة لتخلزٌن معلوملات علن‬
‫الحقول الموجودة فً النماذج مثالً نموذج تسجٌل انظر إلى النص رقم ‪. 22.1‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$username =$HTTP_POST_VARS['username‬‬

‫{)""==]'‪if($_SESSION['username‬‬

‫{)‪if($this->checkuser($username,$pass)==true‬‬

‫;‪$_SESSION['username']=$username‬‬

‫}‬

‫{‪else‬‬

‫;)"تأكد من اسم المستخدم أو كلمة المرور"(‪echo‬‬

‫}‬

‫}‬
‫‪111‬‬ ‫{‪else‬‬

‫;)"أنت بالفعل مسجل"(‪echo‬‬


‫فً النص البرمجً رقم ‪ 22.1‬قمنا بالتأكد من أن الزائر بالفعلل ٌمتللك جلسلة خاصلة بل‬
‫أم ال عللن طرٌللق ]]'‪ , [($_SESSION['username‬فلل ذا كللان ال ٌمتلللك جلسللة فهللذا‬
‫ٌعنً أن لم ٌسجل الدخول بعلد ‪ ,‬فعنلدما نقلوم بالتأكلد ملن اسلم المسلتخدم وكلملة الملرور‬
‫علللن طرٌلللق ])‪ [($this->checkuser($username,$pass‬عنلللدها إذا كلللان حسلللاب موجلللوداً فلللً‬
‫قاعدة البٌانات نقوم بتخزٌن اسم مستخدم فلً الجلسلة الحالٌلة ]]'‪, [$_SESSION['username‬‬
‫وبهذه الطرٌقة قمنا بتتبع المستخدم ‪ ,‬فلو قام بضغط زر تحدٌث ]‪ [f5‬فسلوف نعلرف أنل‬
‫قلللد تلللم تسلللجٌل وللللن نقلللوم ملللرة أخلللرى بالتأكلللد ملللن معلوماتللل علللن طرٌلللق األملللر‬
‫])""==]'‪ [if($_SESSION['username‬وهكذا ‪.‬‬

‫‪112‬‬
43[Untrusted Search Path] ‫مسار البحث غٌر الموثوق‬

ٖٗ
. ٕٗٙ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-426

113
‫تعتمللد هللذه الثغللرة علللى ثغللرة (حقللن أوامللر نظللم التشللغٌل ) ‪ ,‬حٌللث أنهللا تقللوم بالتالعللب‬
‫وتغٌٌللر المسللار الصللحٌح لتنفٌللذ الملفللات وجعلل ٌ شللر علللى بللرامج خبٌثللة ‪ ,‬أو قللد ٌقللوم‬
‫بالتالعب فً مساره لتنفٌذ أوامر عكسٌة على خادم الموقع ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة؟ و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم وهٌكلٌة وبرمجة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها ذات خطورة عالٌة ]‪. [High‬‬

‫لمشاهدة األمثلة على هذه الثغرة قم بالرجوع إلى ثغرة (حقنة أوامر نظم التشغٌل ) ‪.‬‬

‫‪114‬‬
)4 ‫الحلول المتوافرة لمشكلة (مسار البحث غٌر الموثوق‬

ٖ٘
http://www.php.net/manual/en/function.exec.php#86965 , http://cwe.mitre.org/data/definitions/426.html

115
‫الحل األول ‪:‬‬
‫عزٌزي المبلرمج قلم بتحدٌلد مسلار البحلث للدٌك وضلع فلً مللف أو تخزٌنل فلً قاعلدة‬
‫البٌانات لكً تتأكد من المسار الذي قام المهاجم بطلب ملن ضلمن هلذه مسلار البحلث وال‬
‫ٌ شر على برنامج خبٌث‪ ,‬انظر إلى النص البرمجً رقم ‪. 23.1‬‬
‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$ip=$HTTP_GET_VARS['ip‬‬

‫{)"‪if($ip=="10.0.0.138‬‬

‫;)‪exec("ping ".$ip."", $output‬‬

‫;)‪print_r($output‬‬

‫}‬

‫ٌتأكلد ملن أنل ٌسلتطٌع االتصلال بلالمودم‬


‫الموقع ‪23.1‬‬ ‫النص البرمجً رقم ‪ٌ 23.1‬جعل زائر‬
‫النص البرمجً‬

‫الخللاص بل عللن طرٌللق تنفٌللذ األمللر ]‪ , [ping‬نالحللظ أن ])"‪[if($ip=="10.0.0.138‬‬


‫جعلت مستخدم هذه الخدمة ٌنحصر فً إدخال قٌمة واحدة للملودم وهلً ]‪[10.0.0.138‬‬
‫حٌث أن هذا الرقم ٌمثل ]‪ [ip‬الخلاص بملودم ملن نلوع ثمسلون ملن شلركة سلبٌد تلوه ‪,‬‬
‫ومن هنا لن ٌتم تنفٌذ أمر ]‪ [ping‬إال عندما ٌدخل المستخدم ]‪ [ip‬صحٌحً ا ‪.‬‬

‫الحل الثانً ‪:‬‬


‫قم بالتأكد من مسار البحلث قبلل اسلتخدام وكلذلك قلم بحلذف أو علدم إظهلار المعلوملات‬
‫التً قد تسبب مشاكل مثل المسار الحالً الذي تعمل فٌ أو الملف الم قت ‪.‬‬

‫‪116‬‬
‫إغالق أو التخلص من المصادر بطرٌقة غٌر صحٌحة‬
4 [Improper Resource Shutdown or Release]

ٖٙ
. ٗٓٗ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-404

117
‫لكل نظام وقت ٌنتهً فٌ و ٌصبح من الجٌلل القلدٌم ‪,‬فللذلك عنلدما ترٌلد أن تلتخلص ملن‬
‫هذا النظام ٌجب أن تتأكد ملن أنلك مسلحت جمٌلع آثلاره وإال فملن الممكلن أن ٌسلتغل فلً‬
‫قللراءة الملفللات ‪,‬أو كعللك ‪,‬أو البحللث عللن المعلومللات الحساسللة وأٌض لا ً إعللادة اسللتخدام‬
‫موارد النظام ‪.‬‬

‫فلللذلك ٌجللب علٌللك أخللً المبللرمج أن تقللوم بعمٌلللة إلغللاء ومسللح جمٌللع المصللادر التللً‬
‫استخدمتها فً النظام ‪ ,‬سوف أعرض لك مثالً ٌوضح هذه الثغرة الح ًقا ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ ومززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم و هٌكلٌة و برمجة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة ما بٌن قلٌلة ومتوسطة الخطورة ‪.‬‬

‫شاهد المثال التالً ‪:‬‬

‫;)"‪$handle = fopen("C:\\AppServ\\www\\p2\\admin.txt", "r+‬‬

‫;)"‪fwrite($handle, "admin=yes‬‬

‫‪//‬‬

‫‪//‬‬

‫النص البرمجً ‪24.1‬‬


‫عزٌزي القارئ ‪ ,‬نستطٌع القلول إن اللنص البرمجلً رقلم ‪ 24.1‬قلد ٌسلتغل المهلاجم فلً‬
‫تعلللدٌل الملفلللات أو الكتابلللة فوقهلللا أو قلللد ٌحلللدث خطلللأ منطقلللً عنلللد حصلللول (اإلخلللالل‬
‫بالشروط ) ‪ ,‬وإن االستخدام الخاط وعلدم تنظٌلف المصلادر مثلل (الملفلات) قلد ٌل دي‬
‫إلى استخدام بشكل خاط من قبل المهاجم ‪.‬‬
‫فً النص البرمجً رقم ‪ٌ 24.1‬ستطٌع المهاجم أو حتى الزائلر العلادي تعلدٌل الصلالحٌة‬
‫المسللندة لل مللن خللالل هللذا الخطللأ ‪ ,‬تخٌللل لللو أن العضللو الللذي هللو( المللدٌر العللام) دخللل‬

‫‪118‬‬
‫الموقع‪ ,‬وتم كتابة السلطر (‪ )admin=yes‬فلً المللف ]‪, [admin.php‬وبملا أن المللف‬
‫لم ٌلتم إغالقل ألنل موجلود فلً اللذاكرة الم قتلة للموقلع وبالتلالً للو دخلل مسلتخدم عللى‬
‫صفحة ]‪ [login.php‬النص البرمجً رقلم ‪ , 24.2‬فسلوف تعطلى لل صلالحٌة الملدٌر‬
‫العام ]‪ [admin=yes‬وهو ال ٌستحقها ‪ ,‬انظر إلى النص البرمجً رقم ‪.24.2‬‬
‫;))"‪$contents = fread($handle, filesize("C:\\AppServ\\www\\p2\\p.txt‬‬

‫‪if($contents=="admin") // make him admin‬‬

‫النص البرمجً ‪24.2‬‬

‫‪119‬‬
‫الحلول المتوافرة لمشكلة (إغالق أو التخلص من المصادر بطرٌقة غٌر‬
‫صحٌحة ‪)4‬‬

‫الحل األول ‪:‬‬


‫عزٌزي المبرمج ‪ ,‬كما هو معروف لدٌك ف ن المتغٌرات تخلزن فلً اللذاكرة وللذلك البلد‬
‫أن تقوم ب زالتها من الذاكرة عن طرٌق استخدام بعض الدوال والهلدف منهلا رفلع فعالٌلة‬
‫أداء الموقع ‪ ,‬انظر إلى النص رقم ‪ 25.1‬لكً تتضح الفكرة ‪.‬‬

‫;"‪", memory_get_usage(), "\n‬المرحلة األولى" ‪echo‬‬

‫;)(‪$arr = array‬‬

‫{ )‪for ($i = 0; $i < 1000000; ++$i‬‬

‫;)(‪$arr[] = rand‬‬

‫}‬
‫‪ٖ7‬‬
‫‪http://php.net/manual/en/function.memory-get- , http://cwe.mitre.org/data/definitions/404.html‬‬
‫‪", memory_get_usage(),‬المرحلة الثانٌة" ‪echo‬‬ ‫;"‪"\n‬‬
‫‪. http://php.net/manual/en/function.unset.php‬‬ ‫‪, usage.php‬‬

‫;‪$foo = 1‬‬
‫‪120‬‬ ‫;‪$bar = 2‬‬

‫;"‪ ", memory_get_usage(), "\n‬المرحلة الثالث" ‪echo‬‬


‫كما تشاهد فً السطر األول من النص البرمجً رقم ‪" 25.1‬المرحلة األولى " ٌظهر لنا‬
‫كم هً المساحة المستخدمة فً الذاكرة العشوائٌة ]‪ [ram‬قبل البدء فلً تطبٌلق البرنلامج‬
‫وكان الناتج ] ‪ [94644‬باٌت ‪.‬‬

‫فً المرحلة الثانٌة قمنا بعمل ]‪ , [for loop‬حٌث أن فً كل دورة ]‪ [loop‬نقلوم بتعبئلة‬
‫المصللفوفة ]‪ [$arr‬بللرقم عشللوائً وكللان النللاتج ]‪ [72291640‬باٌللت ‪ ,‬نالح لظ أن المسللاحة‬
‫المستخدمة زادت !‬
‫أما فً المرحللة الثالثلة فكلان النلاتج ]‪ [72291784‬باٌلت ‪ ,‬ألننلا قمنلا بعملٌلة أقلل تكلفلة ملن‬
‫غٌرها وهً عملٌة اإلسناد ]‪. [$foo = 1‬‬

‫نللأتً إلللى المرحلللة األخٌللرة "الرابعللة" كللان النللاتج ]‪ [72291476‬باٌللت ‪ ,‬مللاذا تالحللظ ؟ إن‬
‫المساحة المسلتخدمة أصلبحت أقلل ‪ ,‬حٌلث إن العملٌلات فلً المرحللة الرابعلة ال تسلتخدم‬
‫الللذاكرة بشللكل كبٌللر إال فللً عملٌللة تغٌٌللر الم شللر ! حٌللث إننللا فللً ];‪ [$foo = $arr‬جعلنللا‬
‫]‪ ٌ [$foo‬شر على المكان نفس الذي ت شر علٌ المصفوفة ]‪. [$arr‬‬

‫عزٌزي المبرمج بعدما شاهدت آلٌة عمل الذاكرة مع العملٌات ‪ ,‬نعرض لك اآلن اللدوال‬
‫التً تقوم بعملٌة مسح المتغٌر من الذاكرة عند االنتهاء منل ‪,‬انظلر إللى اللنص البرمجلً‬
‫رقم ‪. 25.2‬‬

‫‪121‬‬
echo memory_get_usage();

$arr = array();

for ($i = 0; $i < 1000000; ++$i) {

$arr[] = rand();

echo("<br>");

echo memory_get_usage();

unset($arr);

echo("<br>");

echo memory_get_usage();

25.2 ً‫النص البرمج‬

122
‫بعلللد تنفٌلللذ اللللنص رقلللم ‪ 25.2‬كلللان النلللاتج فلللً المرحللللة األوللللى ]‪ , [92888‬والثانٌلللة‬
‫]‪ [72290192‬والثالثة ]‪ , [92968‬فكما تشاهد عزٌزي المبرمج أن بعدما قمنا بمسح المتغٌر‬
‫]‪ [$arr‬ملللن اللللذاكرة باسلللتخدام الداللللة ])‪ [unset($arr‬فللل ن المسلللاحة المسلللتخدمة فلللً‬
‫الذاكرة أصبحت أقل بكثٌر‪.‬‬

‫الحل الثانً ‪:‬‬


‫عندما تتعامل مع الدوال قم بمسح جمٌع المتغٌلرات ملن اللذاكرة فلور انتهلاء عملل الداللة‬
‫‪,‬انظر إلى النص البرمجً رقم ‪. 25.3‬‬

‫{)(‪function unseeting‬‬

‫;"‪$x="aldeheme‬‬

‫;"‪$y="ksu.edu.sa‬‬

‫;)‪unset($x‬‬

‫;)‪unset($y‬‬

‫}‬

‫النص البرمجً ‪25.3‬‬

‫الحل الثالث ‪:‬‬


‫قللم بالتأكللد مللن أن جمٌللع الصللفحات التللً تحتللوي علللى معلومللات حساسللة ال توضللع فللً‬
‫الذاكرة الم قتة ]‪, [cache‬حٌث إن الذاكرة الم قتة ٌمكن أن تظهر لنا معلوملات قدٌملة‪,‬‬
‫أو مخزنة فً الذاكرة الم قتة لدى العمٌل ‪ ,‬وٌقلوم باسلتغاللها واللدخول إللى صلفحات ال‬
‫ٌحق ل الدخول إلٌها ‪ ,‬كذلك قم باستخدام الصالحٌات التً تناسبك وتناسب النظام لدٌك‬

‫‪123‬‬
‫‪ ,‬وتتم هذه الطرٌقة بربط الدوال الحساسة بالصالحٌات لكً تحلدد العملل والمجلال اللذي‬
‫تعمل ب هذه الدالة ‪ ,‬كذلك تأكد من أن الوصول إلى المصادر مناسلبة ألنظملة الم سسلة‬
‫أو العمل لدٌك‪ ,‬انظلر اللنص رقلم ‪ 25.4‬لكلً تتضلح فكلرة عملل مسلح اللذاكرة الم قتلة‬
‫لموقع ما ‪ ,‬وبال شك أن عندما ٌقوم المستخدم بطلبها فسوف ٌجلب الصلفحة بأكملهلا ملن‬
‫الخادم بشكل مباشر ولٌ من ذاكرة المستخدم أو ذاكرة محركات البحث ‪.‬‬

‫;)"‪header("Cache-Control: no-cache, must-revalidate‬‬


‫ضع تارٌي قدٌم ‪header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); //‬‬

‫النص البرمجً ‪25.4‬‬

‫قم بوضع النص رقلم ‪ 25.4‬فلً أول الصلفحة الملراد تعطٌلل عملل اللذاكرة الم قتلة لهلا‬
‫(قبلللل طباعلللة أي مللللف ‪, )html‬وكلللذلك قلللم بوضلللع الوسلللم (اللللنص رقلللم ‪ ) 25.5‬فلللً‬
‫الصفحات المراد جلبها ولكن قد ال ٌعمل النص البرمجلً ‪ 25.5‬بشلكل صلحٌح حٌلث أن‬
‫المتصفح قد ال ٌقرأ الوسلم ]‪ [META‬عنلد جللب الصلفحة وبالتلالً سلٌقوم بجللب الصلفحة‬
‫التً فلً اللذاكرة الم قتلة وكلذلك لٌسلت جمٌلع المتصلفحات تلدعم الوسلم ]‪ [META‬فللذلك‬
‫البرمجً رقم ‪. 25.4‬‬
‫"‪<META http-equiv="expires‬‬ ‫ٌجب علٌك أن تستخدم النص‬
‫>"‪content="0‬‬

‫النص البرمجً ‪25.5‬‬

‫بالنسللبة لمحركللات البحللث خاصللة ]‪ [google.com‬لكللً نمنع ل مللن وضللع صللورة أو‬
‫نسخة للموقع فً الذاكرة الم قتة الخاصة ب نستخدم الوسم وبالتالً تخبر محرك البحلث‬
‫أن ال ٌقوم بتخزٌن فً الذاكرة الم قتة الخاصة ب ‪.‬‬

‫>"‪<META NAME="ROBOTS" CONTENT="NOARCHIVE‬‬

‫النص البرمجً ‪25.6‬‬

‫‪124‬‬
4 [Incorrect Calculation] ‫الحسابات الخاط ة‬

ٖ8
http://lifehacker.com/software/google/ask- , ٙ8ٕ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-682
http://articles.sitepoint.com/article/caching- , lifehacker-keep-google-from-caching-my-site-165522.php
php-performance

125
‫عزٌزي القارئ ‪ ,‬استخدام الحسابات والعملٌلات الرٌاضلٌة فلً الحاسلب اآلللً قلد ٌسلبب‬
‫بعلض المشلاكل عنللدما تتعللق هلذه الحسللابات باتخلاذ القلرارات أو حجللز مصلدر معللٌن ‪,‬‬
‫فمللن الممكللن أن ٌقللوم البرنللامج أو الموقللع بالقسللمة علللى العللدد صللفر ]‪ [zero‬وبالتللالً‬
‫ٌحصل انهٌار فً النظام ‪.‬‬

‫إن إعطللاء الفرصللة للمهللاجم ب دخللال القللٌم مللن الممكللن أن ٌسللبب أخطللاء منطقٌللة فللً‬
‫عملٌات الشراء ‪,‬و البٌع ‪ ,‬والمزادات ( راجع ثغرة عدم التحقق ملن صلحة المعلوملات‬
‫المدخلة بشكل صحٌح ) ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬
‫تحدث هذه الثغرة على مستوى تصمٌم و هٌكلٌة و برمجة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها عالٌة الخطورة ‪.‬‬
‫شاهد المثال التالً ‪:‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$num_id = $HTTP_GET_VARS['num_id‬‬

‫;‪$who_is=$num_id/$num_id‬‬

‫{)‪if($who_is==0‬‬

‫اجعل مدٌر عام ‪//‬‬

‫}‬

‫{‪else‬‬

‫مدٌر عام‪//‬‬ ‫عضو لٌ‬


‫ٌقوم النص البرمجً رقم ‪ 26.1‬بأخذ رقم عضوٌة العضو‪ ,‬ف ذا كان نلاتج القسلمة صلفراً‬
‫}‬
‫ً‬
‫عضلوا عادًٌلا وبالتلالً‬ ‫فمعناه أن هذا هو المدٌر العلام ‪ ,‬ملا علدا ذللك ف نل سلوف ٌصلبح‬
‫النص البرمجً ‪26.1‬‬
‫سللوف ٌأخللذ صللالحٌات العضللو العللادي ‪ ,‬فلللو فرضللنا أن الزائللر أدخللل صللفراً للمتغٌللر‬
‫]‪ [num_id‬ف ن سلوف ٌحلدث (اسلتثناء)]‪ , [ exception‬حٌلث أنل ال ٌنبغلً القسلمة عللى‬

‫‪126‬‬
‫صللفر وبالتللالً سللوف ٌكللون نللاتج القسللمة صللفراً ‪ ,‬وعنللدها سللوف ٌصللبح مللدٌرً ا عا ًمللا‬
‫للموقع ‪ ,‬انظر الشكل ‪ 26.1‬بعد التنفٌذ ‪.‬‬

‫الشكل ‪26.1‬‬
‫مع أن أظهر لنا رسالة تنبٌ وللٌ خطلأ (والمقصلود أن اللنص البرمجلً سلوف ٌسلتمر‬
‫فً التنفٌذ ألن لغة ]‪ [php‬لم تعده خطأ ً برمجٌا ًولكن خطأ ً منطقٌا ً)وبالتلالً الزائلر أصلبح‬
‫مدٌراً عامًا ألن المتغٌر ]‪ [$who_is‬أصبحت قٌمت صفرً ا ‪.‬‬

‫‪127‬‬
‫الحلول المتوافرة لمشكلة (الحسابات الخاط ة ‪)4‬‬

‫الحل األول ‪:‬‬


‫عزٌزي المبرمج ‪ ,‬قم بالفهم الصحٌح المنطقً لطرٌقة تعامل نظامك مع األرقلام وكلذلك‬
‫كٌفٌة تعامل النظام مع األرقام الكبٌرة انظر إلى النص رقم ‪. 27.1‬‬

‫‪ٖ9‬‬
‫‪, http://cwe.mitre.org/data/definitions/682.html‬‬
‫‪, http://www.php.net/manual/en/language.types.integer.php#language.types.integer.casting‬‬
‫‪. http://php.net/manual/en/function.intval.php‬‬

‫‪128‬‬
‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪echo $number_page =(int)$HTTP_GET_VARS['number_page‬‬

‫‪// select from db by the number page‬‬

‫النص البرمجً ‪27.1‬‬


‫فً المثلال السلابق ٌوجلد خللل بسلٌط حٌلث قمنلا باسلتقبال المتغٌلر ]‪[$number_page‬‬
‫الللذي ٌمثللل رقللم صللفحة معٌنللة ‪ ,‬حٌللث االسللتعالم مللن قاعللدة البٌانللات ٌعتمللد علللى هللذا‬
‫المتغٌر الذي قمنا بتحوٌل إلى علدد صلحٌح ]‪ , [integer‬ولكلن بسلبب علدم فهلم طبٌعلة‬
‫النظام قد ٌتم إدخال عدد كبٌلر جل ًدا ٌفلوق ملا ٌتحملل العلدد الصلحٌح ‪ ,‬وبالتلالً ال ٌعملل‬
‫النظام بشكل سلٌم ! فالحل هنا هو التحقق من العلدد المسلتقبل لل بعلد التحوٌلل هلل هلو‬
‫عدد صحٌح أم تغٌر ! انظر إلى النص البرمجً رقم ‪. 27.2‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$number_page =(int)$HTTP_GET_VARS['number_page‬‬

‫{)‪if($number_page<2147483647‬‬

‫‪// select from db by the number page‬‬

‫}‬
‫أقلل‬
‫{‪else‬‬‫فً النص البرمجً رقم ‪ 27.2‬قمنا بعملٌة التأكد من أن الرقم الصحٌح بعد التحوٌلل‬
‫;)"خطأ"(‪echo‬‬
‫من ]‪ [2147483647‬الذي ٌمثل أكبر عدد ٌمكن تمثٌل بصفت عدداً صحٌحا ً ‪.‬‬
‫}‬
‫الحل الثانً ‪:‬‬
‫النص البرمجً ‪27.2‬‬
‫قم بالتأكد من األرقام المدخلة أنها صحٌحة وأنها ضمن نطلاق معلٌن ! انظلر اللنص رقلم‬
‫‪.27.3‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$number_page =(int)$HTTP_GET_VARS['number_page‬‬

‫{)‪if($number_page>0 || $number_page<10‬‬

‫‪// select from db by the number page‬‬

‫}‬

‫{‪else‬‬
‫‪129‬‬
‫;)"خطأ"(‪echo‬‬
‫كما تشاهد فً النص البرمجً رقم ‪ 27.3‬قمنا بحصر المدخالت ما بٌن الرقم واحلد إللى‬
‫الرقم عشرة فقط وما عدا ذلك ٌرفض ‪.‬‬

‫الحل الثالث ‪:‬‬


‫عندما ترٌلد أن تسلتخدم متغٌلراً معٌنلا ً كلرقم ضلخم‪ ,‬أو حجلم لشلكل معلٌن ‪ ,‬أو مسلافة ‪,‬‬
‫تأكد من أنها لٌست عد ًدا سالبًا ‪,‬انظر إلى النص البرمجً رقم ‪. 27.4‬‬

‫‪130‬‬
global $HTTP_GET_VARS;

$number_page =(int)$HTTP_GET_VARS['number_page'];

if($number_page>0){

// select from db by the number page

27.4 ً‫النص البرمج‬

131
32[Code Injection] ‫حقن النصوص البرمجٌة‬

ٗٓ
. http://php.net/manual/en/function.exec.php , 9ٗ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-94

132
‫قد ٌقوم المهاجم بحقن النصوص البرمجٌة الخبٌثة عن طرٌق المسارات المسلمو بهلا ‪,‬‬
‫حٌث إن مشاكل الحقن سواء ( حقن النصوص البرمجٌة أو الحقنة االستعالمٌة ) تخضع‬
‫للمشكلة نفسها و لها الحلول نفسها ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪,‬وهٌكلٌة ‪,‬وبرمجة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها عالٌة الخطورة ‪.‬‬

‫‪133‬‬
‫شاهد المثال التالً ‪:‬‬

‫?<‬

‫‪class code‬‬

‫{‬

‫{)(‪function code‬‬

‫;"‪$MessageFile = "messages.php‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$name =$HTTP_GET_VARS['name‬‬

‫;]'‪$message = $HTTP_GET_VARS['message‬‬

‫;)"‪$handle = fopen($MessageFile, "a+‬‬

‫;)"‪fwrite($handle, "<b>$name</b> says '$message'<hr>\n‬‬

‫;)‪fclose($handle‬‬

‫}‬

‫;}‬

‫;)(‪$start_new=new code‬‬

‫فٌل>?‬
‫فً النص البرمجً رقم رقم ‪ 28.1‬قمنا بفلتح مللف هلو ‪ [messages.php] :‬والكتابلة‬
‫المتغٌلر ]‪ [message‬وكتابلة محتلواه بشلكل‬ ‫‪ ,‬ولكن الخطأ البرمجً هو أننا قمنلا باسلتقبال‬
‫النص البرمجً ‪28.1‬‬
‫مباشر فلً المللف‪,‬وبالتلالً فل ن أي شلخص ٌقلوم بعلرض المللف فسلوف ٌلتم علرض ملا‬
‫وضع ب من قبل المهاجم ‪ ,‬لنفرض أن قام بوضع النص البرمجً الخبٌث‬
‫]>?;)'‪ [<?php system('/bin/ls -‬الذي ٌقوم بعلرض جمٌلع ملفلات الخلادم إذا كلان‬
‫نظام التشغٌل لنك وبالتالً ٌستطٌع أي شلخص مهملا كلان تصلفح جمٌلع ملفلات الخلادم‬
‫بالدخول على هذا الملف ! ‪.‬‬
‫‪[<?php‬‬‫عندما قمنا بتنفٌذ النص البرمجً ‪ , 28.1‬وكانت قٌملة المتغٌلر ]‪ [$message‬هلً‬
‫]>? ; )'‪ , exec('del index.php‬كللان النللاتج بعللدما قمنللا بفللتح الملللف ]‪ [messages.php‬كمللا فللً‬
‫الشكل ‪.28.1‬‬

‫‪134‬‬
‫الشكل ‪28.1‬‬

‫وبللال شللك بعلللد تنفٌللذ ملللف ]‪ [messages.php‬اللللذي ٌحتللوي علللى أملللر حللذف الصلللفحة‬
‫الرئٌسٌة]‪ [index.php‬ف ن سٌقوم بحذفها !‬

‫‪135‬‬
)30‫الحلول المتوافرة لمشكلة (حقن النصوص البرمجٌة‬

ٗٔ
http://roshanbh.com.np/2008/01/uploading-larger- , http://cwe.mitre.org/data/definitions/94.html
. files-in-php.html

136
‫الحل األول ‪:‬‬
‫عزٌزي المبرمج ‪ ,‬إن عملٌة الحقن بصفة عامة سلواء كانلت البرمجلة عبلر الموقلع ‪ ,‬أو‬
‫حقن النصوص البرمجٌة كلها تملك الحللول نفسلها ‪ ,‬فللذلك تسلتطٌع الرجلوع إللى حللول‬
‫ثغرة البرمجة عبر الموقع (صفحة ‪. ) 89‬‬

‫‪137‬‬
30[Improper Initialization] ‫اإلنشاء الغٌر صحٌح‬

ٕٗ
. ٙٙ٘ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-665

138
‫عزٌزي القارئ ‪ ,‬عندما ترٌد أن تذهب إلى مناسبة مهمة بالنسبة لك ‪ ,‬ف نلك تقلوم بعملٌلة‬
‫تجهٌللز جمٌللع األمللور واللللوازم الضللرورٌة ‪ ,‬مللا ٌحللدث فللً اإلنشللاء غٌللر الصللحٌح أنللك‬
‫تظن بأنك قمت باإلنشاء الصحٌح والتجهٌزات الصحٌحة لجمٌلع المعلوملات والمتغٌلرات‬
‫ولكن تفاجأ عندما ٌفشل النظام فً تكلوٌن وتجهٌلز جمٌلع المعلوملات والمتغٌلرات ‪ ,‬ألنل‬
‫ٌ دي إلى كوارث وتعدٌل على الصالحٌات ‪ ,‬انظر إلى النص البرمجً رقم ‪.29.1‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬
‫تحدث هذه الثغرة على مستوى برمجة النظام ‪ ,‬أو عملٌة (دالة معٌنة ) ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها متوسطة الخطورة ‪.‬‬
‫{)(‪function users‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$name_user =$HTTP_GET_VARS['name‬‬

‫‪$message = "select id from users where‬‬


‫;"'‪user_name='$name_user‬‬

‫;)‪$q=mysql_query($sql‬‬

‫;)‪$row=mysql_fetch_array($q‬‬

‫;]'‪$id=$row['id‬‬

‫{)"" ==‪if($id‬‬

‫;)(‪$this->make_him_admin‬‬

‫}‬

‫}‬

‫)(‪function make_him_admin‬‬

‫{‬
‫تخٌلل عزٌللزي القللارئ ‪ ,‬للو أن النظللام حصللل بل عطللل ولللم ٌلتمكن مللن جلللب معلومللات‬
‫}‬
‫المستخدم فماذا سوف ٌحصل ؟‬
‫النص البرمجً ‪29.1‬‬

‫‪139‬‬
‫تخٌل لو أن النظام قبل تنفٌلذ األملر ];)‪ [$row=mysql_fetch_array($q‬فلً اللنص‬
‫البرمجً رقم ‪ , 29.1‬توقف عن العمل ملع قاعلدة البٌانلات‪ ,‬وللم ٌجللب لنلا شلٌئا ً فسلوف‬
‫تكلللللون قٌملللللة المتغٌلللللر ]‪ [$id‬صلللللفراً ‪ [zero],‬وبالتلللللالً سلللللوف تنفلللللذ الداللللللة‬
‫]‪ [make_him_admin‬وعندها ٌكون هو المدٌر العام للموقع !‬

‫‪140‬‬
‫الحلول المتوافرة لمشكلة (اإلنشاء الغٌر صحٌح‪)34‬‬

‫ٖٗ‬
‫‪. http://cwe.mitre.org/data/definitions/665.html‬‬

‫‪141‬‬
‫الحل األول‪:‬‬
‫قم باستخدام اللغات التً تقلل من مشكلة اإلنشاء غٌلر الصلحٌح مثلل لغلة جافلا ]‪, [java‬‬
‫عنللدما تقللوم باسللتخدام متغٌللر دون إنشللائ مسللب ًقا سللوف ٌظهللر لللك خطللأ أثنللاء الترجمللة‬
‫]‪, [compile‬ولكن عندما تستخدم بعض اللغات مثل لغة ]‪ [Php‬التً تقوم ب عطاء قلٌم‬
‫أولٌة للمتغٌرات (فارغلة) التلً قملت باسلتخدامها دون إنشلائها بطرٌقلة صلحٌحة فسلوف‬
‫ٌسبب لك مشاكل عدة ‪.‬‬

‫الحل الثانً‪:‬‬
‫عزٌزي المبرمج ‪ ,‬قم ب نشاء جمٌع المتغٌلرات فلً بداٌلة اللنص البرمجلً بشلكل واضلح‬
‫وصرٌح‪ ,‬انظر النص رقم ‪. 30.1‬‬

‫{)(‪function page‬‬

‫;"‪$x="null‬‬

‫;‪$y=0‬‬

‫‪//‬‬

‫‪//‬‬

‫}‬

‫النص البرمجً ‪30.1‬‬


‫الحل الثالث‪:‬‬
‫تجنب مشكلة اإلخالل بالشروط ألنها تسبب تضاربا ً فً المتغٌرات وللذلك تحلدث مشلكلة‬
‫اإلنشاء الغٌر صحٌح ‪.‬‬

‫‪142‬‬
‫التحكم بالوصول بطرٌقة غٌر صحٌحة‬
: 33[Improper Access Control (Authorization)]

ٗٗ
ٕ8٘:‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-285

143
‫هللً عملٌللة السللما للعمٌللل أو المهللاجم الوصللول السللهل إلللى ملللف معللٌن أو دالللة معٌنللة‬
‫بشللكل غٌللر مباشللر‪,‬حقٌقل ًلة ٌصللعب علٌللك أٌهللا المبللرمج توقللع جمٌللع أفعللال المهللاجم فقللد‬
‫ٌللتمكن مللن الوصللول إلللى هللذه الملفللات بطرٌقللة أنللت ال تعلمهللا وعنللد الوصللول إلللى هللذه‬
‫الملفللات ٌقللوم بالللدخول بصللالحٌات لٌسللت تخص ل ‪ ,‬بعبللارة أخللرى هللً عملٌللة الللتحكم‬
‫بالوصللول إلللى ملللف معٌن لة أو دالللة معللٌن بطرٌقللة غٌللر صللحٌحة ‪ ,‬انظللر إلللى الللنص‬
‫البرمجً رقم ٔ لكً تتضح الفكرة ‪.‬‬
‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬
‫تحدث هذه الثغرة على مستوى تصمٌم ‪,‬وهٌكلٌة ‪,‬وبرمجة النظام ‪ ,‬أو عملٌة (دالة) ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها عالٌة الخطورة ‪.‬‬

‫النص البرمجً رقم ‪ 31.1‬هو عبارة علن نظلام رسلائل خاصلة بلٌن أعضلاء المنتلدى أو‬
‫الموقع ‪,‬فالعضو المسجل ٌستطٌع أن ٌرى الرسائل الخاصة ب فقط ‪.‬‬

‫{)‪function DisplayPrivateMessage ($id‬‬

‫;)‪$this->read_massage($id‬‬

‫}‬

‫{)(‪function index‬‬

‫;‪global $HTTP_GET_VARS‬‬

‫;]'‪$username =$HTTP_GET_VARS['username‬‬

‫;]'‪$pass =$HTTP_GET_VARS['pass‬‬

‫{ )‪if($this->AuthenticateUser($username,$pass)==flase‬‬

‫‪//exit‬‬

‫‪144‬‬ ‫}‬

‫;]'‪$id =$HTTP_GET_VARS['id‬‬
‫عزٌلزي المبللرمج ‪ ,‬إن الللنص البرمجلً رقللم ‪ٌ 31.1‬بللدو أنل ال ٌمتلللك أي مشللاكل ! ألن‬
‫عملٌلللللللة التأكلللللللد ملللللللن الصلللللللالحٌة صلللللللحٌحة مئلللللللة بالمئلللللللة كملللللللا فلللللللً السلللللللطر‬
‫]‪ [AuthenticateUser($username,$pass)==flase‬فهذا األمر سوف ٌتأكلد ملن‬
‫صالحٌة الزائر ف ذا كان ال ٌمتلك حسابًا مخز ًنا فً قاعدة البٌانات فسوف ٌخرج مباشرة‬
‫من الصفحة ‪ ,‬ولكن األمر ٌتعلق بمن ل صالحٌة الدخول وٌعد عضواً مخزنا ً فلً قاعلدة‬
‫البٌانللات فب مكان ل قللراءة أي رسللالة مللن رسللائل األعضللاء عللن طرٌللق اللعللب بللالمتغٌر‬
‫]‪ [$id‬و كتابة رقم تخمٌن ٌمثل رقم الرسالة كما فً الشكل ‪. 31.1‬‬

‫الشكل ‪31.1‬‬

‫‪145‬‬
‫كمللا تشللاهد فللً الشللكل ‪ , 31.1‬ف ل ن أي عضللو ٌسللتطٌع قللراءة الرسللائل الخاصللة بللٌن‬
‫األعضاء بمجرد تغٌٌر رقم الرسالة ‪ ,‬فالمقصود هنا أن مع تحقٌق الصلالحٌة الصلحٌحة‬
‫للعضو إال أن استخدم هذه الصالحٌة للوصول إلى منطقة معٌنلة (رسلائل األعضلاء ) ال‬
‫ٌحق ل الوصول إلٌها ‪.‬‬

‫‪146‬‬
‫الحلول المتوافرة لمشكلة (التحكم بالوصول بطرٌقة غٌر‬
)3 ‫صحٌحة‬

ٗ٘
, http://php.net/manual/fr/function.header.php , http://cwe.mitre.org/data/definitions/285.html
. http://bytes.com/topic/php/answers/9951-how-clear-cache

147
‫الحلول ‪:‬‬
‫عزٌزي المبرمج ‪ ,‬لحل مثلل هلذه المشلاكل ٌجلب علٌلك أن تسلتخدم أملر ]‪ ,[if‬حٌلث أنل‬
‫مللللن الممكللللن أن نللللتخلص مللللن هللللذا الثغللللرة عللللن طرٌللللق ربللللط المتغٌللللر ]‪ [$to‬بللللـ‬
‫]‪ , [$username‬وبهللذا الطرٌقللة تأكللدنا أن الشللخص المصللر لل قللام بقللراءة الرسللالة‬
‫الموجل لل ولللٌ لعضللو آخللر ‪ ,‬انظللر إلللى الللنص البرمجللً ‪ 32.1‬بعللد إضللافة المتغٌللر‬
‫]‪ [$to‬إلٌ ‪.‬‬
‫{)‪function read_massage($id‬‬

‫;)‪$to=$this->info_massage($id‬‬

‫{)‪if($to==$username‬‬

‫;)" تستطٌع قراءة أي رسالة"(‪echo‬‬

‫}‬

‫}‬

‫{)‪function info_massage($id‬‬

‫‪//‬‬

‫}‬

‫النص البرمجً ‪32.1‬‬

‫‪148‬‬
‫استخدام طرٌقة تشفٌر خطرة أو مدمرة‬
3 [Use of a Broken or Risky Cryptographic
Algorithm]

ٗٙ
.ٖٕ7:‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-327

149
‫عزٌللزي القللارئ ‪,‬عنللدما تقللوم بنقللل معلومللات حساسللة ‪ ,‬ف نللك بللال شللك سللوف تسللتخدم‬
‫التشللفٌر لتشللفٌر هللذه المعلومللات لكللً ال ٌطلللع علٌهللا أحللد ‪ ,‬ولكللن الخطللأ هللو اسللتخدام‬
‫طرٌقللة تشللفٌر مللن اختراعللك الخللاص وعللدم السللٌر وإتبللاع الطللرق الموحللدة المعروفللة‬
‫عالمٌلا ً لعملٌللة التشللفٌر ‪ ,‬فهللذا قللد ٌسللبب كشللف وكسللر التشللفٌر الخللاص بللك بكللل سللهولة‬
‫‪,‬وأٌض لا ً ال تللن َ أن اسللتخدام الطللرق القدٌمللة الموحللدة عالمٌ لا ً لٌسللت طرٌقللة فعالللة فللً‬
‫التشللفٌر‪ ,‬ألنل مللن السللهولة كسللرها بمللا أنهللا قدٌمللة وباسللتخدام الهندسللة العكسللٌة أصللبح‬
‫األمر سهالً ج ًدا للغاٌة ‪ ,‬حٌث إن الهندسة العكسٌة هً عملٌة تحلٌل المعلوملات المشلفرة‬
‫وعن طرٌقها ٌقوم المهاجم باستخراج وكشف الخوارزمٌة المستخدمة ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪ ,‬وهٌكلٌة النظام ‪.‬‬


‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫;‪$password=123‬‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها ما بٌن متوسطة إلى عالٌة الخطورة ‪.‬‬
‫;‪$cy_pass=$password*123‬‬

‫النص البرمجً ‪33.1‬‬


‫شاهد طرٌقة تشفٌر غٌر آمنة قمت باختراعها من ُب َنٌَّا ِ‬
‫ت أفكاري ‪:‬‬

‫فً النص البرمجلً رقلم ‪ ,33.1‬قملت بتشلفٌر كلملة السلر ]‪ [123‬وذللك بضلربها بالعلدد‬
‫نفس ]‪ [123‬ولكن هذه الطرٌقلة سلٌئة جل ًدا وضلعٌفة بلل إن المهلاجم ٌسلتطٌع كشلفها فلً‬
‫زمللن قصللٌر ج ل ًدا ‪ ,‬حٌللث إن طرٌقللة فللك العللدد المشللفر النللاتج مللن (التشللفٌر) ]‪[ 15129‬‬
‫بالقسمة على العدد ]‪ [123‬وٌكون الناتج بعد فك الشفرة ]‪ [123‬كما فً اللنص البرمجلً‬
‫رقم ‪.33.2‬‬

‫;‪$de_pass=$cy_pass/123‬‬

‫النص البرمجً ‪33.2‬‬

‫‪150‬‬
‫الحلول المتوافرة لمشكلة (استخدام طرٌقة تشفٌر خطرة أو‬
)3 ‫مدمرة‬

ٗ7
, http://php.net/manual/en/book.mcrypt.php , http://cwe.mitre.org/data/definitions/327.html
. http://www.topbits.com/xor-encryption.html

151
‫الحل األول ‪:‬‬
‫أوالً ال تقم باستخدام خوارزمٌة خاصة بك ف ن مع استخدام الهندسة العكسٌة والتلً تقلوم‬
‫بدراسة المخرجات ومن ثم معرفة وكشف الخوارزمٌة التً قمت باستخدامها ‪ ,‬فلذلك قلم‬
‫باسللتخدام خوارزمٌللة تشللفٌر موحللدة ومعروفللة عالمٌ لا ً انظللر الللنص رقللم ٔ لكللً تتضللح‬
‫الفكرة‪,‬وهً طرٌقة موحدة ومعروفة عالمًٌا لتشفٌر فً لغة ]‪.[php‬‬

‫فً مثالنا التالً سوف نقوم بشلر دوال ]‪ , [Mcrypt‬انظلر إللى اللنص البرمجلً رقلم‬
‫‪ٔ.$td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, '/usr/lib/mcrypt-‬‬
‫‪34.1‬‬
‫;)'‪modes‬‬

‫;)‪2.$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND‬‬

‫;)‪3.$ks = mcrypt_enc_get_key_size($td‬‬

‫;)‪4.$key = substr(md5('very secret key'), 0, $ks‬‬

‫;)‪5.mcrypt_generic_init($td, $key, $iv‬‬

‫;)'‪6.$encrypted = mcrypt_generic($td, 'This is very important data‬‬

‫;)‪7.mcrypt_generic_deinit($td‬‬

‫النص البرمجً ‪34.1‬‬


‫قمنا فً النص البرمجً رقم ‪ 34.1‬باسلتخدام التشلفٌر المتنلاظر ‪,‬وتسلتطٌع الرجلوع إللى‬
‫الباب الخاص بأنواع التشفٌر لكً تقرأ ما ٌقصد بالتشفٌر المتناظر ‪.‬‬
‫فً السلطر ٔ ‪ ,‬قمنلا باسلتخدام الداللة ]‪, [mcrypt_module_open‬حٌلث إن المتغٌلر‬
‫األول عبلللللللارة علللللللن نلللللللوع الخوارزمٌلللللللة المسلللللللتخدمة للتشلللللللفٌر هلللللللو التشلللللللفٌر‬
‫المتناظر ]‪ , [MCRYPT_DESٗ8‬أما المتغٌر الثالث فهو نمط التشلفٌر‪ ٗ9‬قمنلا باسلتخدام‬

‫‪ٗ8‬‬
‫هناك أنواع ألنماط التشفٌر من ضمنها ‪ , CBC‬أو ‪ , OFB‬أو ‪ , CTR‬وتستطٌع الحصول على معلومات أكثر من خالل الرابط‬
‫(‪. )http://mcrypt.hellug.gr/lib/mcrypt.3.html‬‬

‫‪152‬‬
‫الللنمط (‪ , )ECB‬فنقللوم بكتابللة (‪ )MCRYPT_MODE_ECB‬والللذي سللوف ٌقللوم بعملٌللة‬
‫]‪ [XOR‬مع كل كتلة ]‪ [block‬باستخدام موجة التهٌئة ]‪[initialization vector‬‬

‫(‪.)IV‬‬
‫حرف ‪ f‬المفتاك ‪ v‬ناتج التشفٌر‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪0‬‬
‫بالطرٌقللة التالٌللة ‪ٌ,‬كللون النللاتج‬ ‫أملللللللا عملٌلللللللة ]‪ [XOR‬فتلللللللتم‬
‫واحد بت عندما ٌكون أحد العمودٌن (البتان) واحد بت و ما عدا ذلك ٌكون الناتج صلفراً‬
‫‪,‬فلو كان الحرف المراد تشلفٌره ]‪ , [f‬والحلرف اآلخلر المقابلل لل واللذي سلوف نتعاملل‬
‫مع فً عملٌة ]‪ [XOR‬هو ]‪ , [v‬وهلذا الحلرف ٌنشلأ بشلكل عشلوائً علن طرٌلق موجلة‬
‫التهٌئة ]‪ [IV‬وفً كل مرة نقوم بعملٌة التشفٌر ف ن سلوف ٌنلتج أحلرف عشلوائٌة لكلً ال‬
‫ٌكون هناك تشاب بٌن الكتل فٌما بٌنها انظر الشكل ‪ 34.1‬لكً تتضح عملٌة التشفٌر‪ ,‬أما‬
‫النص المراد‬ ‫‪IV‬‬
‫التالً فٌمثل طرٌقة عمل ]‪: [XOR‬‬ ‫الجدول‬
‫النص المشفر‬
‫تشفٌر‬

‫‪8kcolB‬‬
‫‪Bytes‬‬ ‫‪XOR‬‬ ‫‪DES‬‬ ‫‪kcolB‬‬

‫‪P1‬‬
‫‪kcolB‬‬ ‫‪C1‬‬
‫‪kcolB‬‬
‫‪XOR‬‬ ‫‪DES‬‬
‫‪P2‬‬
‫‪.‬‬ ‫‪C2‬‬
‫‪.‬‬

‫‪.‬‬
‫‪kcolB‬‬ ‫‪XOR‬‬ ‫شكل ‪34.1‬‬ ‫‪DES‬‬
‫‪.‬‬
‫‪kcolB‬‬

‫‪kcolB‬اسللللللللتخدمنا‬
‫السللللللللطر الثللللللللانً (ٕ) مللللللللن الللللللللنص البرمجللللللللً رقللللللللم ‪,34.1‬‬
‫‪Pn‬‬ ‫فللللللللً‪Cn‬‬
‫‪kcolB‬‬
‫العشللوائٌة التللً‬
‫]‪ [mcrypt_create_iv‬إلنشللاء موجللة التهٌئللة معتمللدٌن علللى القٌمللة ‪Pn‬‬
‫‪XOR‬‬ ‫‪DES‬‬
‫‪Pn‬‬
‫]‪ ,[MCRYPT_RAND‬فللً السللطر ٖ قمنللا ب نشللاء طللول‬‫تشفٌر ‪CEB‬‬
‫سللوف تنشللأ مللن قبللل النظللام‬
‫المفتللا الخللاص للمرسللل ‪ ,‬وفللً السللطر ٗ قمنللا ب نشللاء المفتللا بعللد إدخال ل فللً دالللة‬
‫االختزال (البعثرة) ]‪ , [md5‬حٌث كان المفتا ]‪ , [very secret key‬فلً السلطر ٘‬

‫‪153‬‬
‫قمنا باالستعداد للتشفٌر باستخدام الدالة ]‪ , [mcrypt_generic_init‬أما فلً السلطر ‪ٙ‬‬
‫فبدأت عملٌة التشفٌر ‪ ,‬وبالنسبة للسطر األخٌر ‪ 7‬قمنا ب غالق التشفٌر ‪.‬‬

‫الحل الثانً ‪:‬‬


‫قللم بتصللمٌم وتحلٌللل موقعللك أو نظامللك بحٌللث ٌكللون مللن السللهل ترقٌللة الخوارزمٌللة‬
‫المستخدمة إلى خوارزمٌة أخرى أقوى من األولى ‪.‬‬

‫الحل الثالث ‪:‬‬


‫اِحْ م المفتا الخاص والعام فً عملٌة التشفٌر ألن لو تم سرقة هذه المفتا فسلوف ٌكلون‬
‫من السهل كشف المعلومات المشفرة حتلى للو كانلت الخوارزمٌلة قوٌلة و حماٌلة المفتلا‬
‫هً أن تقوم باسلتخدام دوال االختلزال (البعثلرة) مثلل]‪[md5‬انظلر إللى اللنص البرمجلً‬
‫رقم ‪. 34.2‬‬

‫;)'‪$key=md5('very secret key‬‬

‫النص البرمجً ‪34.2‬‬

‫‪154‬‬
2[Hard-Coded Password] ‫كلمة المرور المدمجة‬

٘ٓ
. ٕ٘9 : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-259

155
‫إن عملٌة دمج كلمة المرور فً جلزء ملن النظلام "الموقلع " أو فلً جمٌلع أجلزاء النظلام‬
‫عملٌللة تقللود إلللى مخللاطر أمنٌللة عدٌللدة ‪ ,‬ولكللن فللً الوقللت نفس ل تسللهل عملٌللة إصللال‬
‫وصٌانة النظام ‪.‬‬

‫عزٌزي القارئ ‪ ,‬إن عملٌة دمج كلمة المرور تتم بطرٌقتٌن ‪:‬‬
‫‪ ‬كلمة المرور تكون مدمجة فً النص البرمجً نفس الذي ٌتأكد من الصالحٌات ‪.‬‬
‫‪ ‬قٌللام النظللام بالتواصللل مللع طللرف خللارجً ‪ ,‬حٌللث إن كلمللة المللرور تكللون مدمجللة مللع‬
‫الوحدة الداخلٌة إلكمال عملٌة التواصل ‪.‬‬

‫فً النوع األول تكون كلمة المرور موجودة بشكل افتراضلً فلً النظلام ‪ ,‬وعنلدما ٌقلوم‬
‫أي شخص بشراء هذا النظلام تلأتً معل كلملة الملرور نفسلها وعملٌلة تغٌٌرهلا قلد تكلون‬
‫صعبة ألنها تحتاج إلى قراءة النص البرمجً والتعدٌل فٌ ‪ ,‬فلذلك قد ٌلجأ المشلتري إللى‬
‫تغٌٌر النظام كامالً ‪.‬‬

‫بال شك أنل ٌعطلً إمكانٌلة للمهلاجم بلأن ٌقلوم باللدخول ألي نسلخة ملن نسلي هلذا النظلام‬
‫ألنها تحتوي على كلمة المرور نفس ‪.‬‬

‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪,‬وهٌكلٌة ‪ ,‬وبرمجة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها ما بٌن متوسطة إلى عالٌة الخطورة ‪.‬‬

‫شاهد المثال التالً ‪ ,‬النص البرمجً ‪:35.1‬‬

‫{)"‪if($pass=="xyz‬‬

‫;)"‪echo("you are not admin‬‬

‫}‬

‫{‪else‬‬

‫‪156‬‬ ‫;)"‪echo("you are the admin‬‬

‫}‬
‫فللً الللنص البرمجللً رقللم ‪ 35.1‬لللو اُسللتخدم هللذا الللنص البرمجللً فللً عللدة أجللزاء مللن‬
‫النظام ف ن سٌمكن المهاجم من سهولة االختراق ‪ ,‬حٌث إن معرفت لكلمة الملرور لجلزء‬
‫واحد تضمن ل معرفة باقً أجزء النظام بكل سهولة !‬

‫‪157‬‬
) 0‫الحلول المتوافرة لمشكلة (كلمة المرور المدمجة‬

٘ٔ
, http://cwe.mitre.org/data/definitions/259.html
. http://www.webcheatsheet.com/php/md5_encrypt_passwords.php

158
‫الحل األول ‪:‬‬
‫أوالً عزٌزي المبرمج ‪ ,‬بدالً من كتابة اسم المستخدم وكملة السر داخلل اللنص البرمجلً‬
‫قللم بعمللل مللا ٌسللمى بملللف اإلنشللاء ‪ ,‬وهللذا الملللف ٌعمللل فللً المللرة األولللى عنللدما تقللوم‬
‫بتنصللٌب الموقللع أو النظللام ‪ ,‬ومللن خالللل ٌسللتطٌع المسللتخدم وضللع كلمللة سللر واسللم‬
‫ْن ب ‪ ,‬وبالتالً تخزن هذه المعلومات فلً قاعلدة البٌانلات ‪,‬ومللف اإلنشلاء‬ ‫مستخدم َخا َّ‬
‫صٌ ِ‬
‫ٌجلللب أن ٌحلللذف نهائٌلللا ً بعلللد التنصلللٌب ‪ ,‬انظلللر الشلللكل ‪ 36.1‬وهلللو مللللف اإلنشلللاء‬
‫]‪ [install.php‬الخاص ببرنامج المنتدٌات ]‪. [vBulletin‬‬

‫الشكل ‪36.1‬‬

‫الشكل ‪ٌ 36.2‬مثل خطوة تهٌئة قاعدة البٌانات وإنشاء جمٌع الجداول‪.‬‬

‫‪159‬‬
‫الشكل ‪36.2‬‬

‫فللً الشللكل ‪ 36.2‬الخطللوة التللً تقللوم بهللا بوضللع اسللم المسللتخدم للمللدٌر العللام‪ ,‬والللرقم‬
‫السري‪ ,‬والبرٌد اإللكترونً‪ ,‬ومن هنا تخلصنا من مشكلة وضع كلمة مرور مدمجلة فلً‬
‫داخل النص البرمجً وجعلنا إنشاءها فلً مرحللة تهٌئلة النظلام للعملل ]‪ , [install‬وبلال‬
‫شك أن بعد إتمام العملٌلة سلوف نقلوم بحلذف مللف ]‪ [install.php‬لكلً ال ٌسلتطٌع أي‬
‫شخص التالعب ب وإعادة تهٌئة النظام من جدٌد ومن ثم اختراق ‪.‬‬

‫الحل الثانً ‪:‬‬


‫قم بتشفٌر جمٌع كلمات السر باستخدام دالة االختزال ]‪ , [hash‬وٌجب أن ٌكون تشلفٌرً ا‬
‫أحللادي االتجللاه مثللل ]‪ , [md5‬وبعللدها قللم بتخللزٌن كلمللات السللر المشللفرة فللً قاعللدة‬
‫البٌانات‪ ,‬انظر إلى النص رقم ‪. 36.1‬‬

‫;"‪$pass="aldeheme‬‬

‫;)‪$pass=md5($pass‬‬

‫;")'‪$sql= "INSERT INTO admin(pass) VALUES ('$pass‬‬

‫;)‪$q=mysql_query($sql‬‬

‫النص البرمجً ‪36.1‬‬


‫فً النص البرمجلً رقلم ‪ 36.1‬قمنلا بتشلفٌر كلملة الملرور ]‪ [$pass‬باسلتخدام التشلفٌر‬
‫أحللادي االتجللاه ]‪ , [md5‬ومللن ثللم قمنللا بتخللزٌن القٌمللة المشللفرة فللً قاعللدة البٌانللات‬
‫];")'‪ , [$sql= "INSERT INTO admin(pass) VALUES ('$pass‬فللذلك عزٌلزي‬
‫القارئ حتى لو استطاع المهاجم الحصول عللى كلملات الملرور ملن قاعلدة البٌانلات فللن‬

‫‪160‬‬
‫ٌسللتطٌع اسللتخدامها بشللكل مباشللر ‪ ,‬وال بللد لل أن ٌقللوم بكسللر التشللفٌر‪ ,‬فل ن كانللت كلمللة‬
‫المرور ضعٌفة التخمٌن ف ن بال شك سوف ٌستطٌع أن ٌتعرف على كلمة المرور خلالل‬
‫دقائق ولكن لو كانت كلمة المرور قوٌة فقد ٌكون الوقت الالزم لتخمٌنها آالف السنٌن !‬

‫عنللدما تقللوم بتخللزٌن كلمللة مللرور مشللفرة ف ن ل عنللد اسللترجاعها تقللارن كلمللة المللرور‬
‫المشرفة مع الكلمة المدخلة بعد تشفٌرها‪ ,‬انظر إلى النص البرمجً رقم ‪. 36.2‬‬

‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$user_pass =$HTTP_POST_VARS['pass‬‬

‫;)‪$pass=md5($user_pass‬‬

‫;"'‪$sql="SELECT * FROM admin where pass='$pass‬‬

‫;)‪$q=mysql_query($sql‬‬

‫النص البرمجً ‪36.2‬‬

‫فً النص البرمجً رقم ‪ 36.2‬قمنا بتشفٌر كلمة المرور المدخلة ]‪ , [$user_pass‬وملن ثلم‬
‫قمنا بمقارنة قٌمة التشفٌر مع التشفٌر المخلزن فلً قاعلدة البٌانلات * ‪[$sql="SELECT‬‬
‫];"'‪. FROM admin where pass='$pass‬‬

‫‪161‬‬
‫إسناد الصالحٌات غٌر اآلمنة للمصادر الحساسة‬
0[Insecure Permission Assignment for Critical
: Resource]

ٕ٘
. 7ٖٕ : ‫ رقم الثغرة‬, http://cwe.mitre.org/top25/#CWE-732

162
‫تحدث هذه المشكلة عندما تعطى الصالحٌات لمصدر معٌن ولكن بطرٌقلة غٌلر آمنلة ‪,‬أو‬
‫لمللدى ونطللاق أوسللع ‪ ,‬فمللن الممكللن أن تسللتغل هللذه الصللالحٌات لكشللف المعلومللات‬
‫ضللا تحللدث هللذه المشللكلة دائ ًمللا عنللدما ٌتعلللق األمللر بالمصللادر والملفللات‬
‫الحساسللة‪ ,‬وأٌ ً‬
‫المرتبطة ب عدادات النظام ‪.‬‬
‫علززى أي مسززتوى تحززدث هززذه الثغززرة ؟ و مززا هززً اللغززات التززً تتززأثر بهززا ؟ ومززا هززو‬
‫مستوى خطورتها ؟‬

‫تحدث هذه الثغرة على مستوى تصمٌم ‪,‬وهٌكلٌة ‪ ,‬وبرمجة النظام ‪.‬‬
‫اللغللات التللً تتللأثر بهللا هللً جمٌللع اللغللات البرمجٌللة بللال اسللتثناء وكللذلك قامللت منظمللة‬
‫]‪ [Sans‬بتصنٌف هذه الثغرة بأنها ما بٌن متوسطة إلى عالٌة الخطورة ‪.‬‬
‫لنشاهد النص البرمجً رقم ‪ 37.1‬لكً تتضح الفكرة ‪.‬‬
‫> "‪<form action="init.php" method="post‬‬
‫المستخدم اسم>"‪<p align="center"><input type="text" name="T1" size="20‬‬
‫>‪</p‬‬
‫>"‪<p align="center‬‬
‫>‪</br‬‬
‫>‪ </p‬المرور كلمة >"‪<input type="text" name="T1" size="20‬‬
‫>"‪<p align="center‬‬
‫>‪</br‬‬
‫"‪ <input type="checkbox" name="C1" value="yes‬الصفحات جمٌع ٌشاهد‬
‫>‪checked></p‬‬
‫>‪" name="B1"></br‬إضافة"=‪<p align="center"><input type="submit" value‬‬
‫>‪</form‬‬

‫النص البرمجً ‪37.1‬‬


‫فً النص البرمجً رقلم ‪ٌ 37.1‬وجلد ]‪ٌ [html‬حتلوي عللى حقللٌن هملا "اسلم المسلتخدم‬
‫وكلمللة المللرور "‪ ,‬وكللذلك حقللل تأكٌللد ]‪ , [checkbox‬وأٌللضً َ ا بشللكل افتراضللً تللم‬
‫اختٌاره بوضع العالمة "صح" انظر الشكل ‪. 37.1‬‬

‫‪163‬‬
‫الشكل ‪37.1‬‬

‫فكما تشاهد عزٌزي المبرمج ‪ ,‬أن عندما قمنا ب نشاء مستخدم علادي "للٌ الملدٌر العلام‬
‫للموقع"]‪ [admin‬ولكلن تلم إعطلا ه وبشلكل افتراضلً إمكانٌلة مشلاهدة جمٌلع صلفحات‬
‫الموقع التً من المفروض أنها ال تعطى ل !‬

‫‪164‬‬
‫الحلول المتوافرة لمشكلة (إسناد الصالحٌات غٌر اآلمنة للمصادر الحساسة‪) 4‬‬

‫ٖ٘‬
‫‪. http://cwe.mitre.org/data/definitions/732.html‬‬

‫‪165‬‬
‫الحل األول ‪:‬‬
‫عزٌزي المبرمج ‪ ,‬عندما تقوم ببرمجة ملف اإلعدادات الخلاص بتهٌئلة النظلام أو إنشلائ‬
‫‪ ,‬ففللً مرحلللة التنصللٌب األول للنظللام قللم بوضللع وكتابللة الص لالحٌات الحساسللة بشللكل‬
‫افتراضً‪ ,‬واجعلها غٌلر قابللة للتعلدٌل إال بشلكل ٌلدوي فقلط اللذي ٌتطللب ملن مسلتخدم‬
‫النظام الدخول إلى الملفات الخاصة بالنصوص البرمجٌلة والتعلدٌل علٌهلا ! انظلر اللنص‬
‫رقم ‪38.1‬لكً تتضح الفكرة ‪.‬‬

‫> "‪<form action="ini.php" method="post‬‬

‫>‪ </p‬اسم المستخدم>"‪<p align="center"><input type="text" name="username" size="20‬‬

‫>"‪<p align="center‬‬

‫>‪</br‬‬

‫>‪ </p‬كلمة المرور >"‪<input type="text" name="pass" size="20‬‬

‫>‪" name="B1"></br‬إضافة"=‪<p align="center"><input type="submit" value‬‬

‫>‪</form‬‬

‫النص البرمجً ‪38.1‬‬

‫فً النص البرمجً رقم ‪ٌ 38.1‬وجد حقالن "اسلم المسلتخدم" و "كلملة الملرور" ‪ ,‬وعنلد‬
‫الضللغط علللى "إضللافة " سللوف ترسللل المعلومللات إلللى صللفحة ]‪ [ini.php‬انظللر إلللى‬
‫النص البرمجً رقم ‪. 38.2‬‬
‫;‪global $HTTP_POST_VARS‬‬

‫;]'‪$user_pass =$HTTP_POST_VARS['pass‬‬

‫;]'‪$user_name =$HTTP_POST_VARS['username‬‬
‫فللً الللنص البرمجللً رقللم ‪ 38.2‬قمنللا ب نشللاء المللدٌر العللام للموقللع ‪ ,‬وكللذلك قمنللا ب سللناد‬
‫;"‪$see_all_page="yes‬‬
‫صالحٌة مشاهدة جمٌلع الصلفحات بشلكل افتراضلً إلٌل ]"‪,[$see_all_page="yes‬‬
‫‪$sql="insert into admin (user,pass,see_all_page) values‬‬
‫وبهذه الطرٌقة لن ٌستطٌع من قام بتهٌئة أو إنشاء النظام من العبث بهذه الصلالحٌة التلً‬
‫;")'‪('$user_pass','$user_name','$see_all_page‬‬
‫‪38.2‬للاآلن تللم إس لناد هللذه الصللالحٌة إلللى‬
‫البرمجًلع ‪ ,‬ف‬
‫النص للموقل‬
‫ٌجللب أن تعطللى بالضللرورة للمللدٌر العللام‬
‫المصادر "الصفحات" بشكل صحٌح ‪.‬‬

‫‪166‬‬
‫الحل الثانً ‪:‬‬
‫عندما تتعامل مع ملف إعدادات النظام وتعلم أنل ملن الممكلن أن ٌلتم تعدٌلل ملن قبلل أي‬
‫شخص فبشكل مباشر قم ب عادة تهٌئة النظام مرة أخرى ‪.‬‬

‫‪167‬‬
168
‫الثغرات البرمجٌة التً اهتمتها بها منظمة ]‪[OWASP‬‬

‫عزٌززي المبزرمج ‪ ,‬اهتمزت منظمزة ‪(OWSP) The One World Sight Project‬‬
‫بدراسة المشاكل البرمجٌة وقامت بإنشاء قا مة تحتوي على أهم عشر مشاكل برمجٌة‬
‫زارا التززً قامززت بتصززنٌفها‬
‫‪ ,‬فززً مشززروعً قمززت بشززرك أكثززر مززن عشززرٌن ثغززرة انتشز ً‬
‫منظمة ]‪ , [SANS‬ومزن هزذه العشزرٌن ٌوجزد مشزاكل مشزتركة بزٌن التصزنٌف الخزاص‬
‫بالمنظمتٌن ]‪ [OWSP‬و ]‪. [SANS‬‬

‫فزززً الجززززء التزززالً سزززوف أقزززوم بشزززرك بعزززت المشزززاكل البرمجٌزززة التزززً اهتمزززت بهزززا‬
‫]‪ [OWSP‬وهً تخص لغة ]‪. [php‬‬

‫‪169‬‬
‫فٌت الذاكرة ]‪: [Buffer Overflows 3‬‬

‫مشكلة فٌض الذاكرة ال توجد أثناء عمل لغة ]‪ [php‬وبما أنهلا ال تتعاملل ملع الم شلرات‬
‫]‪ , [pointers‬ف نها ال تعانً من هذه المشكلة ‪,‬ولكن قد تحدث فلً اللدوال نفسلها وللٌ‬
‫ٗ٘‬
‫شرط فً قناة االتصال ٌمكن من خالل وضع عدد أكبر من المدخالت فً منطقة مخصصة الحتجاز البٌانات بما ٌفوق قدرتها االستٌعابٌة‬
‫لذلك من خالل استبدال المعلومات الموجودة بالكتابة علٌها‪ٌ .‬ستخدم المهاجمون ذلك الشرط إلسقاط النظام أو إدخال شفرات خاصة تم‬
‫إعدادها بمهارة عالٌة تسمح لهم بالسٌطرة على النظام والتحكم ب ‪.‬‬

‫‪170‬‬
‫أثناء تنفٌذ ]‪,[runtime‬على سبٌل المثال كانت دالة ]‪ [Wordwrap‬تعانً من مشكلة فٌض‬
‫الذاكرة ومن خاللها ٌستطٌع المهاجم تنفٌذ نصوص خبٌثة أو تعطٌل الخدملة علن الموقلع‬
‫]‪ , [Denial of service‬وبالمناسبة استمرت المشكلة ملن إصلدار ]‪ [4.1.2‬إللى ملا قبلل ]‪[4.3.0‬‬
‫وكان الحل هو ترقٌة ]‪ [php‬إلى أحد اإلصدارات التً أتت بعده ]‪. [4.3.0‬‬

‫عزٌزي المبرمج تستطٌع معرفلة كلل ملا ٌسلتحدث فلً لغلة ]‪ [php‬ملن خلالل االشلتراك‬
‫فلللً القائملللة البرٌدٌلللة ]‪ [php-announce‬ملللن خلللالل اللللرابط ‪[http://www.php.net/mailing-‬‬
‫]‪. lists.php‬‬

‫‪171‬‬
‫اختراق حساب معٌن و إدارة الجلسات‬
‫]‪[Broken Account and Session Management‬‬

‫عزٌللزي المبللرمج ‪ ,‬ال تحتللاج إلللى أدوات خاصللة إلدارة الجلسللات ]‪ [sessions‬بشللكل‬
‫احترافللً‪ ,‬ولكللن تحتللاج إلللى بعللض الطللرق لتخللزٌن المعلومللات بشللكل مخفللً ٌصللعب‬
‫الوصول إلٌ مثل تخزٌن معلومات الجلسة الحالٌة فً ملف معٌن ]‪ , [file‬أو فلً قاعلدة‬
‫البٌانات‪ ,‬أو فً الكعك ‪,‬مع أن العلم أن الوضع االفتراضً للجلسات مع الخادم أن ٌقلوم‬
‫بفتح ملف ]‪ [file‬وتخزٌن جمٌع المعلومات ب ‪ ,‬ولكلن ملن بلاب أن المهلاجم قلد ٌسلتطٌع‬
‫الوصول إلى هذا الملف ف ن من األفضل أن نقوم بتغٌٌلر مسلار هلذا المللف بمللف آخلر‪,‬‬
‫شاهد النص البرمجً ‪. 40.1‬‬
‫‪<?php‬‬ ‫‪.‬‬
‫)‪function open($save_path, $session_name‬‬

‫‪172‬‬ ‫{‬

‫;‪global $sess_save_path‬‬
173
function write($id, $sess_data)

global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";

if ($fp = @fopen($sess_file, "w")) {

$return = fwrite($fp, $sess_data);

fclose($fp);

return $return;

} else { return(false);

function destroy($id)

global $sess_save_path;

$sess_file = "$sess_save_path/sess_$id";

return(@unlink($sess_file));

function gc($maxlifetime)

global $sess_save_path;

foreach (glob("$sess_save_path/sess_*") as $filename) {


‫قمنا بتغٌٌر المسلار االفتراضلً اللذي تخلزن فٌل الملفلات الخاصلة بالجلسلات‬, ‫باختصار‬
[$sess_save_path = "C:/AppServ/php/sessions";] [open] ‫[ وجعلناه كما فً دالة‬session]
if (filemtime($filename) + $maxlifetime < time()) {

‫@الدوال‬unlink($filename);
‫ وبعد إعداد جمٌع‬,‫وبالتالً هنا لن ٌستطٌع المهاجم معرفة مكان تخزٌن الجلسات‬
‫الالزمللللللللللة مللللللللللن قللللللللللراءة وكتابللللللللللة وتللللللللللدمٌر للجلسللللللللللات نسللللللللللتخدم الدالل}لللللللللة‬
‫نظللام‬} ‫[ التللً تقللوم بللدورها فللً تللولً مهمللة تغٌٌللر‬session_set_save_handler]

return true;"close", "read", ‫الجلسللات وهللً تسللتقبل الللدوال بصللفتها متغٌللرات‬


["open",
}session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
"write", "destroy", "gc"]
session_start();

echo($_SESSION['username']="aldeheme");

?>
174
40.1 ً‫تابع النص البرمج‬
‫وأخٌرً ا نبدأ الجلسة ونقوم باستخدام المتغٌرات المخزنة سلاب ًقا فلً الجلسلات السلابقة مثلل‬
‫]]'‪, [$_SESSION['username‬و بعللد الللذهاب إلللى المجلللد الخللاص بتخللزٌن ملفللات‬
‫الجلسات وجدنا الجلسة ومخزن فٌها ‪ , username‬كما فً الشكل ‪. 40.1‬‬

‫الشكل ‪40.1‬‬

‫اإلعدادات الخاصة بالموقع والخادم‬


‫]‪: [Web and Application Server Misconfiguration‬‬

‫‪175‬‬
176
‫عزٌللزي المبللرمج ‪ٌ ,‬جللب أن تكللون لللدٌك المعرفللة المسللتمرة عللن الثغللرات الجدٌللدة ‪,‬أو‬
‫المشاكل البرمجٌة فً لغة ]‪ , [php‬أو اللغات األخرى ‪ ,‬تسلتطٌع معرفلة ملا ٌسلتجد ملن‬
‫المشاكل البرمجٌة عن طرٌق التسلجٌل فلً القائملة البرٌدٌلة ]‪ [php-announce mailing‬عللى‬
‫الرابط (‪. )http://www.php.net/mailing-lists.php‬‬

‫كذلك قم بتعدٌل قٌم بعض المتغٌرات فً ملف اإلعدادات الخاصة بلغة ]‪ [php‬المسلمى‬
‫بلـ ]‪ ,[php.ini‬عللى سلبٌل المثلال قلم بكتابلة السلطر التلالً ‪[AddType application/x-‬‬
‫]‪ httpd-php-source .php‬وهللو ٌللدل علللى أن جمٌللع الملفللات التللً تكللون امتللداداتها‬
‫]‪ [php‬سوف ٌتم تنفٌذ النص البرمجً المكتوب داخلها بدالً من أن ٌلتم تحمٌلهلا بصلفتها‬
‫ملفات واالطالع على جمٌع محتوٌات النص البرمجً ‪.‬‬

‫فً الحقٌق إن اإلعدادات الخاصة بالخادم تعتمد بشكل كبٌر عللى الشلخص المسلتأجر أو‬
‫المالك للخادم ! فٌجب أن ٌكلون عنلده الخبلرة الكافٌلة إلدارة الخلادم بشلكل احترافلً دون‬
‫تعرٌض المواقع المرفوعة علٌ للخطر‪.‬‬

‫‪177‬‬
178
‫التشفٌر‬
‫المجال هنا غٌر متا لمناقشة تارٌي التشلفٌر و كٌفٌلة تطلوره ‪ ,‬فأحببلت أن أدخلل بشلكل‬
‫مباشر إلى أنواع التشفٌر المستخدم فً نقل البٌانات الرقمٌة ‪.‬‬

‫أنواع التشفٌر]‪: [Encryption‬‬

‫‪ .‬انتشفيز انًتُاظز (‪: )Symmetric Algorithms‬‬


‫ٌسللتخدم لتشللفٌر المعلومللات أو قللٌم متغٌللرات الللروابط عللن طرٌللق المفتللا العللام‪ ,‬وهللو‬
‫مفتا متعارف علٌ بٌن المرسل والمستقبل‪ ,‬وكلذلك ٌلتم فلك تشلفٌر قلٌم هلذه المتغٌلرات‬
‫بمعرفللة المفتللا العللام]‪ , [Public Key‬هنللا بالتأكٌللد ٌكللون الللرقم السللري لك لل شللخص‬
‫(المفتا الخاص)]‪ [ Private Key‬هو المفتا العام نفس انظر الشكل ‪. 1‬‬

‫الشكل ‪1‬‬

‫ٕ‪ .‬انتشفيز غيز انًتُاظز (‪: )Asymmetric Algorithms‬‬

‫‪179‬‬
‫ما ٌمٌزه عن التشفٌر المتناظر أن ٌمتلك عنصراً إضافٌا ً هلو المفتلا الخلاص ملع وجلود‬
‫المفتا العام ‪.‬أما المفتا الخاص ف ن ٌعد معرفا ً للشخص وهو ٌختللف ملن شلخص إللى‬
‫آخر‪.‬‬
‫إذاً هنا لو استطاع المهاجم معرفة المفتا العام فلن ٌستفٌد شٌئا ً ألن الرسالة المشفرة للن‬
‫ٌعللاد فللك تشللفٌرها إال بمعرف لة المفتللا الخللاص ‪ ,‬ف ل ذا كللان هنللاك اتفللاق بللٌن المرسللل‬
‫والمستقبل على أن المفتا العام هو األسا الذي تبنى علٌ عملٌة التشلفٌر وأن المفتلا‬
‫الخاص هو المكملل للمفتلا العلام( المفتلا العلام باإلضلافة إللى المفتلا الخلاص = رقلم‬
‫األسا ) ‪ ,‬ف ن عند فك تشفٌر (الرسالة المشفرة) بهذه الطرٌقة البد من الحصلول عللى‬
‫ثالث معلومات أساسٌة هً ]‪ [x,y,z‬فلو فرضنا أن رقلم األسلا للتشلفٌر هلو]‪ [x‬فلال بلد‬
‫من معرفة ]‪([y‬المفتا العام) و]‪( [z‬المفتا الخاص ) لفك تشفٌر الرسالة ‪.‬‬

‫انظر الشكل ‪. 2‬‬

‫الشكل ٕ‬

‫]‪: [x‬‬ ‫رقم األسا‬

‫ٌتم إصدار رقم األسا عن طرٌق البرنلامج المتخصلص أو إحلدى الهٌئلات المسلتقلة و‬
‫المتخصصلة فلً إصلدار هلذه األرقلام وهلو ملا ٌعلرف بهٌئلة الشلهادات ‪[Certificate‬‬
‫]‪ Authority‬بحٌث ٌكون لكل مستخدم رقم أسا وٌتم تقسٌم هذا الرقم إللى مجملوعتٌن‬
‫]‪( [y,z‬المفتا العام و المفتا الخاص) ‪.‬‬

‫‪180‬‬
‫المفتا العام ]‪: [y‬‬

‫الللرقم الللذي ٌللتم تداول ل و نشللره بللٌن بقٌللة المسللتخدمٌن لتشللفٌر أي معلومللة أو رسللالة‬
‫إلكترونٌلة و ٌعلد رقملك العلام أسلا عملٌلة التشلفٌر‪ ,‬و ال ٌسلتطٌع أحلد فلك رملوز تلللك‬
‫المعلومة غٌرك أو أي شخص ٌملك المفتا العام‪ ,‬والمفتا العام ٌكون معرفا ً مسب ًقا بٌن‬
‫المرسل والمستقبل‪.‬‬
‫المفتا الخاص ]‪: [z‬‬

‫هو النصف اآلخر المكمل للمفتا العام للوصلول إللى اللرقم األسلا وإعلادة المعلوملات‬
‫المشفرة إلى وضعها الطبٌعلً قبلل التشلفٌر ‪ ,‬و هلذا المفتلا هلو اللذي ٌمٌلز كلل شلخص‬
‫عن غٌلره ملن المسلتخدمٌن وٌكلون هوٌلة إلكترونٌلة تمكلن صلاحبها ملن فلك أي معلوملة‬
‫مشفرة مرسل إلٌ ‪.‬‬

‫‪181‬‬
182
‫عزٌزززي القززار ‪ ,‬هززانحن نقززدم للمبززرمج العربززً بعززت المقترحززات والفرضززٌات التززً‬
‫نسزأل أن تعززود علزى جمٌززع المبزرمجٌن بكززل فا زدة‪ ,‬والهززدف مزن وراء هززذه الطززرق‬
‫المبتكرة التً تمت برمجتها من قبلً هزو تحفٌزز المبزرمج العربزً علزى االبتكزار وعزدم‬
‫االعتماد بنسبة م ة بالم ة على المطروك من قبل اآلخرٌن ‪ ,‬أحزب أن أذكزر القزار أن‬
‫جمٌزع الحلزول السزابقة مزن ابتكزاري الخزاص وأنهزا جمٌعهزا تنزدرج تحزت هزذا البزاب !‬
‫ولكن وضعتها كحلول مقترحة قد تناسب البعت وقد ال تناسبه ! ‪ ,‬وكزذلك قمزت بزإفراد‬
‫باب لطرك الفكرة المبتكرة فً حفظ حقوق كاتب أو ناشر وفً المجال نفسه وهزو منزع‬
‫ثغرة الحقن االستعالمٌة‪.‬‬

‫الطرٌقة المبتكرة فً حفظ الحقوق و منع ثغرة الحقن‬


‫االستعالمٌة ‪:‬‬
‫هذه الطرٌقة من الممكن أن تستخدم فً المواقع الحساسة التابعزة للزدوا ر الحكومٌزة ‪,‬‬
‫حٌث إن الرابط دا ًما متغٌر ومبنً على الجلسة الحالٌة للزا زر ‪,‬فعلزى سزبٌل المثزال لزو‬
‫أخذت الرابط التالً ‪:‬‬
‫‪http://www.aldeheme.com/demo/showcom.php?945448486=1‬‬
‫‪&index=1‬‬

‫فلن ٌعرت لك محتوى الصفحة ألن الرابط معزرف علزى جهزاز واحزد فقزط وخزالل مزدة‬
‫زمنٌة معٌنة ‪.‬‬

‫‪183‬‬
‫فىائذ استخذاو هذِ انتقُيت ‪:‬‬
‫‪ .0‬حفظ حقزوق كاتزب أو ناشزر‪ ,‬فلزن ٌسزتطٌع أحزد أن ٌنقزل الزرابط وٌوزعزه علزى أطزراف‬
‫متعددٌن ‪ ,‬حٌث إن الوصزول إلزى المعلومزة ٌتطلزب منزك أن تتصزل بالصزفحة الر ٌسزٌة‬
‫للموقع]‪ [index‬ومن ثم الوصول إلى المعلومة ‪.‬‬
‫‪ .0‬عدم نشزر المعلومزات الحساسزة علزى محركزات البحزث ‪ ,‬حٌزث إنهزا لزن تسزتطٌع تمٌٌزز‬
‫الرابط األصلً للمعلومات الحساسة ألن رابطها دا ًما متغٌر ‪.‬‬
‫‪ .4‬إخفززاء المتغٌززرات المرسززلة مززن صززفحة إلززى أخززرى ‪ ,‬حٌززث إن المتغٌززرات تمثززل بأرقززام‬
‫عشوا ٌة تتغٌر فً كل مرة ٌدخل فٌها الزا ر إلى الموقع ‪.‬‬
‫‪ .3‬حتى لو كان الموقع ٌوجد بزه ثغزرة الحقنزة االسزتعالمٌة فلزن ٌسزتطٌع المهزاجم تنفٌزذها‬
‫ألن جمٌززع القززٌم المرسززلة عززن طرٌززق ]‪ [URL‬البززد أن تقززارن مززع القززٌم المخزنززة فززً‬
‫الجلسة ]‪.[session‬‬

‫طزيقت ػًم هذِ انتقُيت ‪:‬‬

‫‪ .0‬نعطزززً المتغٌزززرات المعروضزززة فزززً الموقزززع قٌ ًمزززا عشزززوا ٌة مثزززل ]‪ٌ [id_post‬سزززتبدل‬
‫بـ]‪ [945448486‬وقٌمته ]‪ [1‬الذي ٌمثل على سبٌل المثال (رقم المقال ) ‪.‬‬
‫‪ .0‬نستخدم نظام الجلسات ]‪ [session‬لحفظ جمٌع المتغٌرات العشوا ٌة وقٌمها ‪.‬‬
‫‪ .4‬عندما ٌقوم الزا ر بالضغط على رابط معزٌن ولزٌكن مقزاالً ‪,‬نقزوم بأخزذ محتزوى المتغٌزر‬
‫العشوا ً ونقارنه مع قٌمة المتغٌر العشوا ً المسجل فً الجلسة الحالٌة للزا ر ‪.‬‬
‫‪ .3‬إذا كانززت القٌمززة المرسززلة مززع المتغٌززر العشززوا ً تطززابق مززا هززو مسززجل فززً الجلسززة ‪,‬‬
‫عنززدها سززوف نقززوم بعززرت المقززال المززراد ومززا عززدا ذلززك سززوف ٌحززول إلززى الصززفحة‬
‫الر ٌسٌة ‪.‬‬

‫;)(‪1.$_SESSION['do']=array‬‬

‫{ )]‪2.if(!$_SESSION['do'][$position‬‬

‫;)‪3.$_SESSION['do'][$position]=rand(1,10000)+($position‬‬

‫;)]'‪4.$_SESSION['do'][$position]=array($_SESSION['do'][$position],$row['id‬‬

‫;)]‪5.$last->assign("do",$_SESSION['do'][$position][0‬‬

‫;)]'‪6.$last->assign("link",$row['id‬‬
‫‪184‬‬
‫;‪7.$position++‬‬
‫الللنص البرمجللً رقللم ٔ المسلل ول عللن إنشللاء القللٌم المتغٌللرة مللع قٌمهللا وإدخالهللا فللً‬
‫مصفوفة ]‪,[array‬نالحظ فً السطر األول أننا أنشأنا مصفوفة‪ ,‬وتخلزن هلذا المصلفوفة‬
‫فً الجلسة الحالٌة ‪,‬وكذلك نالحظ فً السلطر الثلانً أننلا وضلعنا هلذا الشلرط لكلً تنفلذ‬
‫عملٌلللللللللللة إنشلللللللللللاء المتغٌلللللللللللرات ملللللللللللرة واحلللللللللللدة عنلللللللللللد دخلللللللللللول الصلللللللللللفحة‬
‫]]‪ , [$_SESSION['do'][$position‬مللع العلللم أن المتغٌللر ]‪ [$position‬تللم إنشللا ه‬
‫فللً أول الللنص البرمجللً وهللو ٌبللدأ مللن الصللفر ‪ ,‬أمللا السللطر الثالللث فقمنللا فٌ ل بتعبئللة‬
‫المصفوفة بأول قٌم عشوائٌة ‪,‬حٌث إن الدالة ])‪ [rand(1,10000‬سوف تعطٌنا قٌملة عشلوائٌة‬
‫ضللللا أضللللفنا علٌهللللا ]‪ [$position‬بحٌللللث إنلللل مللللع إضللللافة‬ ‫بللللٌن ٔ و ٓٓٓٓٔ ‪ ,‬وأٌ ً‬
‫]‪ [$position‬لللن ٌكللون هنللاك تكللرر فللً العللدد العشللوائً ])‪ ,[rand(1,10000)+($position‬أمللا‬
‫فللً السللطر الرابللع فقمنللا ب نشللاء أول خانللة فللً المصللفوفة وهللً مصللفوفة أخللرى داخللل‬
‫الخانللة األولللى‪ ,‬وهللذه المصللفوفة تحتللوي علللى خللانتٌن (األولللى هللً الللرقم العشللوائً ‪,‬‬
‫والثانٌلللللللللللللة هلللللللللللللً رقلللللللللللللم ]‪ [id‬المخلللللللللللللزن فلللللللللللللً قاعلللللللللللللدة البٌانلللللللللللللات )‬
‫])]'‪, [array($_SESSION['do'][$position],$row['id‬وفً السطر الخام والساد قمنا ب سلناد القلٌم‬
‫إلى المتغٌرات الموجودة فً ملف ]‪ , [html‬أما فً السطر السابع فقمنلا بزٌلادة المتغٌلر‬
‫برقم واحد‪ ,‬وبعدها فً السلطر الثلامن قمنلا ب سلناد هلذا القٌملة إللى المتغٌلر الموجلود فلً‬
‫]‪ [html‬الذي ٌمثل رقم خانة معٌنة فً المصفوفة ‪.‬‬

‫من السطر التاسع حتى النهاٌة ما هو إال تكرار للسابق‪ ,‬ولكن هنا اعتملدنا عللى القٌملة‬
‫المخزنة فً المصفوفة أول ما دخل الزائر للموقع بدالً ملن إنشلائها ملرة أخلرى عنلد كلل‬
‫مرة ٌقوم الزائر فٌها بالضغط على زر التحدٌث ‪.‬‬

‫‪185‬‬
‫لتوضٌح الخطوات (ٔ إلى ‪ ) 8‬انظر إلى النص رقم ٕ ‪:‬‬

‫‪http://localhost/mybl/showcom.php?8700=1&index=1‬‬

‫النص البرمجً ٕ‬

‫اللون األحمر فً النص البرمجلً ٕ ‪ٌ ,‬مثلل القٌملة العشلوائٌة وهلً ٓٓ‪ , 87‬وتلم إسلناد‬
‫رقم واحد ]‪ [1‬لها الذي ٌمثل العمود ]‪ [id‬فً قاعدة البٌانلات ‪ ,‬أملا الللون األسلود فٌمثلل‬
‫رقم الخانة فً المصفوفة ‪ .‬عزٌزي القارئ ‪ ,‬عنلد طللب اللرابط (اللنص رقلم ٕ ) سلوف‬
‫ٌتم التأكد من الرابط بالطرٌقة التالً‪ ,‬انظر إلى النص رقم ٖ ‪.‬‬
‫فللللللللللللً الللللللللللللنص البرمجللللللللللللً ٖ قمنللللللللللللا باسللللللللللللتقبال المتغٌللللللللللللر العشللللللللللللوائً‬
‫]]‪ [$_SESSION['do'][$index][0‬ف ذا كانت القٌمة التلً ٌحملهلا ]‪ [id‬تسلاوي القٌملة‬
‫المخزنة فً المصفوفة ]]‪ , [$_SESSION['do'][$index][1‬عندها نعلم أن القٌمة‬
‫]‪if ($HTTP_GET_VARS[$_SESSION['do'][$index][0]]==$_SESSION['do'][$index][1‬‬
‫{)‬

‫;)"‪echo("OK‬‬

‫}‬

‫النص البرمجً ٖ‬
‫المرسللة صللحٌحة ولٌسلت نصوصلا ً خبٌثل ًلة أو طلبًلا غٌللر صللحٌح ‪ ,‬انظلر الشللكل ٔ لكللً‬
‫تتضح لدٌك كٌفٌة التأكد من أن الرابط صحٌح ‪.‬‬

‫الشكل ٔ‬

‫‪186‬‬
‫الخاتمة‬
‫عزٌزي القار ‪ ,‬أتمنى من عز وجل أن أكون قد وفقت فً طرٌقة طرحً للمشاكل‬
‫ً‬
‫حقٌقة إن مجال أمن المعلومات ٌتمٌز باتساع األفق‬ ‫األمنٌة والحلول المناسبة لها ‪,‬‬
‫وتعدد مجاالته ‪ ,‬من خالل تجربتً الشخصٌة وجدت أنه عالم فٌه العلوم الكثٌرة و‬
‫المعارف البرمجٌة التً ٌستمتع المبرمج العربً بقراءتها ‪.‬‬

‫ً‬
‫حقٌقة من أي‬ ‫اإلنسان معرت للخطأ لكونه إنسانا ً وكما قٌل جل من ال ٌخطئ ‪ ,‬أتمنى‬
‫شخص له وجهة نظر فٌما طرحت وقدمت أن ٌخبرنً بها لعل أن ٌنفع بها‬
‫المسلمٌن أجمع ‪ ,‬والحمد هلل رب العالمٌن والصالة والسالم على أشرف األنبٌاء‬
‫والمرسلٌن ‪.‬‬

‫للتواصل مع الكاتب ‪:‬‬

‫البرٌد اإللكترونً ‪m.s.aldeheme@gmail.com :‬‬

‫‪187‬‬

You might also like