Mekanisme pemprosesan kebenaran WordPress dilaksanakan terutamanya dengan menyediakan fungsi yang berbeza kepada peranan yang berbeza Apabila peranan pentadbir kedai ditakrifkan, ia akan menetapkan fungsi edit_users kepada peranan ini, supaya Mereka boleh terus menguruskan akaun pelanggan kedai. Keseluruhan proses penetapan kebenaran berlaku semasa proses pemasangan pemalam. woocommerce/includes/class-wc-install.php:
//Shop manager role.add_role( 'shop_manager', // Internal name of the new role 'Shop manager', // The label for displaying array( // Capabilities ⋮ 'read_private_posts' => true, 'edit_users' => true, 'edit_posts' => true, ⋮ ));
Maklumat kebenaran peranan akan disimpan dalam pangkalan data sebagai tetapan teras WordPress, yang bermaksud bahawa peranan pengguna kini bebas daripada pemalam, walaupun jika pemalam tidak didayakan dan tidak akan menjejaskan kebenaran peranan yang berkaitan.
Apabila pengguna yang disahkan cuba mengubah suai maklumat pengguna lain, fungsi current_user_can() dipanggil dan kemudian memastikan bahawa hanya pengguna istimewa boleh melakukan operasi ini. Contoh panggilan fungsi Current_user_can():
$target_user_id= $_GET['target_user_id'];if(current_user_can('edit_user',$target_user_id)) { edit_user($target_user_id);}
Logik pengesahan panggilan adalah seperti berikut: Pengguna ini ingin menggunakan ID $target_user_id untuk mengubah suai pengguna tertentu Adakah dia mempunyai kebenaran untuk melaksanakan?
Di bawah konfigurasi lalai, fungsi edit_users membenarkan pengguna dengan kebenaran (seperti pentadbir kedai) untuk mengedit pengguna lain, malah pengguna pentadbir, dan kemudian melakukan operasi seperti kemas kini kata laluan. Atas sebab keselamatan, WooCommerce perlu menentukan sama ada pentadbir kedai boleh mengedit pengguna, jadi pemalam perlu menambah kebenaran meta. Fungsi meta boleh dipanggil oleh current_user_can(). Nilai yang dikembalikan oleh fungsi di bawah tingkah laku lalai adalah benar, tetapi nilai yang dikembalikan oleh fungsi kebenaran meta boleh menentukan sama ada pengguna semasa boleh melakukan operasi sedemikian. Berikut ialah kod fungsi abstrak penapis kebenaran meta WooCommerce:
function disallow_editing_of_admins( $capability, $target_user_id ) { // If the user is an admin return false anddisallow the action if($capability == "edit_user"&& user_is_admin($target_user_id)) { return false; } else { return true; }}add_filter('map_meta_cap', 'disallow_editing_of_admins');
Sebagai contoh, apabila current_user_can('edit_user', 1) dipanggil, penapis akan menentukan bahawa ID ialah 1 ($target_user_id) Sama ada pengguna ialah pentadbir, dan berdasarkan keputusan, tentukan sama ada untuk membenarkan pengguna beroperasi.
Secara lalai, hanya pentadbir boleh melumpuhkan pemalam. Walau bagaimanapun, kelemahan ini membolehkan pentadbir kedai memadamkan sebarang fail boleh tulis pada pelayan, jadi kami boleh menghalang WordPress daripada memuatkan pemalam dengan memadam fail utama WooCommerce-woocommerce.php.
Kerentanan pemadaman fail ini wujud dalam fungsi pengelogan WooCommerce Log akan disimpan dalam direktori kandungan wp dalam bentuk fail .log. Apabila pentadbir kedai ingin memadamkan fail log, dia perlu menyerahkan nama fail sebagai parameter GET. Coretan kod yang ditunjukkan di bawah ialah bahagian yang terdedah:
class WC_Admin_Status{ public static function remove_log() { ⋮ $log_handler = newWC_Log_Handler_File(); $log_handler->remove(wp_unslash($_REQUEST['handle']));}
class WC_Log_Handler_File extends WC_Log_Handler{ public function remove($handle) { ⋮ $file = trailingslashit(WC_LOG_DIR) .$handle; ⋮unlink($file);
Masalahnya di sini ialah nama fail ($handle) akan ditambahkan pada direktori log (wp-content/wc-logs/) dan kemudian diserahkan kepada unlink( ) fungsi. Apabila menetapkan "$handle../../plugins/woocommerce-3.4.5/woocommerce.php", failkan wp-content/wc-logs/../../plugins/woocommerce-3.4.5/woocommerce php akan dialih keluar dan menyebabkan WooCommerce dilumpuhkan.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kelemahan pemadaman fail sewenang-wenangnya dalam pemalam WordPress WooCommerce. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!